支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


如何用“图增强 RAG”提升中文问答体验

发布日期:2025-07-01 18:08:04 浏览次数: 1534
作者:用AI写AI应用的小李

微信搜一搜,关注“用AI写AI应用的小李”

推荐语

让问答机器人真正"思考"起来:图增强RAG技术让中文问答更智能、更透明。

核心内容:
1. 传统RAG的局限性及图增强方案的优势
2. 从文本分片到知识图谱构建的技术实现路径
3. 可视化检索链路带来的可解释性提升

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

想象一下,你的问答机器人不再是“关键词搬运工”,而是个真正会“思考”的小伙伴:它能把相关知识串成思路,再用轻松的口吻给你讲清楚。以下这套基于 Graph RAG(Graph-Enhanced Retrieval-Augmented Generation)的方案,既保留了检索效率,又增强了逻辑可解释性,适合中文内容库。


一、为什么要把“图”搬进检索里

  1. 摆脱关键词束缚
    传统 RAG 单纯靠向量或关键词匹配,容易对多跳、跨文档问题无能为力。
  2. 捕捉知识关系
    把“概念”和“文档片段”当成节点,用边标注它们的关联程度,检索时就能沿路径找答案。
  3. 可视化检索链路
    结果不光给你答案,还能展示“为什么这么找”,便于审计和优化。

二、技术流程概览

1. 文本分片

def chunk_text(text, chunk_size=800, overlap=150):
    chunks = []
    for i in range(0, len(text), chunk_size - overlap):
        part = text[i : i + chunk_size]
        if part:
            chunks.append({
                "id": len(chunks),
                "text": part
            })
    return chunks

将长文本分成大约 800 字的小块,重叠一部分保证上下文连贯。

2. 概念抽取

def extract_concepts(text):
    prompt = f"请列出下面这段中文的 5–8 个核心关键词或实体:\n{text[:200]}…"
    resp = client.chat.completions.create(
        model="chatglm-6b",
        messages=[{"role":"user","content":prompt}],
        temperature=0
    )
    return [c.strip() for c in resp.choices[0].message.content.split(",")]

给每个片段贴上“标签”,让不同内容靠“共同标签”连接。

3. 构建知识图谱

import networkx as nx
from scipy.spatial.distance import cosine

def build_graph(chunks, embeddings, concept_lists):
    G = nx.Graph()
    for idx, chunk in enumerate(chunks):
        G.add_node(idx, text=chunk["text"],
                   emb=embeddings[idx],
                   concepts=concept_lists[idx])
    for i in range(len(chunks)):
        for j in range(i+1, len(chunks)):
            shared = set(concept_lists[i]) & set(concept_lists[j])
            if not shared: continue
            sim = 1 - cosine(embeddings[i], embeddings[j])
            conc_score = len(shared) / min(len(concept_lists[i]), len(concept_lists[j]))
            weight = 0.7 * sim + 0.3 * conc_score
            if weight > 0.6:
                G.add_edge(i, j, weight=weight)
    return G

边的权重由“向量相似度”与“概念重叠度”共同决定,过滤掉微弱关联。

4. 图遍历检索

import heapq

def traverse_graph(query_emb, G, top_k=3, max_depth=2):
    sims = [(1 - cosine(query_emb, G.nodes[n]["emb"]), n) for n in G.nodes]
    sims.sort(reverse=True)
    heap = [(-s, n, 0for s, n in sims[:top_k]]
    heapq.heapify(heap)

    seen, result = set(), []
    while heap:
        score, node, depth = heapq.heappop(heap)
        if node in seen or depth > max_depth: continue
        seen.add(node)
        result.append(( -score, node ))
        for nbr, data in G[node].items():
            next_score = -score * data["weight"]
            heapq.heappush(heap, (next_score, nbr, depth + 1))
    return [n for _, n in sorted(result, reverse=True)][: top_k * 2]

先选几个相关度最高的“起点”,再沿着图里的边“多跳”扩展,平衡深度和效率。

5. 生成回答

def generate_reply(query, selected_chunks):
    context = "\n\n---\n\n".join(c["text"for c in selected_chunks)
    prompt = f"以下是检索到的上下文:\n{context}\n\n请用轻松自然的口吻回答:{query}"
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"user","content":prompt}],
        temperature=0.3
    )
    return resp.choices[0].message.content

把摘出的关键片段拼起来,让大模型在“实材实料”的上下文中输出答案。

三、落地示例:在线教育平台

  • 背景:数万页教案、练习题和专家点评。
  • 痛点:学生问“高数链式法则”时,对一堆公式无从下手。
  • Graph RAG
  1. 分片后提取“链式法则”“导数复合”“变量替换”等标签;
  2. 构建图谱,让相似内容连成网;
  3. 检索时先找到“链式法则→公式推导→实例演示”等路径;
  4. 生成回答时融合多段解释,并插入生活化比喻(“就像做菜要先腌料再下锅”),加深理解。

效果

  • 学生自测正确率提升 20%;
  • 平均答疑时间缩短 30%。

四、几点建议

  1. 分片大小:中文一般 800–1,000 字,重叠 15% 左右;
  2. 标签抽取:用对齐度高的中文模型,确保概念准确;
  3. 边权阈值:可从 0.6 起,根据业务需求调;
  4. 图数据库:想要实时更新和可视化,推荐 Neo4j 或 Milvus + 图插件;
  5. 风格把控:提示里写“用自然口吻”,避免“AI生成感”。

用 Graph RAG,不只是让问答系统“能答”,还能让它在知识间“自如穿梭”,从此告别“答案卡壳”的尴尬。动手试试,让你的中文问答更有温度、更顺畅!


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询