news 2026/4/22 20:08:36

基于FAQ文档构建知识图谱实战教程:结合LLM打造智能问答系统!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于FAQ文档构建知识图谱实战教程:结合LLM打造智能问答系统!

简介

本文介绍了一种基于FAQ文档构建知识图谱并结合LLM的问答系统实现方法。通过从用户问题中抽取实体和关系,在知识图谱中查找相关路径,然后将这些信息与问题一起提供给LLM生成答案。文章详细展示了代码实现过程,并讨论了系统局限性及改进方向,如优化prompt设计和结合RAG技术提升回答质量。


基于模拟 FAQ 文档构建的 knowledge graph

今天我带来一个基于 knowledge graph(用第一部分介绍的方法构建)和 LLM(这里用的是 Gemma3–4b-it-qat,与之前相同)的简易 Question Answer (QA) System。我选择使用 Gemma3–4b,是因为它体量足够小,可以在普通笔记本上运行,同时又非常擅长遵循指令。若你需要关于 KG、Gemma3 或如何在本地运行 LLM 的更多背景与信息,建议先快速浏览我上一篇文章。

在这篇博客中,我们会用一个关于假想智能手机的 FAQ 文本作为样例,利用上一篇文章中的代码(同一仓库)为其生成 knowledge graph,然后搭建一个系统来回答与该产品相关的问题,就像这样:

一些问答示例

在本文中,我们将学习:

  1. 什么是 QA System
  2. 了解我们的思路
  3. 查看代码
  4. 讨论局限与改进方向

一、什么是 QA System

引用 Google 的定义:

A question answering (QA) system is a software application that takes a user’s question in natural language and provides a direct, relevant answer by processing the question’s intent and retrieving information from a knowledge source or generating a new response.

在本文中,我们的 “knowledge source” 是我用 Gemma3 生成的一段模拟 FAQ 文本,你可以在这篇博客的 Github 仓库 中找到。我们可以运行仓库的 main.py 来构建 KG 并将其保存到输出目录:

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

该命令会将 networkx graph 保存为文件 “nx_graph.pkl”,稍后在构建 QA system 时会加载它。

二、我们的思路

核心思路是:从用户问题中抽取 entities/keywords,找到与它们相关的所有 nodes 与 edges,然后将这些信息与问题一起提供给 LLM,让其基于 KG 中的信息进行回答。我们把方案正式化如下。

给定一个问题q,以及基于任意语料构建的 knowledge graph (G):

  1. 使用 LLM 从q中抽取 named entities(entity_keywords)和 relations/predicates(relation_keywords)。
  2. entity_keywords中枚举所有可能的成对组合。这使我们之后可以用 source 和 target 参数查询图,因为我们无法预先假设某个 entity 是 source 还是 target。
  3. 对于第 2 步得到的每一对 (u, v),在 G 中查找uv之间的所有路径。这样可以找出两个实体之间的所有 relations/paths/knowledge。引入这一步是个 game-changer。
  4. 对于找到的每条路径(source 与 target node),提取它们之间的 relation。例如 (box, include, charger)。
  5. 将形成的 “triple” 加入列表relations
  6. relation_keywords做类似处理。对于每个 relationr,找到所有由r连接的 edges,形成 triples 并加入同一列表relations
  7. 最后一步,将这些 triples 与问题q一起(封装在一个 prompt 中)传给 LLM,让其基于给定事实(triples)与查询生成答案。

三、代码实现

首先,用 main.py 构建 knowledge graph:

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

然后从上一步生成的 pickle 文件中加载 graph:

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

我们需要定义一个函数,能够接收文本输入与 system level prompt,并从 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

接下来需要从给定 query 中抽取 entities 和 relations(对应上文的第 1 步)。我构造了一个基础的 system prompt,如下所示:

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],我们需要找出所有可能的 source-target 成对组合,以便对图做全面查询:

pairs = list(combinations(entities, 2))

