theme: orange
本文正在参加「金石计划」
接上文OpenAI Embedding:快速实现聊天机器人(一)有讲到聊天机器人的一些概念,这篇开始讲讲这个聊天机器人的架构和流程。
总架构图
这里我参照一个现成的架构图来讲如何实现,其是基于Azure多个相关云服务实现的Q\&A问答系统(Azure OpenAI Embeddings QnA)。
在这个场景中,Azure OpenAI 服务从文档中创建嵌入向量Embedding。为了回答用户的问题,它检索最相关的文档,然后使用 GPT-3
提取问题对应匹配答案。
知识数据准备
从Knowledge Base
到 Azure Translator
整个流程都是在讲如何处理知识数据,最终得到多条合理大小长度以及逻辑自洽的文本。需要注意的是在流程中额外用到了Azure 提供的认知服务和翻译服务,咱们不用关心。在实践过程中,记住一点,最初你手上有大量长短不一相关业务的知识文本,咱们要想办法预处理。包括控制文本长度、移除不必要的标点符号、用滑动窗口算法增加文本之间的关联性。
用滑动窗口算法增加文本之间的关联性,即增加上下文关系。可能有些朋友不清楚,举个例子,下面我用苏轼的诗句《赏花归》来解释下:
赏花归去马如飞, 去马如飞酒力微。 酒力微醒时已暮, 醒时已暮赏花归。
该后一句诗的前四个字,是对前一句最后四个字的重复,最后一句的最后四个字,又是对第一句前四个字的重复,这样便上下承接,前后关联。咱们即使将这句诗拆成四句分别去计算Embedding向量,但是GPT在处理文本关系的时候仍然能够将其关联起来,其在后面的章节fine-tuning 模型训练时特别有用。
核心Embedding存储和搜索
图上这块就是咱们要讲的的核心,使用上面预处理的文本得到的文本集合,分别使用Azure OpenAI Service
的text-embedding-ada-002
模型,将每个文本转化为一个1536维的Embedding向量,并存储在Redis数据库中。
需要特别注意的是,此Redis数据库除了具备自身缓存的能力外,还额外安装了Redis Search Module,以支持使用数据时的向量相似度搜索。如果你不想使用Redis,还可以选择Postgresql;甚至你可以选择在存储在csv中,当需要向量相似度搜索时,将数据加载到内存中,然后使用一些库函数,比如余弦相似度算法进行遍历后比较查询。
用户提出问题和获取答案
最后一块流程是用户的使用场景。用户提出问题,使用Azure Embedding 模型将问题转换成Embedding 向量,然后到 Redis 数据库进行相似度查询,返回Top K最相似的文本,再加上原始问题构建一个新的Prompt,使用Azure OpenAI
的GPT-3.5/Text-davinci
模型进行文本加工和提炼,用户便能得到最贴切的答案。
构建出的新Prompt的格式参考如下:\ text1,text2...textK。基于上面的内容,假如你是一个智能客服xx,请回答问题:question?
提示:虽然上面提到的是Azure OpenAI
,没有讲到原生的OpenAI
,但实际上两者在本质上并无区别,只是Azure OpenAI在合规安全、企业级解决方案等方面更加完善些。我在后面的章节将会持续使用Azure OpenAI来完成例子的讲解。