关于前端:用明道云ChatGPTWeaviate挑战零代码1小时实现ChatPDF

4次阅读

共计 7586 个字符,预计需要花费 19 分钟才能阅读完成。

ChatGPT 流行起来之后,疾速的呈现了一批基于 ChatGPT 的工具利用,ChatPDF 就是其中比拟受欢迎的一款。它是一个能够让你与 PDF 文件进行对话的工具,既能够帮忙你疾速提取 PDF 文件中的信息,例如手册、论文、合同、书籍等;也能够依据你的问题,在 PDF 文件中寻找相干的段落,并用自然语言答复你。

ChatPDF 明天,咱们就用明道云 +ChatGPT+Weaviate 实战一下,1 个小时内来实现相似的性能。

需要梳理

咱们先形容一下最终成果:

对这个成果稍加剖析,不难看出,需要波及了两个解决阶段:

1. 将用户上传的 PDF 文件按页码进行拆分,并标注每一页的页码和内容详情;
2. 确保 ChatGPT 能够在用户发问时援用到这些 PDF 文件的内容,并在文件内容范畴内给出答复和援用地位;

其中第 1 点比拟容易,咱们能够应用能解决 PDF 文件的 Python 库或者 JS 库在代码块中实现,或者用一些现成的 OCR 接口来实现。在这个例子里,咱们将应用「百度智能云」的办公文档辨认 API 来解决 PDF 文件内容的分页文字提取 [1]。这个过程能够间接应用明道云「集成核心」中预封装的连贯,零代码就能实现,而后用工作表将文字辨认的后果存起来。

而对于第 2 点,对首次接触 ChatGPT 开发的敌人来说,有点难度。不过咱们能够将问题进行如下合成,并一一解决:

1. 怎么让 ChatGPT 在指定的文本内容范畴内答复问题?
2. 想要指定范畴的文本内容超级大,远远超过了 ChatGPT 的 token 数量限度,怎么办?
3. 如何在 ChatGPT 的答复里附加上被援用的 PDF 文件名称和页码?
4.向 ChatGPT 发问的内容超出了指定的文本内容范畴,如何返回相似「未找到答案」这样固定格局的回复?
解决了这些问题,这个需要天然也就没有任何阻碍了。接下来咱们来看看从实现原理上,如何让 ChatGPT 基于咱们的 PDF 集体知识库来答复问题,冲破以上限度。

技术原理

1. 怎么让 ChatGPT 在指定的文本内容范畴内答复问题?

要实现这个性能,重点在于编写和革新适合的 prompt 后再向 ChatGPT 发问。例如大家据说过的「角色扮演法」,让 ChatGPT 表演一个角色,基于 prompt 中给定的上下文背景再作答。其实,更激进一点,让它只能在给定的文本内抽取答案,这个性能就实现了。比方上面的例子:

chatGPT 在上下文中回复

这里应用了一个 prompt 模板,代入上下文 (context) 和问题(question),ChatGPT 将基于上下文来进行回复:

You are a useful assistant for provide professional customer question answering. You can refer to the context to respond to user questions. Must reply using the language used in the user's question. 
Context: {context}
Question: {question}

咱们能够用一个简略的流程图来示意这种组合形式:

如果问题在上下文里没有找到答案,ChatGPT 也会进行简略的「回绝性」回复:

chatGPT 上下文中未找到答案时的回复

看得出来,ChatGPT 即便没有找到答案,也会进行很人性化的回复。如果只是和用户进行聊天式的对话,这样也够用了。然而如果想在上下文中没有找到答案时进行下一步操作,例如调用搜索引擎或者将问题标注为「答案缺失」,这样的答复还无奈满足咱们的需要。对于这个问题,咱们将在前面解决它。

这只是一个简略的 prompt 模板示例,咱们还能够一直地对 prompt 进行批改和调整,并屡次测试,直到 ChatGPT 的回复能够满足咱们的需要为止。

2. 想要指定范畴的文本内容超级大,远远超过了 ChatGPT 的 token 数量限度,怎么办?
解决了上一个问题,咱们仿佛找到了让 ChatGPT 在 PDF 文件内容范畴内答复问题的办法。那么,是不是咱们将整个 PDF 文件的内容作为 context 传给 ChatGPT,就能让它基于 PDF 文件来回复咱们的问题了?

是的,就像你晓得的那样,答案是不太行。起因在于咱们应用 ChatGPT 提供的 API 接口时,有严格的 token 数量限度(token 数量是 ChatGPT 按申请内容字数计费的规范,通常来说,一个英文单词计为 1 个 token,而一个中文字符大概计为 1 个 token [2],感觉略坑吧,这也是倡议大家尽量应用英文的起因之一):咱们罕用的 GPT-3.5 接口,申请时最大反对 4096 个 token,这包含了发问和答复的所有字符;就算是价格贵几十倍的 GPT-4,最大反对也不过 3 万 2 千个 token。