对每个实体对,我们需要在图中查找所有 nodes 与 edges:

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 inrange(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") ifstr(rel) == rel_keyword]) return relations

当我们从上述函数得到所有用 triples(entity->relation->entity)表示的 edges 后,就将这些 triples 嵌入到一个指令式 prompt 中传给 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"]}')

它会返回如下这类答案:

如你所见,对于缺乏相关数据/事实的问题,LLM 会合理地拒绝作答。

四、局限性

如上所示,我们几乎没费太多力气就创建了一个基础的 QA system,因为 LLM 负责了大量工作,比如文本预处理、抽取等。但它还不完美。在我的初步评估中,至少发现了几个问题。

系统无法回答 “what is the warranty period?”,因为在图里 warranty 是 relation 的 label,但它从问题中被抽取成了 named entity,导致系统找不到任何 edge。因此,我们用于构建 knowledge graph 的核心 system prompt 还需要优化。

还有一些问题需要稍微改写后系统才能回答。但我发现这类问题最终都可以归因于 KG 的构建方式或从 query 中抽取的 keyword。两者都可以通过改进 prompts 来修复。比如,我使用的图中有一条 edge 是:

phone → support_dual_sim → nano sim

这显然并不理想。但这些都可以通过更谨慎地设计用于构建 KG 的 prompt 来修正。正如我在上一篇文章中提到的,我最初是用 chatGPT 生成的 prompt,并在此基础上略作修改。在真实生产场景中,应当花更多时间打磨 prompt。对于企业级应用,还可以尝试更大的 model,因为资源限制不再是问题。

总之,这种方法很有前景,并且可以与 RAG 结合来提升回答质量。或许在下一篇博客中,我会用更精细的 prompts 与 RAG 继续改进这个系统。

五、如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

第一阶段:从大模型系统设计入手,讲解大模型的主要方法;

第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 10:37:08

TradingVue.js 完全掌握:构建下一代金融数据可视化交易图表

TradingVue.js 完全掌握:构建下一代金融数据可视化交易图表 【免费下载链接】trading-vue-js 💹 Hackable charting lib for traders. You can draw literally ANYTHING on top of candlestick charts. [Not Maintained] 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/4/21 10:53:09

终极指南:如何使用ms.js轻松处理JavaScript时间转换

终极指南:如何使用ms.js轻松处理JavaScript时间转换 【免费下载链接】ms 项目地址: https://gitcode.com/gh_mirrors/msj/ms.js 时间处理是每个开发者都会遇到的常见需求,无论是设置定时器、计算倒计时,还是格式化时间显示&#xff0…

作者头像 李华
网站建设 2026/4/20 7:34:38

AI如何帮你快速实现凯撒密码转换器

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个凯撒密码转换器,支持加密和解密功能。用户输入文本和位移数,程序自动进行凯撒密码转换。要求:1. 提供简洁的用户界面;2. 支持…

作者头像 李华
网站建设 2026/4/21 8:12:09

Java小白也能懂的computeIfAbsent图解教程

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个面向初学者的computeIfAbsent教学示例,要求:1) 用生活中图书馆借书的例子做类比;2) 包含分步骤的代码演示;3) 每个步骤有对应…

作者头像 李华
网站建设 2026/4/21 11:11:13

轻量级AI编程革命:MiniMax-M2如何以100亿参数重塑智能体开发格局

在AI模型参数规模不断膨胀的当下,MiniMax-M2以仅100亿激活参数的创新架构,在编程与智能体开发领域掀起了一场"小而美"的技术革命。这款基于混合专家(MoE)架构的开源大模型,正以其卓越的性能表现和显著的成本…

作者头像 李华
网站建设 2026/4/22 16:06:23

无人机操控模式切换全攻略

无人机操控模式切换全攻略无人机的"美国手"、"日本手"和"中国手"是指遥控器摇杆功能的三种不同分配方式,切换模式只需在APP或遥控器菜单中简单设置,但需注意安全操作和适应练习。一、切换前须知默认设置:消费级…

作者头像 李华