AI如果不是已经、也正在成为一个新的风口。有的人说,ChatGPT的推出,是一个新的“iPhone时刻”;有的人说,现在有三分之一的人正在AI创业,有三分之一的人正在想如何用AI创业,还有三分之一的人准备为前两者投资。中央在4月28日开会,还明确提出“要重视通用人工智能发展,营造创新生态,重视防范风险”。人工智能技术已经成为每个人都不能回避的一个机会和挑战。
ChatGPT实际上是OpenAI公司基于GPT-3.5大语言模型的一个聊天应用。这个模型并没有开源,所以只能通过OpenAI公司提供的API去利用这个模型的能力。不过,我认为这也是未来AI产业的必然。基础设施如算力、模型、数据被各种大厂垄断,小玩家估计也没有实力参与。中小企业只能在垂直细分领域研究特定的应用,来使用人工智能。
公司Bot:介绍公司和产品的聊天机器人
作为一种大语言模型,GPT-3.5最适合直接应用的场景还是聊天机器人。比如,在客服系统增加一个专业知识的聊天机器人,能够及时准确地回答客户的问题,又或者,在公司网站上,用这种技术为来访者介绍公司或产品。正好五一小假期,我做了一个小小的尝试,利用一家公司介绍和产品文档做了一个这样一个聊天机器人。
在正式开始前,我已经测试了OpenAI公司的API,阅读了相应的文档和示例代码,所以,技术路线并不复杂。主要分三步:
第一,采用OpenAI提供的Embedding API来初始化本地知识库,将向量化后的数据存到向量数据库。
第二,利用该API对用户的问题进行向量化,再从向量数据库中搜索到匹配的本地知识。
第三,将本地知识和用户问题一并发给Chat API,由GPT-3.5统一返回回答。
很简单,是不是?
下面分步骤说明:
第一,采用OpenAI提供的Embedding API来初始化本地知识库,将向量化后的数据存到向量数据库。
这里有个小技巧,因为OpenAI API有限流(特别是对测试账号),因此,可以增加一个限流器以控制调用API的速度,就像上面代码中通过tenacity做限流一样。否则,系统调用OpenAI API时会报超过限流错误。
第二,利用该API对用户的问题进行向量化,再从向量数据库中搜索到匹配的本地知识。
第三,将本地知识和用户问题一并发给Chat API,由GPT-3.5统一返回回答。
以上过程其实都不复杂,不过准备数据需要费点心。主要的技术栈包括两点:
OpenAI API:Embedding API、Chat API向量数据库:Redis Search关于如何应用本地数据的延伸知识点
OpenAI提供另一种方法叫fine-tuning,即把本地知识按照一定格式打包上传到OpenAI进行训练,基于OpenAI提供的模型生成一个用户自己的模型。这种方法需要上传数据到OpenAI,有数据安全的问题。另外,fine-tuning在数据准备方面要求更高,可能实际效果也有限,所以,在OpenAI Cookbook中似乎更推崇采用embedding方法。
那么什么是embedding方法呢?简单说,这是一种文本搜索技术。通常,我们有三种方法搜索一个文本内容:
1. 词汇级搜索(Lexical-based search):这是传统的基于关键词的搜索。它通过匹配搜索查询中的词汇与文本文档中的词汇来进行搜索。例如完全匹配、子集匹配、模糊匹配等。这种搜索依赖文本中的词汇级信息。
2. 基于图的搜索(Graph-based search):这种技术将文本建模为图,其中节点表示词汇/短语,边表示相邻关系、依赖关系、语义相似性等。搜索通过遍历这个图来找到相关文档。例如PageRank、HITS等。这利用词汇/短语之间的链接结构来找到最重要/相关的内容。
3. 嵌入式搜索(Embedding-based search):这种技术利用词嵌入(词语的向量表示)将文本文档和搜索查询表示为连续向量空间中的点。找到相关文档是基于文档嵌入与查询嵌入在那个空间中的距离/相似度。例如语义搜索、神经搜索等。这允许搜索超越精确的关键词匹配,找到与搜索查询语义相关的概念/话题。
一般来说,
词汇搜索注重表面级的关键词匹配。基于图的搜索利用词汇/短语之间的链接结构来找到重要内容。嵌入式搜索将词汇/文档嵌入语义空间中,以启用语义搜索。现代搜索引擎通常结合多种技术来提供强大和精细的搜索功能。
OpenAI就是通过对文本进行向量分析,建立了一个由大约1500个维度组成的语义向量,通过比较不同文本向量之间的距离,选择出最接近的那个来组合生成答案。
打个比方,假设要在一堆文本记录中搜索“老鼠偷食物”,如果采用普通的词汇搜索,你只能去匹配“老鼠”、“食物”这样的关键字,但如果采用嵌入式搜索,那么就可以搜索出“奶酪饼干”这样的内容。因为后者和前者在语义空间上接近。
难点
实际测试后,可以发现要训练一个专业的聊天机器人还是存在很多困难:
第一是中英文的差异。我的体会是GPT-3.5对于中文的处理明显弱于英文,偏差还是很大。英文的匹配度基本上能够达到0.8以上,而中文往往低于0.8,造成无法定位准确的答案。
第二是数据的组织方式。同样一篇文章,怎么进行分割,作为原始数据喂给GPT-3.5,效果是不一样的,这个过程需要反复调校。甚至有点碰运气的成分。
第三就是如何组织问题和答案。GPT-3.5只能围绕自己知道的内容进行处理,超过这个内容,明显就会胡说八道。如何控制是个难点。
总的来看,OpenAI的厉害之处是找到了一种有效表征人类通用语言的语义空间结构。以此为基础,计算机人工智能就能在一定程度上理解人类世界,并发挥前所未有的作用。
最后,这只是个原型,因为原始数据有限,且没有经过调校,所以常常会答非所问,胡编乱造。就还是蛮有趣的:)