type
status
date
slug
summary
tags
category
icon
password
如何让AI像学术论文一样,每个观点都有可追溯的来源?看看如何给RAG(检索增强生成)系统加上引文编号,让AI的回答更有说服力。
在项目中,也进行了一些如何更好的挂在引文的尝试,现在稍微输出一下:
一、最直接的Prompt大法
最简单的方法莫过于在提示词中直接要求AI加上引用。比如下面的要求:
这种方法简单直接,但有时AI会选择性失忆,忘记添加引用。就像调皮的学生,老师说要写作业,他就装作没听见。
二、Langchain的四板斧
Langchain官方提供了四种方法来解决这个问题:
- 函数调用:通过定义特定的函数来处理引用。
- 直接提示:类似于我们刚才提到的Prompt大法。
- 检索后处理:在获取相关文档后,对文档进行处理,提取最相关的部分作为引用。
- 生成后处理:先生成答案,然后再添加引用。
每种方法都有其优缺点,就像武林中的四大门派,各有各的独门绝技。
三、后挂载:先生成,再计算
但是,有时候这些方法还是不够完美。于是,我们的主角决定另辟蹊径,尝试一种新的方法:后挂载。
这个方法的核心思想是,让AI先自由发挥,说完它想说的话,然后我们再给它的回答加上引用。听起来简单,但实现起来可没那么容易。
我们的主角先是尝试了
callback
的方式,但发现这种方法无法改变stream输出。正当他陷入困境时,灵光一现,想到了可以直接写一个包装器(wrapper
)来实现这个功能。下面是这个包装器的核心代码:
这个包装器的工作原理是:
- 先让原来的chain完成输出。
- 在最后添加一次额外的输出。
- 在这个过程中,计算AI回答中的每个句子与参考资料的相似度。
- 如果相似度超过设定的阈值,就在原句后面添加引用。
这种方法的好处是,它不会干扰AI的正常思考过程,而是在AI完成回答后,才进行引用的添加。就像是给AI戴上了一顶“诚实帽”,让它的每句话都有据可循。
四、总结
通过这种后挂载的方法,我们可以得到既流畅自然又有可靠来源的AI回答。不丢失stream,不多次请求LLM。
当然,这个方法还有改进的空间。比如,我们可以进一步优化相似度计算的算法,或者探索更智能的引用添加策略。