V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BirlGoy
V2EX  ›  OpenAI

理解 chatpdf.com 的代码原理

  •  3
     
  •   BirlGoy · 2023-03-06 23:18:19 +08:00 · 12957 次点击
    这是一个创建于 630 天前的主题,其中的信息可能已经有所发展或是发生改变。

    理解 chatpdf.com 的代码原理

    背景: 周末有个 chatgpt 比较火的应用 chatpdf.com 。主要功能是上传一个 pdf ,就能跨语言地和这个 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 肯定会调整。

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

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

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

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

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

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

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

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

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

    这样看来,目前只能扩大 4096token 的限制。
    locoz
        21
    locoz  
       2023-03-07 16:13:51 +08:00
    @BirlGoy #20 是的,关键还是这个 token 数限制,而且长文很难饶过这个限制,无论是简化还是分段都容易出问题。只能看 openai 愿不愿意给定制用户提升限制了,能提升或许还能做相关的操作。
    ersic
        22
    ersic  
       2023-03-07 16:17:07 +08:00
    @BirlGoy 不是可以训练属于自己的模型吗,喂给他语料再提问不行吗
    jmc891205
        23
    jmc891205  
       2023-03-07 16:23:07 +08:00
    tool2d
        24
    tool2d  
       2023-03-07 16:31:31 +08:00
    3.5 的 api 可以做到无限 token ,但是这个 API 还不支持 embed 模型,就挺无奈的。
    locoz
        25
    locoz  
       2023-03-07 16:47:52 +08:00
    @tool2d #24 我看文档是都有 token 数限制,不知道你说的无限 token 是怎么做到的?
    BirlGoy
        26
    BirlGoy  
    OP
       2023-03-07 16:52:57 +08:00
    @ersic #7 回答了这个问题。 能满足,更新麻烦。
    tool2d
        27
    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
        28
    locoz  
       2023-03-07 17:30:59 +08:00
    @tool2d #27 回答的最大长度,跟输入的最大长度,应该是两个不同的概念?我这边之前测试 API 是存在 4096 token 的输入限制的。现在的关键问题其实是输入的最大长度。
    locoz
        29
    locoz  
       2023-03-07 17:31:54 +08:00
    @tool2d #27 输入的最大长度应该是这篇文档中提到的: https://platform.openai.com/docs/models/moderation
    tool2d
        30
    tool2d  
       2023-03-07 17:37:04 +08:00 via Android
    @locoz 你说得对,确实一个是输入,另一个是输出,虽然都叫 token 。
    xmumiffy
        31
    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
        32
    statumer  
       2023-03-09 21:22:32 +08:00
    @locoz #21 这个不是被 openai 限制的,是 transformer 模型的固有缺陷。
    gr3yman
        33
    gr3yman  
       2023-03-10 12:26:21 +08:00
    @BirlGoy 作者在 twitter 上的回复在那里?请贴出来看看

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

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

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

    试了试类似的实现,在英文上确实有点作用。但对中文就不行了
    MannyGPT
        34
    MannyGPT  
       2023-03-21 02:56:43 +08:00 via Android
    gpt4 出来之后,有没有调用 gpt4 接口的 chatpdf 应用或者类似的
    zhengkk
        35
    zhengkk  
       2023-04-23 16:09:00 +08:00
    按照同样的原理,是否也可以把 txt 、doc 等文件投喂后定向输出。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1099 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:04 · PVG 03:04 · LAX 11:04 · JFK 14:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.