因而,咱们须要一种既能缩小 context 的文字数量,又让它蕴含尽量精确的上下文信息的办法。这种办法就是「文本相似性搜寻」。

文本相似性搜寻基于两个技术:文本嵌入(Text Embedding)和余弦类似度(Cosine Similarity)搜寻。

简略来说,就是用文本嵌入技术将自然语言转换成一个高维度空间的数值向量(Vector),这个转换的后果是通过大量的神经网络模型训练来取得的,能够保留文本转成向量后的语义关系 [3]。也就是说,意思越相近的两个词,它们在向量空间里的地位就越靠近,而且它还是兼容多种语言的。比方,世界上所有语言的「你好」,转换成向量后,它们的数值简直是相等的。

最初,把要搜寻的文本转成向量后应用余弦类似度搜寻向量数据库(Vector Database),就能够失去按语义类似度排序之后的后果——这个后果通常有两个指标:间隔(Distance)和类似确定性(Similar Certainty),它们的值都在 0 - 1 之间,越类似的后果,间隔值越小、类似确定性值越大。有也一些数据库搜寻后果中间接给出了一个类似度评分(Score),意思也都差不多。

咱们把 PDF 文件按页拆分后,就能够用文本相似性搜寻先搜寻到和发问的语义最靠近的那一页,而后只把那一页的文本作为 context 组合到 prompt 里传给 ChatGPT,这样就能达到咱们想要的成果了。

加上这个过程后,把下面的流程图稍加革新示意一下新的流程:

其中的向量数据库有很多种抉择,本示例里应用的是 Weaviate(Cloud 版本),因为它不仅内置了 OpenAI 的文本嵌入 (Text Embedding) 接口能够在用户无感知的状况下执行文本转向量,还提供了十分欠缺的 REST API。明道星散成中心里也曾经预置了 Weaviate 的 API,能够零代码间接应用。

3. 如何在 ChatGPT 的答复里附加上被援用的 PDF 文件名称和页码?

要在答案里附加上 PDF 的信息,有两种办法:

第一种是把 PDF 文件名称和页码,都组合到 prompt 外面,并批改 prompt 让 ChatGPT 在回复时给出文件和页码信息;第二种就是咱们在组合 prompt 前就把向量数据库里返回的排名最高的 PDF 文件和页码拿到,间接组合到最终输入给用户的答案中。

ChatPDF 应用的是第一种,在这个例子里,咱们采纳第二种,流程图批改如下:

4. 向 ChatGPT 发问的内容超出了指定的文本内容范畴,如何返回相似「未找到答案」这样固定格局的回复?

方才咱们说过了,即使不特地解决,在 prompt 的束缚下,ChatGPT 也不会胡乱给一个答案凑数,尤其是在申请时 temperature 参数设置为 0 的时候(该参数用于调节 ChatGPT 输入后果的确定性,值在 0 - 2 之间,值越大后果越随机也越有创意)[4]。但如果要想一个格式化的答案,咱们则要另想办法。

在下面从向量数据库进行相似性搜寻的时候,咱们曾经晓得搜寻的后果会依照类似度进行排序,并且会给出搜寻后果的类似确定性值。那么,咱们就能够为类似确定性设置一个阈值,大于这个值的后果,咱们认为它合乎咱们对类似度的定义,其后果能够被用作上下文组合到 prompt 里;而小于这个值的后果,咱们认为它的类似度还不够,即使把它作为上下文组合到 prompt 里,用户也可能失去驴唇不对马嘴的答案。

按这个规定,如果没有搜寻到合乎类似度的后果,那咱们就不必再向 ChatGPT 发问了,间接向用户返回「未找到答案」即可。当然,这个阈值要通过屡次测试,找到一个平衡点。在这个例子里,咱们假如 90% 类似的后果才有用,所以把这个阈值设为 0.9,所有类似度搜寻后果的类似确定性值小于 0.9 的,咱们就认为它的类似度不够,找不到答案。

咱们最终的流程图批改如下:

实现过程

