首页 文章 精选 留言 我的

精选列表

搜索[Markdown改进],共10000篇文章
优秀的个人博客,低调大师

MySQL8.0 - 新特性 - 安全及权限相关改进

MySQL8.0里引入了不少关于权限的改动,从这些改动可以看出来,权限管理更加的规范和遍历了,这和我们之前为rds mysql增加了大量权限管理很类似,想来Oracle也是通过这些改动为其云业务服务的吧。 本文主要简述下部分相关的权限改动,不会涉及代码实现部分。当前版本为8.0.16 Atomic ACL Statement 由于实现了新的数据词典表,所有的权限相关的信息都存储在innodb mysql tablespace里。而innodb是事务性引擎,具有ACID特性,所以对应的ACL操作也具有原子特性。 例如之前如果一个语句对多个user操作的时候,有些成功,有些会失败。而现在则是要么全部成功,要么全部失败。binlog也会在事务提交时记录到redo log里。 这里有个问题是当我们通过搭建备库的方式从5.7升级到8.0时,那些在5.7部分成功的acl操作,到了以8.0作为备库的实例上会全部失败. 关于atomic ddl 见官方文档 Role Role是一个期待已久的功能,可以认为是一组权限的集合, 你可以为多个账户赋予相同的role权限,这也使得权限的管理更加规范,大大方便了运维和管理。你可以通过 create role 'role_name' 创建一个role名,然后再通过grant语句为role赋予权限。之后就可以grant 'role_name' to 一个指定的账户了。 关于role,之前写了一篇文章介绍了,这里不再赘述,感兴趣的点链接 参考: 官方文档 connection control plugin 引入了一个新的插件,代码在plugin/connection_control/下,该插件使用的是audit plugin接口,其功能是在数次登陆失败后,会延迟下次登陆的时间,这也有点类似于多次密码输入错误,会被冻结一会的意思。 在lib/plugin目录下,我们已经编译好了插件connection_control.so,安装也比较简单: mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so'; Query OK, 0 rows affected (0.01 sec) mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so'; Query OK, 0 rows affected (0.03 sec) mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%'\G *************************** 1. row *************************** PLUGIN_NAME: CONNECTION_CONTROL PLUGIN_STATUS: ACTIVE *************************** 2. row *************************** PLUGIN_NAME: CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS PLUGIN_STATUS: ACTIVE 2 rows in set (0.00 sec) mysql> SHOW VARIABLES LIKE '%connection%control%'; +-------------------------------------------------+------------+ | Variable_name | Value | +-------------------------------------------------+------------+ | connection_control_failed_connections_threshold | 3 | | connection_control_max_connection_delay | 2147483647 | | connection_control_min_connection_delay | 1000 | +-------------------------------------------------+------------+ 3 rows in set (0.00 sec) 如何使用: connection_control_failed_connections_threshold: 允许失败的次数,在这么多次失败后,会去增加delay的时间(设置为0则表示关闭该特性,不会去增加延迟) 当超出失败上限后,就根据之后失败的测试乘以connection_control_min_connection_delay作为delay时间,但最大不超过connection_control_max_connection_delay, 以默认配置为例子,当第四次失败时是1000毫秒,当第五次失败时就加倍到2000毫秒 官方文档 支持双重密码 这也是个有趣的特性,意思是支持一个账户两个密码,这通常发生在你修改了密码,但又不想导致正在运行的业务中断时。如worklog所述,当你有大规模的复制集群时,又想修改复制密码,当然不希望正在进行的复制中断拉。那怎么办,可以在保持两个密码在一段时间内都是有效的。用法也比较简单,我们举个简单的例子: root@test 10:07:00>CREATE USER arthurdent@localhost IDENTIFIED WITH 'mysql_native_password' BY 'abcd'; Query OK, 0 rows affected (0.00 sec) # 再创建一个密码,同时保持当前密码 root@test 10:07:02>ALTER USER arthurdent@localhost IDENTIFIED BY 'efgh' RETAIN CURRENT PASSWORD; Query OK, 0 rows affected (0.01 sec) #再创建一个密码,同时保持当前密码,但是第一个创建的密码abcd就失效了 root@test 10:07:18>ALTER USER arthurdent@localhost IDENTIFIED BY 'efghh' RETAIN CURRENT PASSWORD; Query OK, 0 rows affected (0.01 sec) 如果要抛弃旧密码,可以执行如下语句 root@test 10:11:36>ALTER USER arthurdent@localhost DISCARD OLD PASSWORD; Query OK, 0 rows affected (0.00 sec) 此时你再通过旧密码efgh就无法成功登录了。 mysql.user表被扩展了来存储两个密码,主密码存储在mysql.user.authentication_string中,次要密码存储在mysql.user.user_attributes中 root@test 10:31:36>select user, authentication_string, user_attributes from mysql.user where user = 'arthurdent'\G *************************** 1. row *************************** user: arthurdent authentication_string: *7538919BBFC125D3F772537519E66F8242CD2E6B user_attributes: {"additional_password": "*1ACFAF7821CBE8E2D6B7C3FA1A539F53CB41BB9D"} 1 row in set (0.00 sec) 除了ALTER USER外,SET PASSWORD也支持类似的语法: SET PASSWORD [FOR user] = 'auth_string' [REPLACE 'current_auth_string'] [RETAIN CURRENT PASSWORD] 参考文档: WL#11540: Support 2 active passwords per user account Partial Revoker 在之前如果你有create user权限,相应的也有了drop/create/modify任何账户的权限,包括root账户。 如果用户有delete/update权限的话,甚至还可以修改grant系统表, 因为有的时候我们需要把部分权限revoke掉 worklog举了个例子,这里直接列出来啦: mysql@root> CREATE USER foo; mysql@root> GRANT CREATE USER,UPDATE,DELETE ON *.* TO foo WITH GRANT OPTION; mysql@root> GRANT SELECT ON mysql.* TO foo with grant option; Now, foo has the ability to do the following: mysql@foo>CREATE USER bar; mysql@foo>ALTER USER root@localhost IDENTIFIED BY 'gibberish'; mysql@foo>DROP USER root@localhost; mysql@foo>DELETE FROM mysql.user WHERE user = 'root'; mysql@foo>UPDATE mysql.user SET authentication_string = 'gibberish' WHERE user='root'; 如上例,当foo用户有了由root账户赋予的grant权限,他甚至可以去操作root账户。这个worklog的目的,就确保foo用户无法对root账户进行操作。 这个worklog把权限定义为三类: - Global Privileges: DDL/DML privileges that allow object manipulation on all databases. This includes administrative privileges, dynamic privileges. - Database Privileges: Restricted to a one (or more) databases. They provide ability to manipulate objects and data within database. - Restrictions_list: List of tuples - (user, database, privileges). Each entry in the list represents operations prohibited on a given database for given user. Restrictions list implies that even if user is granted GLOBAL privileges, if revocation list prevents the operation, user can not perform it for given database. 其中restrictions_list存储在mysql.user表中,主要是引入Partial revoke, 可以revoke部分库上的权限,例如mysql库,这实际上对于云业务而言是非常重要的功能:用户通常希望拥有超级权限,但云平台本身也有保留的账号做维护用,这些我们是不希望被修改的,举个简单的例子: root@(none) 09:26:43>CREATE USER foo; Query OK, 0 rows affected (0.00 sec) root@(none) 09:26:49>GRANT ALL ON *.* TO foo; Query OK, 0 rows affected (0.00 sec) root@(none) 09:27:00>SET GLOBAL partial_revokes = 0; Query OK, 0 rows affected (0.00 sec) root@(none) 09:27:05>REVOKE INSERT ON mysql.* FROM foo; ERROR 1141 (42000): There is no such grant defined for user 'foo' on host '%' root@(none) 09:27:12>SET GLOBAL partial_revokes = 1; Query OK, 0 rows affected (0.00 sec) root@(none) 09:27:14>REVOKE INSERT ON mysql.* FROM foo; Query OK, 0 rows affected (0.00 sec) root@(none) 09:27:24>REVOKE DELETE ON mysql.* FROM foo; Query OK, 0 rows affected (0.00 sec) 这里引入了一个全局参数partial_revokes, 只有打开了,你才能对账户做partial revoke操作,这里会产生一个对该账户的限制列表,存储在mysql库中: root@(none) 09:29:08>select user, authentication_string, user_attributes from mysql.user where user = 'foo'\G *************************** 1. row *************************** user: foo authentication_string: user_attributes: {"Restrictions": [{"Database": "mysql", "Privileges": ["INSERT", "DELETE"]}]} 1 row in set (0.00 sec) 可以看到针对该账户产生了一个限制列表Restrictions, 以json的形式存储。Partial Revoke的限制(摘自文档): Partial revokes must name the schema literally. Schema names that contain the % or _ SQL wildcard characters (for example, myschema%) are not permitted. It is possible to use partial revokes to place restrictions onnonexistent schemas, but only if the revoked privilege is granted globally. If a privilege is not granted globally, revoking it for a nonexistent schema produces an error. Partial revokes apply at theschema levelonly. You cannot use partial revokes for privileges that apply only globally (such as FILE or BINLOG_ADMIN), or for table, column, or routine privileges. 当一个有restrictions list的账户再去创建别的账户时,他受限的列表也会传递出去 在wl#12098中还引入了system user这样的权限类型,只有相同权限的账户才能修改这种类型的账户,普通账户无权对其进行修改。在之后又在wl#12364中,避免拥有CONNECTION_ADMIN权限的普通用户能够去kill超级用户的session或者query: root@(none) 08:20:40>GRANT SYSTEM_USER ON *.* TO foo; Query OK, 0 rows affected (0.00 sec) root@(none) 08:20:54>GRANT SYSTEM_USER ON *.* TO bar; Query OK, 0 rows affected (0.01 sec) baz@(none) 08:27:38>GRANT CONNECTION_ADMIN ON *.* to baz; Query OK, 0 rows affected (0.00 sec) #login foo foo@(none) 08:27:10>show grants; +---------------------------------------+ | Grants for foo@% | +---------------------------------------+ | GRANT USAGE ON *.* TO `foo`@`%` | | GRANT SYSTEM_USER ON *.* TO `foo`@`%` | +---------------------------------------+ 2 rows in set (0.00 sec) foo@(none) 08:28:04>show processlist; +-----+------+-----------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+------+-----------+------+---------+------+----------+------------------+ | 348 | foo | localhost | NULL | Query | 0 | starting | show processlist | +-----+------+-----------+------+---------+------+----------+------------------+ 1 row in set (0.00 sec) #login baz baz@(none) 08:29:03>show grants; +--------------------------------------------+ | Grants for baz@% | +--------------------------------------------+ | GRANT USAGE ON *.* TO `baz`@`%` | | GRANT CONNECTION_ADMIN ON *.* TO `baz`@`%` | +--------------------------------------------+ 2 rows in set (0.00 sec) baz@(none) 08:29:05>show processlist; +-----+------+-----------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----+------+-----------+------+---------+------+----------+------------------+ | 349 | baz | localhost | NULL | Query | 0 | starting | show processlist | +-----+------+-----------+------+---------+------+----------+------------------+ 1 row in set (0.00 sec) #baz账户只能看到自己的线程,如果强制去kill foo呢 ? baz@(none) 08:30:30>kill 348; ERROR 1095 (HY000): You are not owner of thread 348 可以看到有connection_admin权限的账户被限制了,不仅无法看到system_user的链接,也无法去kill session. 简单来说,有system_user权限的账户可以修改system user和regular user的账户;而regular user则无法修改system user的账户 关于这块官方文档有非常详细的内容,笔者对这块也不太熟悉,就不多说了,感兴趣的直接翻阅如下文档吧: WL#12098: MySQL system users WL#12364: Kill administration for system users WL#12820: Extend GRANT syntax to cover partial revokes information Privilege Restriction Using Partial Revokes Account Categories Password Expiration 可以设置密码过期时间,提供了三种操作: 通过参数default_password_lifetime来控制 , 单位为天 root@(none) 09:21:31>SET PERSIST default_password_lifetime = 180; Query OK, 0 rows affected (0.00 sec) 该选项的值会被alter user覆盖 通过ALTER USER来控制 指定过期时间 CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; 过期时间存储在mysql.user表中 root@(none) 09:35:46>select user,password_lifetime from mysql.user where user = 'jeffrey'\G *************************** 1. row *************************** user: jeffrey password_lifetime: 90 1 row in set (0.00 sec) 禁止密码过期 CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER; 默认过期时间为default_password_lifetime: CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT; 直接手动过期 ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE; 参考: 官方文档 WL#6587 : Protocol support for password expiration 密码复用 现在很多系统在忘记密码重设时,都会要求最近几次使用付的密码不允许再次使用,这也是为了安全考虑,MySQL也增加了这样的功能,和密码过期类似,也可以通过全局变量,ALTER USER来控制: 例如如下配置: password_history=6 password_reuse_interval=365 表示不要服用最近6次用到的密码或者365天内用过的密码。 也可以通过create/alter user来设置: CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 5; ALTER USER 'jeffrey'@'localhost' PASSWORD HISTORY 5; CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 365 DAY; 同样的也可以把上例中的history 5 和 interval 365 day指定为default 参考: 官方文档 WL#6595: Password rotation policy 修改账户要求验证 同样是安全相关的,当修改一个账户时,需要去验证密码,可以使用参数password_require_current来控制。默认关闭,当打开该选项时,如果要修改账户密码,必须要提供当前的密码才允许修改,如下摘录的官方示例: 要求在修改时输入当前密码: CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT; 可选的输入当前密码(感觉有点多余...) CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL; 根据参数配置来决定: CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; 那么修改密码时就需要显示当前密码: CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; ALTER USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT; SET PASSWORD也一样. SET PASSWORD [FOR user] = password_option password_option : { 'auth_string' [REPLACE 'auth_string'] } 参考: 官方文档 WL#11544 Current password required for SET PASSWORD 限制SET PERSIST MySQL提供了在线持久化参数修改的功能,通过接口SET PERSIST 和SET PERSIST ONLY来实现,但有些涉及敏感信息的变量则不应该被persist, 因此不应该通过远程终端来管理,而是要管理员登录机器,手动的修改my.cnf 新增参数persist_only_admin_x509_subject , 当打开这个参数时,只有通过SSL认证的用户才能Persist一些受限的系统参数。官方文档列举了些可持久化的参数和不可持久化的参数 参考: 参数:persist_only_admin_x509_subject Nonpersistible and Persist-Restricted System Variables skip-grant-tables 用过的人的都知道,当以skip-grant-tables启动时候,系统将不检查任何权限,这是是很危险的,但有时候如果application和数据库实例部署在同一台机器时,我们又可以通过该选项来获得更好的性能,但带来的风险是其他人只要知道host和端口号,也可以远程连接过来,这就有数据安全问题 因此MySQL加入了新选项skip_networking,不再监听tcp/ip连接请求。 另外最近也修复了一个有趣的bug#94394,当mysql.user表损坏时,实例启动时仅仅打印了一条错误信息,并以skip-grant-tables的方式启动了。这实际上市不安全的,人们可能在install初始化阶段不小心忽略这个错误,而后数据库的正常运行,也会造成实例正确安装的错觉。 因此在8.0.16版本中,官方修复了这个问题,除非用户指定skip-grant-tables,实例将打印信息之后直接启动失败。 fk error不显示父表信息 这个修复很简单,就是说对父表没权限的用户,如果在子表上因为foreign key约束,导致错误的话,不应该将父表的信息暴露出来,这可能导致安全问题,而是返回统一的错误: ERROR 23000: Cannot add or update a child row: a foreign key constraint fails 参考: WL#8910: Ensure foreign key error does not reveal information about parent table for which user has no access privileges. SESSION_VARIABLES_ADMIN 通常任何账户都允许设置session级别的变量,但某些session级别的变量只能特定权限的用户设置,例如binlog_format, sql_log_bin,火鹤sql_log_off等,需要需要SYSTEM_VARIABLES_ADMIN或者SUPER权限来设置。 从MySQL8.0.14开始了增加了一个新的权限位session_variables_admin, wl#12217列出了一些需要该权限位的变量: The following vairables need to enforce SESSION_VARIABLES_ADMIN: auto_increment_increment auto_increment_offset binlog_direct_non_transactional_updates bulk_insert_buffer_size character_set_database character-set-filesystem collation_database pseudo_slave_mode pseudo_thread_id transaction_write_set_extraction rbr_exec_mode The following variables will not be protected: default_storage_engine default_tmp_storage_engine max_allowed_packet rand_seed1 rand_seed2 These variables should transition from checking SYSTEM_VARIABLES_ADMIN to SESSION_VARIABLES_ADMIN: histogram_generation_max_mem_size sql_log_off debug_sync original_commit_timestamp The not documented gtid_next The disabled and not documented gtid_next_list default_collation_for_utf8mb4 explicit_defaults_for_timestamp sql_log_bin explicit_defaults_for_timestamp The variable is mis-documented as not requiring SYSTEM_VARIABLES_ADMIN for SET SESSION. But in reality it does require it. Since the variable is deprecated we'll keep the current behavior. binlog_format binlog_row_image binlog_row_value_options binlog_rows_query_log_events 官方文档:SESSION_VARIABLES_ADMIN WL#12217: SESSION_VARIABLE_ADMIN 作者:zhaiwx_yinfeng 原文链接​ 本文为云栖社区原创内容,未经允许不得转载。

