最近在做知识库问答,用的RAG架构。我发现一个问题:如果Prompt只写“根据上下文回答”,检索回来的内容经常答非所问,尤其是多文档融合的时候。但当我往Prompt里塞了角色设定、回答格式、引用规则、甚至负面提示之后,准确率上去了,可模型开始“自作主张”——比如明明上下文里没提的东西,它会脑补出来,或者被格式束缚得像个机器人。我试过调temperature和top_p,感觉治标不治本。所以想问问有经验的前辈,RAG的Prompt设计有没有一个比较系统的思路?比如哪些指令该放System,哪些该放User,或者怎么做消融测试来找到那个“甜点”?先谢过大家了。
RAG里Prompt加太少没效果,加太多又跑偏,怎么平衡?
全部回复
共 48 条我一般把硬约束放system,比如引用规则和“不知道就说不知道”,user里只留当前问题和检索片段,这样模型不容易被格式带跑。你那个脑补问题,大概率是负面提示写太狠反而提醒它去编,试试改成正向表述,比如“只依据给定片段作答”。消融别一次全删,按角色、格式、引用、拒答这几块逐个开关,跑个二三十条固定测试集就能看出哪块在起作用。温度调到0.2左右先锁住,再谈prompt优化会清晰很多。
我最近也踩过这个坑,后来发现把硬性约束放System里,把具体任务和上下文放User里会稳很多。另外别指望一次写完,我一般会固定检索结果,只改Prompt做对比,每次只加一条规则看效果。还有个偷懒的办法是让模型先复述证据再回答,能压住不少脑补。
我一般把硬规则放System,风格和格式放User,再做几轮消融看哪个指令最惹事。
我一般把硬性约束(比如“只能基于上下文回答”)放System里,格式和引用规则也丢System,User里只留当前问题和检索片段。这样模型不容易被User里的花活带跑。消融的话建议每次只加一条指令,跑同一批测试集看幻觉率和准确率的曲线。另外可以试试让模型先输出“无法回答”的兜底选项,比硬压着它别脑补管用。
我一般把硬约束放System里,比如“只能依据上下文回答,找不到就说不知道”,User那边只放检索内容和具体问题。角色设定和格式要求尽量精简,写多了确实容易让模型为了满足格式去编内容。消融测试可以一次只加一条指令,看准确率和幻觉率的变化,找到拐点就停。另外多文档融合时给每段标个来源ID挺有用,能减少张冠李戴。
我一般把硬规则放System,风格放User,再跑几组消融看哪条指令真有用。
刚入门,这个对我帮助很大。
我最近也踩过这个坑,后来发现把“只根据上下文回答”这类硬约束放System里,把具体的引用格式和输出样例放User里,效果会稳不少。另外负面提示别堆太多,挑一两个最关键的就行,多了模型反而容易过度防御。消融测试可以固定检索结果,只变Prompt,每次跑个二三十条看命中率和幻觉率,比拍脑袋调温度靠谱。你说的“格式束缚像机器人”我猜是样例给太死了,留点自然语言空间会好一些。