如何使用 Knowledge Graph 和 LLM 构建构建问答系统

如何使用 Knowledge Graph 和 LLM 构建构建问答系统

基于模拟 FAQ 文档构建的知识图谱

本文将介绍一个基于知识图谱(使用上一篇文章介绍的方法构建)和大型语言模型(LLM,此处使用 Gemma3-4b-it-qat)的简易问答系统。选择 Gemma3-4b 是因为其模型尺寸适中,可在普通笔记本电脑上运行,且具备出色的指令遵循能力。

我们将以一个虚构智能手机产品的 FAQ 文本为例,复用上一篇文章的代码为其构建知识图谱,并在此基础上搭建一个能够回答相关产品问题的系统,示例如下:

如何使用 Knowledge Graph 和 LLM 构建构建问答系统

问答系统示例

本文将涵盖以下内容:
1. 问答系统简介
2. 系统设计思路
3. 核心代码解析
4. 局限性及改进方向

问答系统简介

根据 Google 的定义:

问答系统是一种软件应用,它接收用户用自然语言提出的问题,通过理解问题意图并从知识源检索信息或生成新内容,来提供直接、相关的答案。

本文的“知识源”是由 Gemma3 生成的一段模拟 FAQ 文本,可在本项目的 GitHub 仓库中找到。我们可以运行仓库中的 main.py 脚本来构建知识图谱并保存到输出目录:

python main.py --inputpath ./input/sample-faq.txt --outlabel faq

该命令会将 NetworkX 图对象保存为 nx_graph.pkl 文件,后续构建问答系统时将加载此文件。

系统设计思路

核心思路是:从用户问题中提取实体和关键词,在知识图谱中找到所有相关的节点和边,然后将这些结构化信息与原始问题一同提供给 LLM,让其基于图谱中的事实进行回答。具体流程如下:

给定一个问题 q 和已构建的知识图谱 G
1. 使用 LLM 从 q 中提取命名实体(entity_keywords)和关系谓词(relation_keywords)。
2. 枚举 entity_keywords 中所有可能的实体对组合。因为我们无法预先假设某个实体在图中是源节点还是目标节点,这一步确保了查询的完整性。
3. 对于上一步得到的每一对实体 (u, v),在 G 中查找 uv 之间的所有路径。这能揭示两个实体之间所有可能的关系和知识连接,是提升系统能力的关键步骤。
4. 对于找到的每条路径,提取源节点与目标节点之间的具体关系,形成三元组(例如 (box, include, charger))。
5. 将所有提取到的三元组加入列表 relations
6. 对 relation_keywords 进行类似处理:对于每个关系关键词 r,找到所有由 r 连接的边,形成三元组并加入 relations 列表。
7. 最后,将这些三元组(作为给定事实)与原始问题 q 一起封装在一个提示词中,传递给 LLM,让其基于这些事实生成答案。

核心代码解析

首先,使用 main.py 构建知识图谱:

python main.py --inputpath ./input/sample-faq.txt --outlabel faq

然后从生成的 pickle 文件中加载图谱:

import pickle
G = pickle.load(open(graph_file, "rb"))

定义一个通用的函数,用于向 LLM 发送文本和系统提示词并获取响应:

def get_llm_response(text, system_prompt):
    response = ollama.chat(model=model, messages=[
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": text}
        ])
    resp_content = response['message']['content']
    return resp_content

接下来,需要从用户查询中提取实体和关系关键词(对应设计思路的第 1 步)。为此,我们构造一个基础的系统提示词:

system_prompt_key_words = """You are a helpful assistant, expert of English language who can extracts keyword from the given question in root form (e.g. ran becomes run) and lowercase.
The returned keywords should be critical to answer the question.
Categorize the keywords into entity and relation keywords.
keywords must be in root form and lowercase.
The response should be in following format, no additional text:
{"entity": [list of entity keywords], "relation": [list of relation keywords]}"""

response = get_llm_response(query, system_prompt_key_words)
keyword_resp = json.loads(response)
entity_keywords = keyword_resp.get('entity', [])
relation_keywords = keyword_resp.get('relation', [])

假设提取到的 entity_keywords[box, charger, phone],我们需要生成所有可能的实体对组合,以便全面查询图谱:

pairs = list(combinations(entities, 2))

对于每个实体对,在图中查找所有节点和边(路径):

paths = list(nx.all_simple_paths(G, source=u, target=target_nodes))

上述所有步骤(第 1-6 步)被整合在以下函数中:

def search_kg2(G, query):
    response = get_llm_response(query, system_prompt_key_words)
    keyword_resp = json.loads(response)
    entity_keywords = keyword_resp.get('entity', [])
    relation_keywords = keyword_resp.get('relation', [])
    entities = [part.strip() for part in entity_keywords]
    pairs = list(combinations(entities, 2))
    relations = []
    for u, v in pairs:
        target_nodes = get_nodes(G, v)
        paths = list(nx.all_simple_paths(G, source=u, target=target_nodes))
        for path in paths:
            for i in range(len(path)-1):
                for key in G[path[i]][path[i+1]]:
                    rel = G[path[i]][path[i+1]][key]['relation']
                    relations.append((path[i],rel, path[i+1]))

    for rel_keyword in relation_keywords:
        relations.extend([(u, rel, v) for u, v, rel in G.edges.data("relation") if str(rel) == rel_keyword])

    return relations

从上述函数获得所有以三元组形式表示的知识图谱边后,我们将它们嵌入到一个指令式提示词中,发送给 LLM 生成最终答案:

