一个大学管理员上传了几十份制度文件,学生上来问“补考费什么时候交”。系统答得又快又顺,引用的却是一份完全不相干的宿舍管理条例。答案读起来毫无破绽,问题是它压根不对。
![]()
Internal GPT 就是为这种场景做的:管理员上传校内文件,师生用自然语言提问,回答必须严格来自这些文件,并附上出处。它背后跑的是检索增强生成(RAG)。这套东西到底怎么运转,值得拆开看一遍。
它要解决的是一个很具体的问题
语言模型知道很多世界上的事,但对一所学校的考勤规则、缴费截止日、宿舍政策一无所知。你硬问,它也能给一个自信、像模像样、完全编出来的答案。在机构场景里,一条编造的政策比没有答案更糟。
RAG 的办法是把知识和语言分开:文件负责存事实,模型负责把事实写成通顺的回答。模型不需要记住任何东西,它只读你递过去的那部分。
两个阶段,一条流水线
整个系统分两段:文档上传时做一次索引,每次提问时走一遍回答。
索引阶段:上传 → 抽取文本 → 切块 → 每块做向量化 → 存入向量库。
回答阶段:问题向量化 → 找出最相似的块 → 拼成提示词 → 生成回答并附来源。
抽取文本这一步,PDF、Word、纯文本各有各的解析方式。有些文档版式复杂,简单抽取器会读乱,所以系统加了兜底:主方法失败就换备选方案,都失败才报错。
切块是很多人低估的一环。一份60页的手册没法整体向量化,得切成语义完整的片段,最好一块只讲一件事。块太大,一块里混着好几个主题,对什么问题都只能弱匹配;块太小,上下文丢了——“费用5号前交”,哪个费用?相邻块之间留一点重叠,能防止一句话被从语境里切断。
检索才是真正的约束
问题向量化之后,系统用余弦相似度算出最接近的几块,取前5块送进提示词。这一步把模型锁死在知识库里真实存在的信息上。
然后是一段写得很克制的提示词,大意是:只用下面的上下文回答;上下文里没有,就直说没有。
这里有一条最关键的提示词经验:必须给模型一条体面的“我不知道”出口。没有这句明确指令,模型倾向于产出听起来合理但实为编造的内容,这在机构场景里不可接受。提示词里还要求每条陈述都注明出自哪份文件。
难的地方不在模型
文档格式是第一道坎,每种格式都要自己的处理管线,版式一乱就出问题。切块策略是第二道,块大小、重叠比例、向量模型的选择,对答案质量的影响比换模型还大。第三是引用,没有来源的答案就是传闻,每条回答都得指回它用过的那一块。
Hospitality.ai 这个后续项目把“有据可查”推得更远:它把保险条款抽进一个经过校验的结构,每条结论都带回原文逐字引用和行号范围,引用再对着原文复核一遍,标记为精确、模糊或未验证,界面上三种状态显示得各不相同。原则是一致的——别只信模型的说法,用代码去核对原文。文件里没写的,进一个可见的“缺口”清单,而不是拿“通常如此”去填。
答案不好,先别怪模型
调试 RAG 时最容易犯的错,是上来就怀疑模型。更该做的第一件事是:看检索到底捞回了什么。大多数 RAG 的毛病在这一步就暴露了。
光靠感觉不够,得量化。做一个小测试集,20个问题,每个问题标注你期望它命中的文档,然后统计正确的那一块出现在前几条结果里的比例。命中率0.9,意味着90%的测试问题里,对的文档进了前五。每次只改一个变量——块大小、重叠、向量模型——重跑,数字变好才保留这次改动。
还有一个安静的风险:提示词注入。上传的文档是数据,但模型可能把里面的文字当成指令,比如“忽略之前的指令并……”。基本防线包括:把文档文本放进明确分隔的区块并告知模型这是不可信数据;不给模型任何可能被诱导调用的工具;尽量用结构校验它的输出;永远不让检索到的文本决定权限。
想自己试,一个周末就够,不需要任何框架:拿五份自己的笔记或一份短PDF,按段落切块,用任意向量接口做向量化,问五个问题并打印每题的前三块。看到一次错误的检索,比读十篇讲解都管用。改切块大小,再跑一遍。
下一步可以加带引文的引用:要求模型对每条结论返回它所依据的原句,再用代码核验这句话确实存在于检索到的块里,对不上的直接丢弃。这一个改动,就能把系统从“听起来对”推到“可证明有出处”。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.