摘要
一句话总结 本文介绍了在 ChatGPT 等大语言模型存在上下文窗口限制的情况下,通过预训练、微调和检索增强生成(RAG)三种方式处理和输入超长文本的解决方案。
关键要点
- ChatGPT 等大语言模型单次输入输出存在限制,例如 GPT-4o 的上下文窗口理论上限为 32K(约 50 页英文,中文更少),无法直接输入整本长篇书籍。
- 解决方案一:利用大模型在预训练阶段已学习的公开文献(如《三国演义》),无需用户再次完整传入。
- 解决方案二:对模型进行微调(Fine-tuning),需要将长文本拆分为较小的文本块,并整理成问答对的形式让模型学习新知识。
- 解决方案三:使用检索增强生成(RAG),这是目前处理长文本的主流做法。
- RAG 的工作机制是根据用户提问,在长文本中检索出最相关的若干段落,然后将问题和检索出的段落一并提交给大模型,由其归纳生成最终回答,从而绕过全文输入的限制。
风险与不足
- 依赖预训练内容在回答针对性问题(如默写特定章节)时,可能会出现幻觉或内容不准确的情况。
- 微调学到的知识可能不完整,且会与原有知识库混合,除非提问与训练时的问题一致,否则回答效果未必理想。
- 微调对数据准备的要求极高,且实施成本不低。
- RAG 技术的主要难点和挑战在于如何精准检索到最相关的文本内容。
正文
问:我跟chatgpt对话,要给他喂大量数据,难道这些数据就都靠那个对话框输入输出吗?比如说我喂它一部三国演义txt文档。然后它就卡住不动了。
答:ChatGPT或者其他同类 LLM,你一次输入的内容是有限的,比如ChatGPT的GPT-4o,一次最多理论上输入输出加起来是32K的上下文窗口,英文也就是50页的样子,中文更少,所以你不可能把一本三国演义、红楼梦这样的全塞进去。
那么怎么绕过限制呢?
有几种办法:
-
在大语言模型预训练阶段就把这些内容训练进去,比如红楼梦三国演义这种预训练中已经有了,那么就不需要再传入完整内容了。但由于预训练内容很多,所以在针对性提问时还是有可能出现幻觉或者不准确。比如你让它默写三国演义的一些特定章节不一定会很完整。
-
将输入的内容进行微调,这样模型还是能学习一些新的知识和文本风格,但是微调时要先行对内容分块,也就是一本小说要拆成很多块,每一块可能就几页内容,并且要拆成问题和答案一对一对的,虽然是通过微调“学习”了新知识,但是并不代表它学到的知识是完整的,再加上原有知识库内容混在一起,所以针对微调的内容提问,未必会有好的效果,除非你的问题和微调时喂的问题一样的。另外微调对数据的准备要求很高,微调的成本也不低。
-
做RAG(检索增强生成),这是目前主流的做法。简单来说就是不需要预训练你的长文本(比如三国演义),而是根据你提问的内容,去长文本里面检索出来最相关的若干段落,然后将问题和检索出来的段落,一起交给ChatGPT,让它根据问题和检索结果,回答你的问题。
比如说,你问ChatGPT:“三顾茅庐是哪三顾?”ChatGPT就根据你的问题,提炼出“三顾茅庐”关键字,找出三顾茅庐相关的几个章节,然后把这几个章节给ChatGPT:“用户问三顾茅庐是哪三顾,这里是我找出来的三顾茅庐之一顾茅庐、二顾茅庐、三顾茅庐内容如下,你来帮助回答用户的问题”,于是ChatGPT给你总结归纳了一下。这样就不需要把整一个本书都扔给它。
当然 RAG 的难点在于怎么检索到最相关的内容,这部分是相当有挑战的。