找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3007

积分

0

好友

416

主题
发表于 2 小时前 | 查看: 0| 回复: 0

本文旨在探讨一种名为 Trustworthy Generation 的设计模式,其核心目标是提升 RAG(检索增强生成)系统生成内容的信赖度。这里的“信赖度”主要包含两大维度:真实性(即生成内容是否准确、无幻觉、无偏见)与完整度(即是否全面、不遗漏关键信息)。接下来,我们将系统性地分析 RAG 信赖度不足的四大根源,并围绕“可解释、可追溯、可反思、可监管”四个层次,详细阐述相应的解决方案与权衡考量。

蓝色数字“01”与抽象图形标志

一、问题根源:为何RAG会“失信”?

RAG 技术已广泛应用于各类场景,其核心流程不外乎“检索”(Retrieve)与“生成”(Generate)两大动作,本质上是在进行上下文工程的内容补充。尽管我们在知识库中填充的往往是经过梳理的“高质量”信息,但最终由大语言模型(LLM)生成的内容,仍可能因以下几种典型情况而出现信赖度问题:

  1. 检索错误

    • 准确率问题:检索出的信息虽然向量相似度高,但内容相关性弱。这里存在一个常见误区:高向量相似度 ≠ 高内容相关性(high similarity ≠ high relevant)。
    • 召回率问题:知识库中实际存在高度相关的内容,却未能被成功检索召回。
  2. 内容可靠性问题
    检索召回的信息虽然是相关的,但其本身可能带有偏见、已经过期,或者不同来源的内容之间存在矛盾与冲突。

  3. 前置推理错误
    这一问题通常源于检索前的查询(Query)扩写或“Step-Back”问题抽象环节出现偏差,导致检索方向错误,进而获取了有偏差的上下文。

  4. 模型幻觉
    在面对复杂问题时,RAG 可能召回大量繁杂内容。LLM 在生成最终答案时,容易“加戏”,即基于不充分的关联或错误理解进行推理,从而产生事实或逻辑上的幻觉。

以上情况基本涵盖了 RAG 实践中的主要痛点。需要明确的是,这些问题无法被“根治”,本文所探讨的 Trustworthy Generation 设计模式,旨在通过一系列技术手段与人机交互的结合,降低问题发生的概率,并提升对问题出现的感知能力,从而系统性提高 RAG 系统的整体信赖度。

对于希望深入探讨 AI 可信性与模型优化策略的开发者,欢迎在 云栈社区 的人工智能板块交流更多想法。

蓝色数字“02”与抽象图形标志

二、解决方案:构建可信RAG的四层框架

解决方案围绕建立信赖度的四个递进层次展开,可以通俗地理解为:

  1. “解决不了的事情要明确说出来”:不强行生成,这是建立信赖的第一步。
  2. “说话要有依据”:为生成内容中的关键信息附上可追溯的出处。
  3. “深思熟虑,为自己的言论负责”:在检索过程中引入反思与递进机制,并对结果进行质量把关。
  4. “建防护、受监管”:构建面向信赖度提升的工程化技术链路,并融入人机交互的监督机制。

下面,我们将深入几个关键技术模块。

模块一:信息关联度识别

我们在工程链路中使用 RAG,本质是为当前查询补充关联信息。因此,如果一个 RAG 模块能够做到:a. 只返回有关联的信息,且 b. 在没有检索到足够关联信息时,明确告知不返回,就能极大提升用户对其的信赖感。

当前的主要问题在于 RAG 经常返回“相似但不相关”的信息。提升对“相关性”的识别能力是关键,主要有三种实践思路:

  1. 相似度阈值(Threshold)设置:RAG 检索基于向量相似度排序并返回 top-K 个结果,但常缺乏底线阈值。可以为相似度设定一个阈值,低于该值的结果不予召回(此阈值需根据具体场景调优)。有研究表明,当信息不相关时,向量相似度会陡然下降,可以利用这一趋势进行截断。
  2. 问题类型分类:在 RAG 调用前,先对用户问题进行分类。如果问题不在当前知识库覆盖的范围内,则不触发 RAG。
  3. 领域关键词识别:仅当检测到查询中包含特定领域关键词或术语时,才触发 RAG 调用,这是一种非常严格的限制策略。