优秀的个人博客,低调大师

为改进搜索 Pinterest收购图片识别初创企业VisualGraph

Pinterest周一宣布,其已收购了图像识别及视觉搜索技术初创企业VisualGraph。 图:VisualGraph的图片识别技术可检测到人脸、身体、汽车及其他物体 VisualGraph成立于2013年,VisualGraph公司为一家二人公司,两名员工分别为Kevin Jing和David Liu,其中前者曾为谷歌前员工。VisualGraph的图片识别技术可识别图片上人脸、汽车、服装、纹理图案及人体的体貌特征。对于Pinterest来说,收购VisualGraph技术能够帮助Pinterest将用户贴图分门别类;反之,VisualGraph技术可帮助用户实现图片的精准搜索。 Pinterest的这一并购交易实为获得VisualGraph技术和人才。未来Kevin Jing和David Liu将加入到Pinterest的工程师团队,其中Kevin Jing将加入到Pinterest新的“视觉发现”团队。 Kevin Jing和David Liu在一份声明中表示:“我们感到十分激动,未来将有机会把机器视觉与人类视觉结合,创造兼具审美和实用功能的视觉发现体验。” Pinterest公司一位发言人称:“收购VisualGraph将有助于我们创建方便用户使用理解图片的技术。通过创建新技术,希望用户更加便捷的找到他们所喜欢的东西。”Pinterest发言人还称,VisualGraph已关闭了其原有向少数人开放的服务。 原文出处:科技行者 转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