context = f"""
    You are given facts from a knowledge graph:

    {triples}

    Answer the user query based ONLY on these facts.
    Answer in full sentence.
    Query: {query}
    """
response = ollama.chat(model="gemma3:4b-it-qat",
             messages=[{"role": "user", "content": context}])
print(f'query: {query}nAnswer:{response["message"]["content"]}')

系统会返回如下答案:

如何使用 Knowledge Graph 和 LLM 构建构建问答系统

可以看到,对于知识图谱中缺乏相关事实的问题,LLM 会合理地拒绝回答。

本文所有代码可在以下文件中找到:
https://github.com/nayash/knowledge-graph-demo/blob/master/qa-from-kg.ipynb

局限性

如上所示,我们以较小的代价创建了一个基础的问答系统,因为 LLM 承担了文本预处理、信息抽取等大量工作。但该系统仍不完美,初步评估中发现了以下问题:

例如,系统无法回答 “what is the warranty period?”,因为“warranty”在图中是关系的标签,但从问题中被提取为命名实体,导致系统找不到对应的边。这表明用于构建知识图谱和抽取关键词的核心提示词仍有优化空间。

此外,一些问题需要经过轻微改写系统才能回答。这类问题通常可归因于知识图谱的构建方式或从查询中提取的关键词不准确。两者都可以通过改进提示词来修复。例如,当前图谱中存在这样一条边:phone → support_dual_sim → nano sim

这种方法仍有改进空间,但可以通过更精细地设计用于构建知识图谱的提示词来优化。正如本系列上一部分所讨论的,最初的提示词基于 ChatGPT 生成并进行了微调。在实际生产部署中,投入更多精力迭代和优化提示词至关重要。对于企业级应用,在资源充足的情况下,也可以考虑使用能力更强的大语言模型以获得更好的效果。

总体而言,结合知识图谱与 LLM 的问答系统架构前景广阔。未来,可以进一步探索将其与检索增强生成技术相结合,以综合提升答案的准确性和完整性。后续或许能通过设计更精细的提示词,并与 RAG 深度集成,来持续优化系统性能。


关注“鲸栖”小程序,掌握最新AI资讯

本文来自网络搜集,不代表鲸林向海立场,如有侵权,联系删除。转载请注明出处:http://www.itsolotime.com/archives/13509

(0)
上一篇 2025年11月13日 上午8:30
下一篇 2025年11月13日 上午11:40

相关推荐

  • 开发者都在用:全新的 Python 工作流(uv + Ruff + Pydantic v2)

    现代 Python 技术栈更快、更干净,效率提升 10× —— 这是开发者在 2026 年的升级方式 如果你写 Python 已经有一段时间了,你大概觉得自己的工作流“够用了”。你用 pip,建个 venv,偶尔跑一次 black,然后提交代码。 但我得说一句可能不太舒服的话: 你的工作流已经过时了。 并不是坏了——只是和 2026 年最优秀的 Python…

    2025年12月22日
    20900
  • DeepSeek OCR:颠覆传统,用视觉压缩破解AI扩展的“十亿美元级”文档处理难题

    Part I: 文本的“隐形重量” 我们通常认为文本是“轻”的:易于存储、传输和计算。但在大语言模型时代,文本变得非常“重”。 处理一张发票的PDF扫描件,就可能消耗1,000至5,000个tokens。将这个数量级乘以企业日志、法律合同、监管文件和数字化档案,总token量将变得极其庞大——其中大部分是冗余、昂贵且处理缓慢的。虽然OpenAI的GPT-4-…

    2025年10月31日
    19500
  • 周末实战:7个可上线级Agentic AI项目,助你打造高含金量作品集

    大家都在谈论自主 AI 智能体,仿佛它们只属于研究实验室和大型科技公司。但事实并非如此。到 2025 年,构建可用于生产环境的 Agentic AI 系统已经变得异常容易——而这正是招聘经理最希望看到的技能。 当其他人还在制作简单的 ChatGPT 封装应用时,你可以构建真正具备决策、工具使用、上下文记忆与协作能力的智能体系统。这些不仅仅是演示,而是能够展示…

    2025年12月20日
    37800
  • 淘宝AI狼人杀大赛:多智能体博弈平台WhoisSpy.ai如何用大模型重构社交推理游戏

    淘宝AI狼人杀大赛:多智能体博弈平台WhoisSpy.ai如何用大模型重构社交推理游戏(上) 一场令人“汗流浃背”的狼人杀对局正在上演:天崩开局的倒钩狼悍跳预言家、冲锋狼因言多必失、神职阵营掌控全场确保每晚都是平安夜……而最令人惊讶的是,这些高能玩家并非人类,而是由不同大模型驱动的AI智能体(Agent)。 这场颠覆传统游戏体验的AI狼人杀大乱斗,源自淘宝推…

    2025年12月23日
    36500
  • AI生成操作系统新突破!上海交大提出文件系统开发新范式:从此只需写规约

    还记得《流浪地球2》里的那台550W量子计算机吗? 电影里,MOSS最让人印象深刻的点,除了其强大算力,还有它可以根据需求,实时生成底层操作系统的能力。 如果现在告诉你,我们已经在从“人类需求”生成“底层系统”这件事上迈出了关键一步呢? 来自上海交大IPADS实验室的研究团队,面对自动生成操作系统核心组件的难题,做出了全新的尝试。这项研究成果也即将亮相文件系…

    2025年12月21日
    21100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注