如何使用 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

相关推荐

  • 企业推进大模型落地的关键工程与核心指标

    企业推进大模型落地,需统筹五大关键工程:算力工程是基础设施,关注规模、效率与服务;应用工程是价值门户,衡量业务覆盖与成效;模型工程是技术核心,驱动算法效能与迭代;知识工程是企业智库,负责知识的沉淀与复用;数据工程是循环血脉,确保数据的贯通与消费。五者协同,方能实现真正的业务智能化。

    2025年10月2日
    16100
  • Prompt与Context工程实战:解锁LLM高效沟通的核心技艺

    如果你一直在关注《Master LLMs》系列,那么你已经走过了从建立直觉到理解机制,再到学习关键原则的旅程。现在,我们将转向动手实践,聚焦于构建AI应用时,如何与大型语言模型(LLM)进行高效沟通的核心技艺。 许多人在使用LLM时并未意识到一个关键点: 模型非常聪明,但也非常“按字面理解”。 与LLM的沟通,并非像与人交谈那样简单。它既比想象中更直接,也比…

    2025年11月29日
    400
  • 构建智能数据库对话助手:基于RAG的Text-to-SQL聊天机器人实战

    本项目构建了一个由 AI 驱动的聊天机器人,能够将自然语言问题转换为 SQL 查询,并直接从 SQLite 数据库中检索答案。该应用结合了 LangChain、Hugging Face Embeddings 和 Chroma 向量存储,通过检索增强生成(RAG)工作流,将非结构化的用户输入与结构化数据库连接起来,并配备了 FastAPI 后端与 Stream…

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

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

    22小时前
    800
  • TritonForge:剖析引导+LLM协同,突破Triton内核优化瓶颈,成功率42.7%最高提速5倍

    TritonForge: Profiling-Guided Framework for Automated Triton Kernel Optimization https://arxiv.org/pdf/2512.09196 本文提出 TritonForge,一款基于剖析引导的自动化 Triton 内核优化框架,旨在解决现代机器学习中 GPU 内核优化耗时…

    12小时前
    700

发表回复

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