理解 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 肯定会调整。

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

12956 次点击
所在节点    OpenAI
35 条回复
locoz
2023-03-07 16:13:51 +08:00
@BirlGoy #20 是的,关键还是这个 token 数限制,而且长文很难饶过这个限制,无论是简化还是分段都容易出问题。只能看 openai 愿不愿意给定制用户提升限制了,能提升或许还能做相关的操作。
ersic
2023-03-07 16:17:07 +08:00
@BirlGoy 不是可以训练属于自己的模型吗,喂给他语料再提问不行吗
jmc891205
2023-03-07 16:23:07 +08:00
tool2d
2023-03-07 16:31:31 +08:00
3.5 的 api 可以做到无限 token ,但是这个 API 还不支持 embed 模型,就挺无奈的。
locoz
2023-03-07 16:47:52 +08:00
@tool2d #24 我看文档是都有 token 数限制,不知道你说的无限 token 是怎么做到的?
BirlGoy
2023-03-07 16:52:57 +08:00
@ersic #7 回答了这个问题。 能满足,更新麻烦。
tool2d
2023-03-07 17:14:50 +08:00
@locoz https://platform.openai.com/docs/api-reference/chat/create#chat/create-max_tokens

写着"max_tokens Defaults to inf", inf 在我的理解中,就是无上限吧。
locoz
2023-03-07 17:30:59 +08:00
@tool2d #27 回答的最大长度,跟输入的最大长度,应该是两个不同的概念?我这边之前测试 API 是存在 4096 token 的输入限制的。现在的关键问题其实是输入的最大长度。
locoz
2023-03-07 17:31:54 +08:00
@tool2d #27 输入的最大长度应该是这篇文档中提到的: https://platform.openai.com/docs/models/moderation
tool2d
2023-03-07 17:37:04 +08:00
@locoz 你说得对,确实一个是输入,另一个是输出,虽然都叫 token 。
xmumiffy
2023-03-08 20:33:45 +08:00
@tool2d Inf 即使用模型的最大 tokens 再减掉输入的 tokens 文档下面就写着
@locoz 4096 是输入加输出的限制 max_tokens 的说明以及 https://platform.openai.com/docs/guides/chat/managing-tokens 中提到了,文档中举例如果你在输入时用掉了 4090 个 tokens,那返回就只有 6 tokens 可用了
statumer
2023-03-09 21:22:32 +08:00
@locoz #21 这个不是被 openai 限制的,是 transformer 模型的固有缺陷。
gr3yman
2023-03-10 12:26:21 +08:00
@BirlGoy 作者在 twitter 上的回复在那里?请贴出来看看

前二天根据 chatpdf 网站上的描述,问过 chatGPT ,回复是要实现这个描述,需要执行以下步骤:

1. 对 PDF 进行分析以创建每个段落的语义索引。这可以通过使用自然语言处理技术(如词向量表示法和文本分类器)来实现。
2. 当用户提出一个问题时,将查询该问题并从语义索引中检索相关段落。
3. 检索到的相关段落将被送往 ChatGPT API 进行进一步处理,并生成最终的答案。

总的来说,这个过程需要将 PDF 转换成可搜索的形式,并使用 NLP 技术来确定哪些段落与用户的查询相关。

试了试类似的实现,在英文上确实有点作用。但对中文就不行了
MannyGPT
2023-03-21 02:56:43 +08:00
gpt4 出来之后,有没有调用 gpt4 接口的 chatpdf 应用或者类似的
zhengkk
2023-04-23 16:09:00 +08:00
按照同样的原理,是否也可以把 txt 、doc 等文件投喂后定向输出。

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

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

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

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

© 2021 V2EX