模块二:引用出处说明

第二种提升信赖度的方式是,像学术论文一样,为 RAG 生成的内容明确标识出其引用的知识片段。实现方式主要有三种:

1. 信息直接来源引用
即直接指出内容来源于哪个知识文档或分块(Chunk)。以下是一个相关的 Prompt 示例:

template = """Answer the question based on the following sources, using in-line citations like in scientific papers.
SOURCES:
{sources}
QUESTION: {question}
INSTRUCTIONS:
1. Use information only from the provided sources
2. Provide an answer with in-line citations using brackets, e.g., "Einstein developed the theory of relativity [1]"
3. Use the source ID in brackets [1], [2], etc., corresponding to the source number
4. Cite ALL facts with their source IDs
5. If multiple sources support a fact, you can include multiple citations [1][2]
6. If the information isn't in the sources, say "I don't have enough information to answer this question"
7. Include a "References" section at the end listing all the sources you cited
Your answer should be comprehensive, accurate, and include citations for all factual claims.
"""

附带引用来源的生成结果示例

2. 有判断的引用来源说明
先判断某段内容是否需要通过引用来增强可信度。这个判断可能基于应用领域以及该事实对整体答案的重要性。例如,在句子“王二生于1990年3月3日,出生在一农民家庭,于2015年被评为全国劳模”中,出生信息可能无需引用,但所获荣誉则需要明确出处。这通常需要针对特定领域微调一个小型判断模型。

3. 基于Token级别的关联说明
在回答复杂问题时,可能会召回多个文档,最终答案的每个段落可能是综合多个文档内容生成的。这仍可能导致逻辑编排错误或事实混淆。Token 级别的关联说明旨在追溯输出中每个 token 受哪些输入 token 影响,目前尚无成熟的现成库,其概念如下图所示:

Token级别关联引用说明示意图

模块三:自我批判与反思

我们在设计和使用 RAG 时,通常默认知识库内容是“正确”且“高质量”的。然而,知识库内容是否足够正确、是否比模型自身参数知识更优质,并非一个固定结论,而是因时因事而异的。因此,批判性地看待检索结果并在过程中引入反思,对提升 RAG 信赖度至关重要。

  • CRAG(校正性检索增强生成)
    CRAG 主要解决两个问题:1) 评估检索文档的质量(正确性),过滤低质量文档或通过其他知识库/网络搜索进行补充;2) 评估检索文档的关联性,裁剪掉与查询不相关的部分。其流程示意如下:

CRAG(校正性检索增强生成)流程示意图

以下是 LangChain 中基于 LLM 的文档相关性打分实现示例:

def grade_documents(state):
    """
    Determines whether the retrieved documents are relevant to the question.
    Args:
        state (dict): The current graph state
    Returns:
        state (dict): Updates documents key with only filtered relevant documents
    """
    print("---CHECK DOCUMENT RELEVANCE TO QUESTION---")
    question = state["question"]
    documents = state["documents"]
    # Score each doc
    filtered_docs = []
    web_search = "No"
    for d in documents:
        score = retrieval_grader.invoke(
            {"question": question, "document": d.page_content}
        )
        grade = score.binary_score
        if grade == "yes":
            print("---GRADE: DOCUMENT RELEVANT---")
            filtered_docs.append(d)
        else:
            print("---GRADE: DOCUMENT NOT RELEVANT---")
            web_search = "Yes"
            continue
    return {"documents": filtered_docs, "question": question, "web_search": web_search}
# Data model
class GradeDocuments(BaseModel):
    """Binary score for relevance check on retrieved documents."""
    binary_score: str = Field(
        description="Documents are relevant to the question, 'yes' or 'no'"
    )
# LLM with function call
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
structured_llm_grader = llm.with_structured_output(GradeDocuments)
# Prompt
system = """You are a grader assessing relevance of a retrieved document to a user question. \n    
    If the document contains keyword(s) or semantic meaning related to the question, grade it as relevant. \n
    Give a binary score 'yes' or 'no' score to indicate whether the document is relevant to the question."""
grade_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system),
        ("human", "Retrieved document: \n\n {document} \n\n User question: {question}"),
    ]
)
retrieval_grader = grade_prompt | structured_llm_grader
  • Self-RAG(自反思检索增强生成)
    Self-RAG 主要具备三个职能:1) 评估检索文档的相关性与质量,进行过滤;2) 判断是否需要基于当前结果进行进一步检索(类似于智能体化 RAG 的思路);3) 评估文档内容,判断是否直接调用底层 LLM 的知识来替代部分文档内容,以利用基础模型快速发展的红利。其流程示意如下:

Self-RAG(自反思检索增强生成)流程示意图

模块四:工程防护与人机监管

  • 防护栏(Guardrails)设计
    围绕 RAG 的两个核心动作,可以在四个阶段设置防护措施:

    • 检索前(Pre-retrieval):过滤超出能力范围的查询;对入库文档进行正确性与时效性评估。
    • 检索后(Post-retrieval):过滤低于相似度阈值的文档;对召回文档进行正确性、隐私合规性验证。
    • 生成前(Pre-generate):过滤过期信息(如1年前的文档);对关键信息要求多源交叉验证。
    • 生成后(Post-generate):对生成结果进行批判性检查,评估是否存在相对于引用内容的幻觉或矛盾。
  • 人类反馈(Human Feedback)
    人机交互的监督可以融入 RAG 流程的每个核心步骤,如下图所示。这类设计通常需要投入专家人力,因此其核心价值在于回收关键的再训练样本数据,用于后续的工程与模型针对性优化。

Human feedback在RAG流程中的关联设计示意

蓝色数字“04”与抽象图形标志

三、权衡与考量

上述提升 RAG 信赖度的方案,大多会增加系统架构的复杂性以及模型调用次数,从而影响整体性能与成本。因此,是否采用、采用哪些手段,需要结合实际业务需求进行谨慎权衡。

局限性

  1. 阈值动态性:RAG 检索极度依赖向量相似度计算。上文提到的相似度阈值,在实际中可能难以直观确定,需要结合评测不断调整。并且,该阈值会随着知识库内容和领域的扩展而变化,需要定期检测与调整。
  2. 误过滤风险:本模式中涉及对检索内容的打分、质量判断等操作,这些判断本身并非百分之百准确。如果过滤策略过于严格,可能会误杀掉有用信息,反而影响最终结果的完整性。

替代方案

如果经过权衡后决定不采用上述复杂模式,以下三种相对轻量的方式也值得考虑:

  1. 双知识库交叉验证:为 RAG 系统增设一个独立维护的知识库,每次查询同时检索两个库,并对结果进行交叉验证,以提升信息的可靠性。
  2. 增强过程透明性:向用户展示检索到的信息概述,以及模型得出结论的思考链(Chain-of-Thought),通过增加解释性来间接提升信赖度。
  3. 带置信分的引用标注:在提供引用来源的同时,为每个引用附上一个“置信分”,让用户自行判断特定信息的可靠程度,并决定后续行为的依赖程度。

蓝色数字“05”与抽象图形标志

参考资料

探索复杂系统架构与 设计模式 的更多实践,能够帮助我们更好地构建稳定、可靠的技术方案。




上一篇:机器学习如何揭示微盘股内幕交易中的动量效应:基于XGBoost模型的分析
下一篇:Rust开源内网穿透工具Tunnelto:实现本地服务公网访问与远程调试
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-10 04:49 , Processed in 0.473359 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表