一、工具筹备

  • 明道云专业版账号或公有部署版(https://mingdao.com 收费注册体验 14 天专业版,公有部署版须要能拜访公网及 OpenAI 接口)
  • 百度智能云开发者账号(https://cloud.baidu.com/ 实名认证后可申请文字辨认收费次数)
  • Weaviate Cloud 账号或装置本地版(https://weaviate.io/ 收费注册体验 14 天,本地部署须要有公网地址且能够拜访 OpenAI 接口)
  • OpenAI API Key(https://platform.openai.com/account/api-keys 须要应用 embedding 接口)

二、PDF 文档解决

咱们先在明道云里实现上传 PDF 文件后将文档分页辨认,把文字辨认后果存储到工作表内,并将内容转换成向量存储到向量数据库。这里的实现思路分成以下几个步骤:
用户上传 PDF 文件到明道云工作表;

  1. 上传实现后主动触发工作流,调用百度文档辨认 API 逐页辨认文字;
  2. 所有页码解决实现后,主动将所有页面的内容批量上传至向量数据库 Weaviate(须要先创立汇合,上传内容时 Weaviate 会主动调用 OpenAI 的 Embedding 接口执行文本转向量);
  3. 当工作表里的文字内容有变动时,主动同步到向量数据库;
  4. 当工作表里的 PDF 文档被删除或者某一页的内容被删除时,主动删除向量数据库里对应的内容;

2.1 创立向量数据库汇合

要实现文本相似性搜寻,咱们必须要先把文本转成向量存储到向量数据库,而后再用文本的向量进行搜寻。注册好 Weaviate Cloud Services 账号,创立一个收费的沙盒环境 [5]。创立实现后,会主动生成 Cluster URL,这个地址咱们等一下会用到;如果创立时开启了认证(Authentication),则须要把认证信息中的 Admin API Key 也复制下来(下图中的钥匙图标处)。

创立好的 Weaviate Cluster

接下来在明道云创立一个利用,在集成中心里搜寻 Weaviate,装置连贯后填写好上一步取得的 API Key 和 Cluster URL,并受权到刚刚创立的利用。还须要在连贯参数里配置好 OpenAI 的 API Key,上传数据到向量数据库时会用到。

在明道星散成核心装置 Weaviate

明道云把 Weaviate 的 API 做了比拟深度的封装,提供了一个「创立简略汇合」的 API,只须要传入汇合名称和阐明,就能够创立一个有「题目」、「内容」、「URL」、「拥有者」四个字段的汇合,其中的「题目」和「内容」参加向量搜寻,「URL」和「拥有者」仅做为数据存储。在应用「用向量搜寻类似数据」API 时,将严格依照传入的「拥有者」参数进行筛选,用于用户数据隔离。

咱们在明道云里创立一个治理汇合的工作表,并建设新增和删除工作表时主动触发工作流,创立和删除 Weaviate 上的汇合。

工作表:模型向量汇合

为了便于扩大,这里设计的是一个通用的模型汇合。ChatPDF 只是其中的一个模型,咱们把 prompt 模板、搜寻后果数量限度和类似确定性限度都参数化,便于当前咱们用于其它业务场景。因为汇合创立后不能批改,所以咱们须要为工作表设置「业务规定」,限度汇合创立后,不能批改名称和阐明。

业务规定

这里的自动化工作流内容比较简单,外面只有「调用已集成 API」节点,向 Weaviate 发动对应的申请。

自动化工作流:主动创立和删除 Weaviate 汇合

创立实现后,向工作表增加一条数据,Weaviate 上也会新增一个汇合。

创立好的汇合

2.2 辨认 PDF 文档
咱们在明道云里创立两张工作表用于寄存文档资料:「主文档」、「文档内容明细」。其中,「文档内容明细」是「主文档」的子表,前者寄存的内容与向量数据库中寄存的内容是一一对应的,所以它的构造也是依照向量数据库的字段构造来设计的;后者次要用于寄存用户上传的 PDF 文档。

工作表:主文档(主表)

工作表:文档内容明细(子表)

主表关联了「模型向量汇合」表,子表用文本存储汇合名称,它们的默认值都设置为刚刚创立的「ChatPDF」汇合。而后咱们须要为这两张工作表增加自动化工作流,在用户上传文件后主动实现文字辨认和上传到 Weaviate 的动作。

在开始搭建工作流之前,还须要在「集成核心」里装置「百度云办公文档辨认」的 API,并在连贯里配置好百度云的 API Key 和 Secret Key 等信息。

在集成核心装置 PDF 辨认 API

在解决 PDF 文字辨认的工作流中,有一个循环调用文字辨认接口解决 PDF 文档每个页面辨认后果的过程,因为文字辨认接口有并发申请量的限度,咱们能够在工作流里增加「逐条执行」的「子流程」或者「封装业务流程」来实现,为了复用性,咱们这里采纳了「封装业务流程」——它就像一个自定义封装的「函数(Function)」,没有固定的触发器,只有输出和输入参数,能够在任意地位被其余工作流调用 [6]。

应用封装业务流程解决分页文字辨认

在所有页面的文字辨认实现后,咱们会调用 Weaviate 的批量上传 API 一次性把所有后果都上传到向量数据库(必须配置好 OpenAI API Key)。接着还要解决一下更新和删除的逻辑,当手动更新和删除文档内容明细的数据时,要及时的同步到向量数据库中。

实现 PDF 辨认步骤后的自动化工作流

至此,PDF 文档的解决步骤就实现了。用户上传 PDF 文件后,会主动实现分页、辨认和上传动作。

PDF 文档解决实现示例

Weaviate 控制台查问后果

三、向 ChatGPT 发问

在开发基于 ChatGPT 的问答利用时,最容易被用户承受的还是对话式的聊天 UI。所以用明道云实现 ChatPDF,能够间接基于它的内置 IM 工具来做。我用明道云做集体知识库时,就是基于这个 IM 做了一个「AI 小助手」,也集成了明天讲的这个模拟 ChatPDF 模型进来,成果还是很不错的:

把 chatGPT AI 助手集成到明道云 IM

不过明天只是实现一个在 1 小时能够零代码实现的小 Demo,咱们就不必集成到 IM 里了,不然这篇文章可能 1 万字收不住了,咱们间接用工作表来实现简略的发问成果。如果想和我一样集成到 IM 聊天工具中,能够自行钻研一下明道云开放平台中对于解决聊天音讯的一些 API 接口 [7]。当然,同样的思路集成在钉钉或者企业微信的机器人上也是能够的。

3.1 组合 prompt

组合 ChatPDF 可用的 prompt,是咱们这个流程的外围局部。咱们先设计一个工作表用来寄存用户的问题和 AI 的回复,并用工作流实现主动生成对应 prompt。

工作表:发问 & 答复

在创立工作流之前,还要去集成核心装置一下「ChatGPT」的 API,因为咱们要用到其中的文本嵌入接口把问题转成向量,进而用它去向量数据库中搜寻语义最类似的页面内容,最初还要用它的 chat 接口进行发问。咱们抉择封装好的「一问一答」和「生成文本嵌入向量」API 进行装置。

到集成核心装置 ChatGPT API

这一部分的工作流其实也很简略,触发器设置为当工作表在新增或者更新时,如果「问题」字段有值则主动执行。流程中须要调用不同的集成 API,再依据返回后果执行不同的分支。我这里为了记录下每个步骤的后果,多加了一些把申请后果更新到工作表存储起来的步骤,利用搭建好了之后它们都是能够删除的。

自动化工作流:生成 Prompt

你能够往工作表增加问题进行测试了,失常状况下,如果有答案,它会生成 Prompt,没有答案时会生成未找到答案的回复信息。

3.2 申请 ChatGPT 并组合回复后果

1 个小时所剩无多,马上就到了要验收咱们成绩的时候了。这个步骤只须要在上一个工作流的有搜寻后果分支内加上一个向 ChatGPT 的申请,而后在拿到 AI 回复的返回值后把 PDF 信息拼接进去就 OK 啦。

对于知识库的问答,通常采样温度 (temperature) 设置为 0 会失去更精确的回复

组合最终回复并更新到记录中

好了,当咱们再次在工作表新建一条记录,提出问题后,稍等工作流运行结束,就能够失去咱们想要的答案了。你也能够将发问和答复的过程傅「封装业务流程」实现,再将这个流程凋谢为 API,这样你在明道云平台之外,也能够应用这个能力了。上面是在记录详情中展现的最终成果:

用工作表展现 ChatPDF 发问成果

写在最初

咱们尽管用明道云疾速地搭建了一个 ChatPDF,但我置信你也看进去了,咱们从头至尾设计的都是一个通用框架,而 PDF 文档的剖析只是它的其中一个利用场景。把握了原理了之后,你能够在这个利用里释怀的玩你感兴趣的其余基于本身业务内容的场景,测试和调整你的 prompt 模板,做出令人惊艳的成绩。在这个例子里,你能够尝试一次性取 2 到 3 页的相干 PDF,再提交给 ChatGPT 寻求答案,做出升级版的 ChatPDF;你也能够尝试将采样温度(temperature)也作为模型的一个配置项……本人入手试试?

另外,下面这个 Demo 利用,曾经上架到了明道云利用库,你能够间接在利用库搜寻「ChatPDF」装置或下载应用 [8]。有对于这篇文章的的任何问题,也欢送留言探讨。

援用

[1] 百度智能云「办公文档文字辨认」:https://cloud.baidu.com/doc/OCR/s/ykg9c09ji
[2] ChatGPT Tokenizer (token 计算器):https://platform.openai.com/tokenizer
[3] Sentiment Classification using Document Embeddings trained with Cosine Similarity:https://aclanthology.org/P19-2057.pdf
[4] ChatGPT API:https://platform.openai.com/docs/api-reference/chat/create
[5] Weaviate 控制台:https://console.weaviate.cloud
[6] 明道云封装业务流程介绍:https://help.mingdao.com/zh/flow_pbp.html
[7] 明道云开放平台文档:https://open.mingdao.com/document
[8] 明道云利用库 -ChatPDF 主页:https://mingdao.com/library/det

正文完
 0