Skip to content
🔗 分享本题
查看我的学习进度 →
RAG 冲突证据消解流程图解

🧠 图解记忆: 冲突不是噪声;按时间、权威、适用范围和来源解释,无法消解就明确表达不确定性。

💡 答案要点

为什么Chunk会冲突?

企业知识库中的矛盾来源:
1. 不同时间点的政策文件(旧政策 vs 新政策)
2. 不同部门的数据(销售说A,合同说B)
3. 历史版本未同步(文档更新了,Embedding没更新)
4. 外部抓取数据质量差(互联网数据互相矛盾)

冲突检测方法

方法1:基于时间戳的冲突检测

python
# 给Chunk打时间戳,优先使用最新数据
chunks_with_time = [
    {"chunk": chunk_a, "timestamp": "2024-01-01", "source": "旧政策"},
    {"chunk": chunk_b, "timestamp": "2025-06-01", "source": "新政策"},  # 优先
]

# 策略:时间戳最新的Chunk权重最高

方法2:基于来源权威性的冲突检测

python
# 给数据源分配权威权重
authority_weights = {
    "官方文档": 1.0,
    "内部邮件": 0.7,
    "历史存档": 0.5,
    "互联网抓取": 0.3
}

# 策略:高权威来源覆盖低权威来源

方法3:基于LLM的冲突仲裁

python
# 让LLM判断冲突并给出理由
def resolve_conflict(chunks):
    prompt = f"""
    检索到了多个可能有矛盾的文档片段:
    片段A:{chunks[0]}
    片段B:{chunks[1]}

    请判断:
    1. 这两个片段是否真的矛盾?
    2. 如果矛盾,哪个更可信?为什么?
    3. 如果无法判断,应该如何回答用户?
    """
    return llm.invoke(prompt)

冲突解决策略

策略适用场景实现方式
时间优先政策、规则类文档最新时间戳优先
权威优先多部门数据高权威来源覆盖
投票机制事实性问题多数Chunk支持的观点
LLM仲裁复杂矛盾让LLM判断并解释
不回答无法判断时承认不确定性
都展示需要对比时同时呈现不同观点

实战代码:构建冲突感知的RAG

展开 Python 代码示例(32 行)
python
class ConflictAwareRAG:
    def __init__(self, vectorstore, authority_db):
        self.vectorstore = vectorstore
        self.authority_db = authority_db  # 权威权重数据库

    def retrieve_with_conflict_detection(self, query, k=5):
        # 1. 检索Top-K个Chunk
        chunks = self.vectorstore.similarity_search(query, k=k)

        # 2. 检测冲突
        conflicts = self.detect_conflicts(chunks)

        if conflicts:
            # 3. 解决冲突
            resolved_chunk = self.resolve_conflict(chunks, conflicts)
            return [resolved_chunk]
        else:
            return chunks

    def detect_conflicts(self, chunks):
        """检测Chunk之间是否有矛盾"""
        conflict_pairs = []
        for i in range(len(chunks)):
            for j in range(i+1, len(chunks)):
                if self.is_contradictory(chunks[i], chunks[j]):
                    conflict_pairs.append((i, j))
        return conflict_pairs

    def is_contradictory(self, chunk_a, chunk_b):
        """用LLM判断两个Chunk是否矛盾"""
        prompt = f"判断以下两个片段是否矛盾:\nA: {chunk_a}\nB: {chunk_b}\n只回答'是'或'否'。"
        return "是" in llm.invoke(prompt)

面试话术

"Chunk冲突是企业RAG的经典难题。我总结了'检测-解决-预防'三步:检测用LLM判断片段是否真的矛盾;解决用时间优先/权威优先/投票/仲裁四选一;预防是给文档打时间戳和权威标签,上游数据质量管控比下游修复更重要。生产中遇到过销售说订单能退但合同说不能退的case,最后加了'以合同为准'的业务规则解决。"