理解 chatpdf.com 的代码原理

2023-03-06 23:18:19 +08:00
 BirlGoy

理解 chatpdf.com 的代码原理

背景: 周末有个 chatgpt 比较火的应用 chatpdf.com 。主要功能是上传一个 pdf ,就能跨语言地和这个 pdf 对话(如果这个 pdf 是中文,可以用英文提问;反之也可)。根据这个 pdf 的内容回答你的问题。 这个应用很惊艳,打开了新世界的大门。

这个应用有很大的想象空间:

这个应用太优秀,有人在 twitter 上问作者用了什么原理,作者很大度,把大概原理说了一下。我自己挺好奇,第二天在一篇文章里看到有人开源了类似 产品 把代码下载看来一下,总结一下原理,我自己不是机器学习出身,可能谬以千里。

0 、openai 的 Embedding 接口

问了一下 chatgpt:

    me:  openai 的 embedding 是什么?
chatgpt: OpenAI 的 embedding 是一种将自然语言文本转换为向量表示的技术。

1 、文本切割

将文本切割成一小部分,调用 openai 的 embedding 接口,返回这段文本的 embedding 的向量数据。存储这些数据,并且保存好对应关系。

2 、用户提问

将用户提的问题,调用 openai 的 embedding 接口,返回问题的向量数据。

3 、搜索向量

计算相似度。用问题的向量,在之前切割的所有向量数据里,计算和问题向量相似度最高的几个文本(余弦定理)。

4 、调用 chatgpt

准备特殊的 prompt ,里面带上切割的文本内容,加上问题的 prompt 。

例子中的 prompt 是这样的:

const res = await fetch("https://api.openai.com/v1/chat/completions", {
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${apiKey}`
    },
    method: "POST",
    body: JSON.stringify({
      model: OpenAIModel.DAVINCI_TURBO,
      messages: [
        {
          role: "system",
          content: "You are a helpful assistant that accurately answers queries using Paul Graham's essays. Use the text provided to form your answer, but avoid copying word-for-word from the essays. Try to use your own words when possible. Keep your answer under 5 sentences. Be accurate, helpful, concise, and clear."
        },
        {
          role: "user",
          content: prompt
        }
      ],
      max_tokens: 150,
      temperature: 0.0,
      stream: true
    })
  });

以上就是这个应用的背后大概的原理。目前最大的限制是 chatgpt 接口的限制 4096 个 token 。我相信后面 openai 肯定会调整。

以上就是胡乱记录一下,如果有问题,欢迎纠正。

12946 次点击
所在节点    OpenAI
35 条回复
proxytoworld
2023-03-06 23:29:14 +08:00
这东西好像是用来绕过 token 限制的
tool2d
2023-03-07 00:38:36 +08:00
这网站牛逼的,我随手上传了一篇语文教学参考资料。

AI 竟然能按照这个主题,严格贴合内容展开和聊天。

还能写一段段的小作文,厉害。
DevRoss
2023-03-07 00:48:17 +08:00
确实是这样
xmumiffy
2023-03-07 01:30:38 +08:00
没什么问题,我们的客服系统也是这么实现的 https://loli.xing.moe/ChatGPT_as_customer_service/
dayeye2006199
2023-03-07 02:17:26 +08:00
Chad0000
2023-03-07 04:43:07 +08:00
不知道什么时候会有支持大量数据的方案。比如用于某个销售网站的产品导购,售前售后咨询。
rocmax
2023-03-07 07:47:16 +08:00
@Chad0000 现在就可以 finetune 模型,但是考虑到一来价格贵,二来如果知识库内容经常更新的话每次都重训练一遍也不现实。
tomari
2023-03-07 08:10:03 +08:00
可惜没法看到 pdf 里面的图片
justin2018
2023-03-07 08:28:39 +08:00
这个厉害呀~ 问的问题基本上是对的

节约了翻书的时间了
vazo
2023-03-07 10:08:12 +08:00
这个和视频字幕总结插件的思路差不多,都可以总结输入内容,只不过他这个还可以就内容互动问答,明显更胜一筹.
SmiteChow
2023-03-07 10:37:31 +08:00
不错,有了领域限定,花样变少了,预期更相符了。
locoz
2023-03-07 11:30:00 +08:00
试了一下,对于高度定制化的内容,这种处理方式还是不太行,因为不一定能匹配到对应的原文,自然也就会导致 AI 要么猜内容、要么说不知道。

如果是常规的知识类书籍,由于数据很可能已经被学习过了,这种方式就相当于做了一个预先输入、限定回答范围的过程,能使回答内容更精准些,但回答的内容其实不一定是来自于 PDF 内。

所以:
@proxytoworld #1
实际并没有办法真正意义上地绕过 token 限制。

@tool2d #2
@justin2018 #9
实际只是相关内容已经被学习过了。
linksNoFound
2023-03-07 11:53:15 +08:00
缺陷就是老在应用崩溃的路上
Scirocco
2023-03-07 12:07:48 +08:00
感觉读论文水平还是不够
lambdaq
2023-03-07 12:11:32 +08:00
那种双栏 pdf 是怎么解析的?
BirlGoy
2023-03-07 12:18:47 +08:00
@locoz #12 chatgpt 没有问题,关键是喂给他的参考内容太少,最多 4096 个 token ,要是真个文档,效果肯定不一样。
还有一个办法,先让 gpt 回答一次,根据答案去搜索 embedding ,再把这些内容参考交给 gpt 回答一次。瞎想,没试过实际效果。
vToExer
2023-03-07 12:48:51 +08:00
能识别公式里的符号吗?读论文经常遇到符号不懂的情况
locoz
2023-03-07 13:02:30 +08:00
@BirlGoy #16 不不不,不是喂给它的参考内容太少,而是「文本转向量并匹配」这部分操作的匹配并不一定准确、完整。我当然知道 ChatGPT 本身没有问题,这方面用途我已经用了挺久了,只不过之前都是部分段落内容输入,而不是完整内容输入。

“先让 gpt 回答一次,根据答案去搜索 embedding ,再把这些内容参考交给 gpt 回答一次”
这种方式就我目前给的文件来说,没啥用...因为第一步的匹配操作就已经没有匹配到正确位置了,ChatGPT 也没法做出正确的描述,更别提后续基于这问问题了。
dayeye2006199
2023-03-07 15:09:27 +08:00
听说 openai 的 embedding 模型质量一般.
BirlGoy
2023-03-07 16:07:48 +08:00
@locoz #18 感谢。 你说的观点是对的。search 过程丢失了太多信息。

这样看来,目前只能扩大 4096token 的限制。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921750

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX