理解 chatpdf.com 的代码原理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BirlGoy
V2EX    OpenAI

理解 chatpdf.com 的代码原理

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

    理解 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
    确实是这样
    106npo
        4
    106npo  
       2023-03-07 01:30:38 +08:00 via Android   7
    没什么问题,我们的客服系统也是这么实现的 https://loli.xing.moe/ChatGPT_as_customer_service/
    ktqFDx9m2Bvfq3y4
        6
    ktqFDx9m2Bvfq3y4  
       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 模型质量一般.
        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 。
    106npo
        31
    106npo  
       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     Solana     1155 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:49 PVG 01:49 LAX 10:49 JFK 13:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86