|
ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;font-style: italic;padding: 1em 1em 1em 2em;border-radius: 6px;color: rgba(0, 0, 0, 0.6);background: rgb(247, 247, 247);">ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 1em;display: block;letter-spacing: 0.1em;color: rgb(63, 63, 63);">老板当时就破防了:"什么?臆构数据?那开发人员用了虚假信息怎么办?这样大家还会信任这个系统吗?"ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">文章发出去后,好多朋友在后台留言说对这个“AI幻觉”的问题深有同感,想知道我是怎么具体解决的。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">正好今天是周末,闲着也是闲着,就写篇文章算是回答朋友问题,也算是给自己一个复盘记录吧。好好捋一捋,我将把我“调教”Prompt的三轮完整迭代过程和思考全部分享出来。这事儿可不是小问题,当时它几乎关乎项目的生死存亡,当然生死其实是老板的一句话,我们要做的就是想办法去消除老板的顾虑:ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: inherit;color: rgb(0, 152, 116);">如果AI的回答连我们自己都不敢信,那这个项目就没有存在的价值。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;padding-left: 12px;color: rgb(63, 63, 63);border-radius: 6px;background: color-mix(in srgb, rgb(0, 152, 116) 8%, transparent);">ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: inherit;color: rgb(0, 152, 116);">第一轮:偷懒了,被平台默认Prompt“喂”了一嘴假话ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">最开始的时候偷懒了,Ragflow 对这块有默认推荐的系统提示词,想着既然是平台推荐的,那就先用着看看效果:ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">最开始跑起来,简单的进行了几轮对话试验,觉得像模像样,回答得还不错。可是用着用着,就发现不对劲了,它总会回答一些知识库里根本没有的东西!ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">这让我立刻警惕起来。我不想搞一个什么都懂的通用聊天机器人,我需要的是一个专有知识领域的顾问。它的定位必须清晰化,不能跑偏。于是,我开始动手修改提示词。第二轮:给 Prompt 设定角色这个时候,我就必须给AI设定角色,让它戴上“紧箍咒”,明确角色和行为边界。于是,我写了第二版非常严格的Prompt,堪称“严苛”: # 角色与目标 你是一个为 XXX 开发者服务的专业知识库助手。你的核心任务是基于下面提供的【知识库内容】,准确、客观地回答用户的问题。开发者用户高度依赖你提供信息的精确性和可溯源性,因此你的回答必须绝对忠实于提供的资料。
# 回答准则 (必须严格遵守) 1. **唯一信息来源:** 你的回答**必须**且**只能**基于【知识库内容】。严禁使用任何你预先知道的XXX知识、外部信息或进行任何形式的互联网搜索。 2. **直接性与相关性:** 仔细分析问题,并直接从【知识库内容】中查找最相关的段落或信息点来构建答案。优先直接引用或转述原文的关键信息。 3. **处理无关情况:** 如果经过仔细分析,【知识库内容】**完全不包含**与用户问题相关的任何信息,你**必须**且**只能**回答:“知识库中未找到您要的答案!”。不得给出任何其他解释或尝试回答。 4. **考虑聊天历史:** 在理解用户当前问题时,需结合之前的对话上下文。但回答依据仍**严格限制**在当前提供的【知识库内容】。 5. **保持专注:** 拒绝回答任何与 XXX 技术、提供的知识库内容或你设定的助手角色无关的问题。
# 知识库内容 --- 开始 --- {knowledge} --- 结束 ---
请严格遵循以上所有准则,根据【知识库内容】回答用户问题。
这下,AI的回答确实严格遵循了它的角色设定,老实多了。我心想,这下总算稳了。 但万万没想到,更要命、更不易察觉的问题来了。 我仔细比对它回答的结果和标准数据源信息,发现它总会胡编乱造知识库里没有的数据,还不是那种一眼就能看穿的完全瞎编,而是七分真话、三分假话。这就很恼火了! 后来我排查出了原因:主要是RAGFlow在知识库中检索后,只找到了部分相关的信息片段。但要把这些碎片组织成一个通顺的回答,信息是不够的。这时候,大模型接收到这些知识片段后,为了保证回复的“逻辑自洽”,就会自己“臆构”一部分数据,把缺失的环节补上。 这种情况对使用者来说是致命的!使用者通常是在不了解某个概念或方法的情况下,才会去问问答机器人,这时候他们看到AI的回答,在不是很熟悉的情况下,很可能以为AI说的都是真的。一旦他们全盘接受了这些虚假知识,并在实践中去用,出了问题,反过来就会质疑整个系统的准确性。信任的基石一旦被侵蚀,大家宁可去看原始文档,也不会再用这个机器人了。那我们费这么大劲搞这个项目,也就失去了意义。 第三轮:有问题就有答案找到问题出在哪之后,我想到了两个解决办法: - 1.使用Agent模式:再加一个AI当“审核员”。让它把第一个AI生成的内容,再丢回RAG里检索一遍,看向量匹配度高不高,以此来验证信息的真实性。这方法技术上可行,也验证通过了,能很好的解决臆构问题,但调用链太长,直接导致响应时间变慢。考虑到并发时的用户体验,这个方案在上线前被我PASS了。
- 2.巧用Prompt:不断地根据反馈来调整提示词,把各种可能导致“自由发挥”的情况都堵死。同时,在硬件允许的范围内,寻找一个更能遵循指令的大模型。
最终,从实际效果和多人并发时的响应时间控制,我选择了第二条路。 我的目标变得异常清晰:我得允许,甚至鼓励AI在信息不足时,坦诚地承认自己“无知”,而不是打肿脸充胖子。 于是,第三版,也是最终版的Prompt诞生了。核心就是在第二版的基础上,加入了这条堪称“反AI本能”的铁律: # 角色与目标 你是一个为 XXX 开发者服务的专业知识库助手...
# 回答准则 (必须严格遵守) ... 3. **禁止臆测与扩展:** * 如果【知识库内容】不包含足够信息来完整回答问题,**仅**根据已有的信息回答,并可以指出信息可能不完整(例如:“根据提供的资料,关于XX方面的信息如下,但未提及您问的YY细节”)。 * **绝对不允许**对信息进行任何形式的延伸、推理、猜测、补全或创造不存在的逻辑关系。**找到什么,就回答什么。** * 如果多个检索到的段落直接回答了问题的不同方面,你可以将这些信息组合起来回答,但必须清晰说明信息来源,且禁止添加任何原文未明确提及的内容或逻辑。 * 如果发现知识库信息自相矛盾,请指出矛盾点,不要自行选择或调和。 ...
看到加粗的那句了吗?“找到什么,就回答什么。”这句话彻底改变了AI的行为模式。我们等于正式授权它可以给出“不完美”但绝对诚实的答案。 这次,AI终于学会了“老实做人”。当知识库信息不全时,它会老老实实地告诉你:“根据资料,我只找到了这些,你要问的另外一部分,资料里没提。” 一个回答虽然可能不“完整”,但它100%忠于原文,100%值得信赖。至此,那个差点让我们项目翻车的“吹牛大王”,总算被成功驯服了。 一点经验总结和建议这次和AI幻觉斗智斗勇的经历,让我的感受和上次搞定整个知识库项目时非常相似: - 1.别指望AI有“自觉”,一定要写清晰的Prompt让它去严格遵守:不要把AI当成一个能心领神会的“同事”。你必须像制定法律条文一样,用极其明确、甚至有点啰嗦的规则去堵住所有它可能“犯错”的漏洞。
- 2.拥抱“不完美”,是追求“真实”的第一步:我们总希望AI无所不知、对答如流。但对于企业级应用,尤其是在技术和生产领域,一个真实的“我不知道”,远比给出一个看似完美的虚假答案更有价值。
- 3.Prompt调优的本质,就是跟大模型的“本能”对着干:大模型的出厂设置,就是为了生成更流畅、更连贯、更像“人话”的文本。而我们的工作,就是通过Prompt这根缰绳,引导它走向我们需要的、符合业务逻辑的、哪怕有点“笨拙”的方向。
技术这东西,往往就是这样,刚刚从一个坑里爬出来,前面又是一个坑。但是每次填坑的过程,都是对技术和业务理解的一次深化。 |