最近在做一个基于公司内部文档的问答机器人,用的RAG架构。检索部分还好,但生成环节有点头疼。我现在是把检索到的chunk直接拼进system prompt,然后让模型“根据上下文回答”。问题是,当检索结果不太相关时,模型还是会强行用这些片段编一个看似合理的答案,甚至开始“脑补”细节。我试过在prompt里加“如果上下文不包含答案,请直接说不知道”,但效果时好时坏。想问问大家,你们在RAG的prompt设计上有没有什么具体的技巧?比如要不要在模板里加入对检索片段来源的引用要求?或者对“不知道”这个回答的格式做更严格的约束?另外,是不是需要用few-shot示例来教模型区分“上下文不足”和“可以回答”的情况?求实战经验,感谢!
楼主
10天前
RAG里Prompt模板怎么设计才能让大模型不乱编答案?
请 登录 后发表回复
全部回复
共 23 条
2楼
2天前
我最近也在搞类似的项目,试过不少模板,感觉光是说“不知道”不够,得给模型一个明确的“拒绝姿势”。比如让它必须输出“【无法回答】+原因”这种固定格式,一旦触发这个格式就当检索失败处理,比单纯文字约束靠谱很多。另外我还会在prompt里把每个chunk标上文档编号,让模型回答时带上来源角标,这样就算它编,也至少会往检索到的内容上靠,幻觉明显少一些。还有个野路子,把few-shot示例直接做成“检索到无关内容时该说什么”的对比对,比只给正例效果好得多,你可以试试。
3楼
15小时前
可以试试在模板里固定输出格式,比如“根据[来源]回答:”,没依据就直接输出“无相关信息”。few-shot确实管用,给一两个对比例子比单纯说“不知道”强多了。
4楼
10小时前
我最近也在搞类似的RAG项目,你说的这个问题太真实了。我试过在prompt里明确要求“如果检索内容与问题无关,必须回答‘根据现有资料无法回答’”,但效果不稳定,后来发现关键是要把“不相关”的定义具体化,比如告诉模型“只有当检索片段中出现了与问题关键词完全匹配的实体或数据时,才算相关”。另一个比较有用的做法是,在模板里让模型先输出一个“相关性判断”的中间步骤,比如先写“检索到的资料是否包含明确答案:是/否”,再决定怎么回答,这样能强制模型做一次自我校验,减少脑补。关于few-shot,我觉得确实需要,但不用多,两三个例子就够,最好一个是有答案的,一个是明显无关的,还有一个是部分相关但信息不足的,让模型看到边界情况。最后我还会在后处理阶段加一个规则,如果模型回答里出现了“可能”“大概”这类词,就自动降权或者要求重新生成,虽然粗暴但能挡掉不少瞎编的内容。想问下你用的什么embedding模型?感觉检索质量如果提升一档,对生成端的压力会小很多。