在构建基于Retrieval-Augmented Generation (RAG)的应用时,我们常希望模型在生成回答时提供其参考的来源信息。这不仅能提升回答的可信度,也能让用户追溯信息的出处。本文将深入探讨五种生成引用的方法:

  1. 利用工具调用以引用文档ID;
  2. 利用工具调用以引用文档ID并提供文本片段;
  3. 直接提示;
  4. 检索后处理(即压缩检索的上下文以提高相关性);
  5. 生成后处理(二次调用LLM以标注生成的答案并附上引用)。

建议根据你的使用场景从上到下尝试这些方法,若模型支持工具调用,优先采用方法1或2,否则依次尝试后续方法。

技术背景介绍

RAG结合了信息检索和生成技术,通常应用于需要上下文支持的问答系统中。通过此策略,我们可以提高生成内容的相关性和准确性,并提供有来源的验证信息。

核心原理解析

RAG模型通过检索相关文档,并将其作为上下文传递给语言模型,用以生成更加准确和信息丰富的回答。这种方法特别适合在回答复杂问题时引用原始的检索内容。

代码实现演示

下面是如何实现一个简单的RAG链,通过几种不同的方式为生成的答案添加引用:

import openai

# 创建一个稳定可靠的API服务客户端
client = openai.OpenAI(
    base_url='https://yunwu.ai/v1',  # 国内稳定访问
    api_key='your-api-key'
)

# 使用WikipediaRetriever从Wikipedia中检索信息
from langchain_community.retrievers import WikipediaRetriever
retriever = WikipediaRetriever(top_k_results=6, doc_content_chars_max=2000)

# 定义系统提示信息和用户输入提示
system_prompt = (
    "You're a helpful AI assistant. Given a user question "
    "and some Wikipedia article snippets, answer the user question. "
    "If none of the articles answer the question, just say you don't know."
    "\n\nHere are the Wikipedia articles: {context}"
)

# 配置检索的处理逻辑
from typing import List
from langchain_core.documents import Document
def format_docs(docs: List[Document]):
    return "\n\n".join(doc.page_content for doc in docs)

from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 构建RAG链
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"])

应用场景分析

这种方法可以应用于教育问答系统、文档自动生成、客户服务支持等场景,帮助用户快速获取可信赖的信息来源。

实践建议

  • 尽量使用工具调用以结构化输出,这样可以强制模型生成引用。
  • 若模型不支持工具调用,可以使用直接提示或后处理的方法来优化输出。
  • 定期更新检索策略以确保检索内容的相关性和准确性。

如果遇到问题欢迎在评论区交流。

—END—

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