优秀的个人博客,低调大师

智能客服成未来趋势,但当前体验还需改进

根据相关数据,国内客服市场已超千亿元,而作为未来趋势,尚处于萌芽期的智能客服还需多学习。 近日,易到用车关闭人工客服热线,采用人工智能客服一事让其再一次成为了舆论的热点,在这件事中,虽然其成为热点多是源于东家乐视的缘故,但我们也不能忽视智能客服这一新兴行业。 人力成本日渐上升,智能客服前景远大 早在人工智能发展起来之时,关于“人工智能将取代人类”的言论就一直未曾停歇。机器人写作、机器人作曲、无人驾驶汽车……随着人工智能技术的愈加先进,人们心中的忧虑也越来越大。 作为一项工作形式单一、工作内容重复性高的工作,客服的上手可谓相当容易,再加上人工客服人手的不足,而人力成本也日渐呈上升趋势,可以说,“人工智能”对其威胁性非常之大。 据网易云客服“网易七鱼”发布的《客服行业现状白皮书》称,在其采访企业中,31.5%的企业已经在使用智能客服系统,另有34.5%的受访企业也表示将在一年内引入智能客服系统。看这些数据,在表明智能客服取代人工客服趋势的同时,也向人们展示了智能客服市场的上升空间之大。 目前,为了应对每天大批量的用户,诸如淘宝、京东等电商以及银行、运营商等平台已经上线了智能客服。此外,除了内部消化,阿里巴巴、百度、网易等企业也在加码智能客服,其中,百度推出的“百度夜莺”刚在今年双十一前夕对外开放,以为更多的厂商提供智能客服服务。 技术有待提高,智能客服还差点火候 咬文嚼字不够智能 在解决用户的问题之前,人工智能首先要做的就是“咬文嚼字”,将用户的问题与知识库中的数据进行配对,从而找出问题的答案。在这其中,智能客服要想令人满意,有两点是必须要做好的: 提高自然语言处理。今天下午,镁客君也亲自上场体验了一把智能客服,包括百度糯米的糯娃、支付宝的安娜、京东的JIMI等多个客服。在与多个智能客服的交互过程中发现,有的智能客服需要你提出的问题与知识库中的问题一致,否则则无法回应,比如百度糯米的糯娃: 此外,对于提出的问题,有些人工智能机器人会要求用户采取简短的问题,有的虽没写明要求,但提出的问题也需要直截了当,不能有丝毫差错,比如前面的糯娃和网易严选的小选: 说白了,所谓的智能客服就是聊天机器人,只是交互要求没那么高,专业性要求更强一些。但是,对于智能客服而言,自然语言处理功能是不可缺少的,毕竟用户的表达方式多种多样,若是不能很好地进行自然语言处理,就不能正确理解用户的问题,又何谈为用户解决问题? 知识库尚需填充。在使用过程中,当用户提出问题,智能客服会将之与知识库中的数据进行配对,以找到类似的问题来提供答案。 正如网络安全一般,只有在病毒出现之后,网络安全团队才能根据它找到解决的办法。这样来说,在网络安全的防御战中,安全团队一直处于被动方,只能被动防御,无法主动发起攻击抵制新型病毒的入侵。而在智能客服,其知识库即相当于网络安全的病毒库,需要不断的更新才能为用户提供更好的服务。在此之前,智能客服所能解决的只是一些陈旧的问题,并不能应对人们提出的新问题。 不过,与病毒防御不同的是,智能客服的知识库是可以提前录入的,毕竟规章制度什么的都只是一些死东西,只需在发生变化时进行实时更新即可。因而,在此基础之上,智能客服的知识库还需加入更多全面的问题,以便其多加学习,提供优质服务。 用户接受度不高 据相关机构统计,国内整个客服的市场规模已经超过千亿。目前,在用户体验上,在线客服是企业使用率最高的客服系统,达到73.9%,呼叫中心使用率50.7%,而智能客服的使用率仅为31.5%。 在消费者的问题,其中八成以上都是一些高度重复的问题,只要知识库的数据足够全面,相信智能客服对问题的解决还是能够做到令用户满意的。在此之上,智能客服的使用率仅仅达到了31.5%,除开智能客服本身的一些缺陷,其中的很大原因要归于用户的接受度。 关于用户接受度的问题,其中主要关乎于两个原因。一个原因是用户本身的习惯,譬如镁客君,相对于智能客服的机械回答,我更喜欢与人工客服进行一对一的对接,虽然效率有时候会慢一点,但是在问题的解决上,人工客服能够做到更理解用户。另一个原因则归于其本身,由于其体验效果实在不能令人满意,从而逼得用户不得不放弃它。 在业界人士看来,目前智能客服的市场仍处于萌芽期,但已经站在了“风口”,必将成为未来一大趋势。与此同时,萌芽期也就意味着技术不是那么的成熟,服务不是那么的优质,因而,智能客服的发展空间还是很大的。 此后,伴随着人工智能技术的先进以及知识库的完善,再加以推广的话,相信智能客服的使用率将大大增加。当然了,鉴于智能客服当前的不完善,人工客服们暂时也不需要为自己的“饭碗”担忧,而在未来境况如何,最后还得看智能客服所提供的服务到了哪种程度。 原文发布时间: 2016-12-21 18:58 本文作者: 韩璐 本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册