news 2026/5/13 10:34:32

Nanbeige4.1-3B Chainlit企业知识图谱:自动抽取实体关系并构建可视化图谱

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nanbeige4.1-3B Chainlit企业知识图谱:自动抽取实体关系并构建可视化图谱

Nanbeige4.1-3B Chainlit企业知识图谱:自动抽取实体关系并构建可视化图谱

你想过让AI帮你自动阅读公司文档,然后画出一张清晰的知识地图吗?这张地图能告诉你文档里提到了哪些人、哪些项目、哪些技术,以及它们之间有什么关系。今天,我们就来聊聊怎么用Nanbeige4.1-3B这个聪明的“小模型”,结合Chainlit这个好用的聊天界面,搭建一个能自动从企业文档中抽取知识并可视化展示的系统。

对于很多企业来说,内部积累了大量的文档、报告、邮件,但信息散落在各处,难以形成整体的知识网络。人工梳理费时费力。这个方案的核心,就是利用AI自动理解文本,识别出关键的实体(比如公司、产品、人物)和它们之间的关系,最终生成一个可视化的知识图谱,让你一眼看清知识的全貌。

1. 项目核心:为什么选择Nanbeige4.1-3B和Chainlit?

在开始动手之前,我们先快速了解一下这次要用到的两个核心工具。

1.1 Nanbeige4.1-3B:小而精的推理专家

你可能听说过一些动辄数百亿参数的大模型,它们能力很强,但对计算资源的要求也很高。Nanbeige4.1-3B是一个只有30亿参数的“小模型”,但它却在推理、逻辑判断和对齐人类偏好方面表现突出。

简单来说,它就像一个虽然体积小、但头脑特别清晰、善于逻辑分析的助手。对于知识图谱构建这种需要理解文本、推理实体关系的任务,它的推理能力正好派上用场。而且,因为模型小,它在普通的云服务器或本地机器上就能快速部署和响应,成本也低得多。

1.2 Chainlit:为AI应用量身定做的聊天界面

Chainlit是一个专门为基于大语言模型(LLM)的应用开发的前端框架。你可以把它理解成一个“开箱即用”的聊天机器人界面生成器。

它的好处是:

  • 开发快:用很少的代码就能做出一个功能完善的Web聊天界面。
  • 交互好:支持发送文字、上传文件(比如我们的企业文档),并以流式(一个字一个字)的方式显示AI的回复,体验很流畅。
  • 易集成:后端可以轻松连接像Nanbeige4.1-3B这样的模型服务。

我们的目标就是把Nanbeige4.1-3B的“大脑”和Chainlit的“脸面”结合起来,做一个能通过聊天窗口接收文档、分析文档、并返回知识图谱的实用工具。

2. 环境准备与快速部署

假设你已经在一个云服务器或本地环境里,并且已经通过类似CSDN星图这样的平台,一键部署好了基于vLLM的Nanbeige4.1-3B服务。vLLM是一个高性能的模型推理引擎,能让模型服务跑得更快。

2.1 验证模型服务

首先,我们确认一下模型服务是否已经在后台正常运行。通常,服务日志会输出到一个指定的文件。

打开终端,输入以下命令查看日志:

cat /root/workspace/llm.log

如果你在日志中看到模型加载成功、服务启动在某个端口(比如8000)的信息,就说明Nanbeige4.1-3B的API服务已经准备好了。

2.2 安装必要的Python库

接下来,我们需要创建一个Python环境,安装构建知识图谱应用所需的库。主要需要三个:

  1. Chainlit:用于构建前端Web应用。
  2. Requests:用于向后端的Nanbeige4.1-3B API服务发送请求。
  3. NetworkX & Matplotlib:用于在后台构建和绘制知识图谱(可视化部分我们稍后处理)。

打开终端,执行以下安装命令:

pip install chainlit requests networkx matplotlib

3. 构建企业知识图谱应用

现在进入核心部分:编写代码。我们将创建两个主要文件:一个负责与AI模型对话、抽取知识的后端逻辑;另一个是Chainlit的界面定义文件。

3.1 核心逻辑:知识抽取与图谱构建

我们创建一个名为knowledge_graph_builder.py的Python文件。这个文件里包含一个核心类,它主要做三件事:

  1. 调用Nanbeige4.1-3B模型,让它从文本中提取实体和关系。
  2. 将提取的结果整理成结构化的数据。
  3. (可选)用NetworkX库生成图谱数据。
# knowledge_graph_builder.py import requests import json import re from typing import List, Dict, Tuple import networkx as nx import matplotlib.pyplot as plt class KnowledgeGraphExtractor: def __init__(self, model_api_url: str = "http://localhost:8000/v1/completions"): """ 初始化抽取器,指定后端Nanbeige4.1-3B模型的API地址。 默认地址是本地8000端口,请根据你的实际部署情况修改。 """ self.api_url = model_api_url self.headers = {"Content-Type": "application/json"} def extract_from_text(self, text: str) -> Dict: """ 核心方法:将文本发送给模型,让其抽取实体和关系。 我们通过精心设计的提示词(Prompt)来引导模型输出结构化信息。 """ # 构建提示词。这部分是关键,需要清晰告诉模型我们要什么。 prompt = f"""请仔细分析以下文本,并提取其中所有重要的实体以及实体之间的关系。 文本内容: {text} 请按照以下JSON格式输出结果: {{ "entities": [ {{"name": "实体A名称", "type": "实体A类型(如:人物、组织、产品、技术等)"}}, {{"name": "实体B名称", "type": "实体B类型"}} // ... 更多实体 ], "relations": [ {{"from": "实体A名称", "to": "实体B名称", "relationship": "具体关系描述(如:就职于、开发了、使用了等)"}} // ... 更多关系 ] }} 只输出JSON格式,不要有任何其他解释。""" # 准备请求数据 data = { "prompt": prompt, "max_tokens": 1024, # 设置最大生成长度 "temperature": 0.1, # 温度调低,使输出更确定、更结构化 "stop": ["\n\n"] # 停止条件,避免生成多余内容 } try: response = requests.post(self.api_url, headers=self.headers, json=data, timeout=60) response.raise_for_status() # 检查请求是否成功 result = response.json() # 从模型返回中提取生成的文本 generated_text = result['choices'][0]['text'].strip() # 尝试从返回文本中解析JSON # 模型有时会在JSON外包含额外字符,这里用正则表达式提取 json_match = re.search(r'\{.*\}', generated_text, re.DOTALL) if json_match: graph_data = json.loads(json_match.group()) return graph_data else: print("模型返回格式不符合预期,尝试直接解析:", generated_text[:200]) # 如果提取失败,返回一个空结构 return {"entities": [], "relations": []} except requests.exceptions.RequestException as e: print(f"请求模型API失败: {e}") return {"entities": [], "relations": []} except json.JSONDecodeError as e: print(f"解析模型返回的JSON失败: {e}") print("原始返回:", generated_text[:500]) return {"entities": [], "relations": []} def visualize_graph(self, graph_data: Dict, save_path: str = "knowledge_graph.png"): """ 使用NetworkX和Matplotlib将抽取的知识图谱可视化并保存为图片。 这个功能可以在后端运行,然后将图片路径返回给前端显示。 """ G = nx.DiGraph() # 创建有向图 # 添加实体节点 for entity in graph_data.get("entities", []): G.add_node(entity["name"], type=entity["type"]) # 添加关系边 for relation in graph_data.get("relations", []): G.add_edge(relation["from"], relation["to"], label=relation["relationship"]) if G.number_of_nodes() == 0: print("没有提取到实体,无法生成图谱。") return None # 绘制图谱 plt.figure(figsize=(12, 10)) # 根据节点类型设置颜色 node_colors = [] for node in G.nodes(): node_type = G.nodes[node].get('type', '未知') # 简单映射类型到颜色 color_map = {'人物': 'lightblue', '组织': 'lightgreen', '产品': 'lightcoral', '技术': 'gold', '未知': 'gray'} node_colors.append(color_map.get(node_type, 'gray')) pos = nx.spring_layout(G, k=2, iterations=50) # 节点布局算法 nx.draw_networkx_nodes(G, pos, node_color=node_colors, node_size=2000, alpha=0.8) nx.draw_networkx_edges(G, pos, edge_color='gray', arrows=True, arrowstyle='-|>', arrowsize=20) nx.draw_networkx_labels(G, pos, font_size=10, font_weight='bold') # 绘制边标签(关系) edge_labels = nx.get_edge_attributes(G, 'label') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color='red') plt.title("企业知识图谱", fontsize=16) plt.axis('off') plt.tight_layout() plt.savefig(save_path, dpi=300, bbox_inches='tight') plt.close() print(f"知识图谱已保存至: {save_path}") return save_path # 示例:本地测试用 if __name__ == "__main__": extractor = KnowledgeGraphExtractor() sample_text = "张三是一名软件工程师,他就职于创新科技有限公司。该公司主要产品是‘智联’办公协同系统。该系统使用了微服务架构和容器化技术。" result = extractor.extract_from_text(sample_text) print("抽取结果:", json.dumps(result, indent=2, ensure_ascii=False)) if result["entities"]: extractor.visualize_graph(result)

3.2 前端界面:Chainlit应用

接下来,我们创建Chainlit的应用入口文件app.py。这个文件会定义一个Web应用,用户可以通过它上传文档或粘贴文本,然后看到AI分析出的知识图谱。

# app.py import chainlit as cl import tempfile import os from knowledge_graph_builder import KnowledgeGraphExtractor # 初始化我们的知识图谱抽取器 # 注意:这里的API地址需要修改为你实际部署的Nanbeige4.1-3B服务地址 graph_extractor = KnowledgeGraphExtractor(model_api_url="http://localhost:8000/v1/completions") @cl.on_chat_start async def start(): """ 聊天开始时的初始化操作。 可以在这里设置欢迎信息。 """ await cl.Message( content="你好!我是企业知识图谱助手。你可以直接粘贴一段文本,或者上传一个.txt/.md/.pdf文件,我将自动抽取其中的实体和关系,并为你生成知识图谱。" ).send() @cl.on_message async def main(message: cl.Message): """ 处理用户发送的消息。 """ user_input = message.content files = message.elements # 用户上传的文件 text_to_analyze = "" # 1. 处理上传的文件 if files: for file in files: # 这里简单处理,假设是文本文件。实际应用中可能需要解析PDF、Word等 if file.name.endswith(('.txt', '.md')): with open(file.path, 'r', encoding='utf-8') as f: text_to_analyze += f.read() + "\n\n" # 可以在这里添加对其他文件格式(如PDF)的解析支持 await cl.Message(content=f"已读取上传文件,开始分析...").send() # 2. 处理直接输入的文本 elif user_input.strip(): text_to_analyze = user_input else: await cl.Message(content="请输入文本或上传文件以进行分析。").send() return # 显示一个“正在思考”的指示器 msg = cl.Message(content="") await msg.send() # 逐步更新消息,模拟思考过程 await msg.stream_token("正在调用AI模型分析文本内容...\n") # 3. 调用核心抽取器 graph_data = graph_extractor.extract_from_text(text_to_analyze) if not graph_data.get("entities"): await msg.stream_token("未能从文本中提取到明确的实体和关系。请尝试提供更具体、信息更丰富的文本。") return await msg.stream_token(f"分析完成!共识别出 {len(graph_data['entities'])} 个实体和 {len(graph_data['relations'])} 条关系。\n") # 4. 展示抽取的原始结果(文本形式) result_text = "**抽取结果摘要:**\n\n" result_text += "**实体列表:**\n" for entity in graph_data["entities"]: result_text += f"- {entity['name']} ({entity['type']})\n" result_text += "\n**关系列表:**\n" for rel in graph_data["relations"]: result_text += f"- {rel['from']} --[{rel['relationship']}]--> {rel['to']}\n" await msg.stream_token(result_text) # 5. 生成并展示可视化图谱 await msg.stream_token("\n正在生成知识图谱可视化...") try: # 使用临时文件保存生成的图片 with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmpfile: image_path = tmpfile.name # 调用可视化方法 saved_path = graph_extractor.visualize_graph(graph_data, save_path=image_path) if saved_path and os.path.exists(saved_path): # 将图片作为消息的一部分发送给前端 image = cl.Image(path=saved_path, name="knowledge_graph", display="inline") await msg.stream_token("生成成功!图谱如下:") # 更新最终消息,包含文本和图片 msg.elements = [image] msg.content = msg.content + "\n\n**知识图谱可视化:**" await msg.update() # 清理临时文件(可选) # os.unlink(saved_path) else: await msg.stream_token("图谱生成失败。") except Exception as e: await msg.stream_token(f"生成可视化图谱时出错: {e}") # 设置Chainlit应用配置 @cl.set_chat_profiles async def chat_profile(): return [ cl.ChatProfile( name="知识图谱助手", markdown_description="专用于从企业文档中自动构建知识图谱。" ) ]

4. 运行你的企业知识图谱助手

代码写好了,现在让我们把它跑起来。

4.1 启动Chainlit应用

在终端中,确保你的当前目录下包含了app.pyknowledge_graph_builder.py两个文件,然后运行:

chainlit run app.py

如果一切正常,终端会输出类似下面的信息,告诉你应用已经启动,并提供了一个本地访问地址(通常是http://localhost:8000)。

Your app is available at http://localhost:8000

4.2 在浏览器中使用

  1. 打开浏览器,访问终端中显示的地址(如http://localhost:8000)。
  2. 你会看到一个简洁的聊天界面。
  3. 方式一(输入文本):在底部输入框,粘贴一段企业相关的文本。例如:

    “项目经理李四向技术总监王五汇报了‘星海’项目的进展。该项目使用Python和React框架,数据库选用PostgreSQL,预计下季度上线。市场部的赵六正在准备推广方案。”

  4. 方式二(上传文件):点击输入框旁的附件图标,上传一个纯文本文件(.txt.md)。
  5. 点击发送。
  6. 稍等片刻,界面会先显示AI分析出的实体和关系列表,紧接着就会显示一张自动生成的知识图谱图片!

4.3 看看效果

对于上面那段示例文本,系统可能会返回如下结果:

实体列表:

  • 李四 (人物)
  • 王五 (人物)
  • 星海项目 (产品)
  • Python (技术)
  • React (技术)
  • PostgreSQL (技术)
  • 赵六 (人物)
  • 市场部 (组织)

关系列表:

  • 李四 --[向...汇报]--> 王五
  • 李四 --[负责]--> 星海项目
  • 星海项目 --[使用]--> Python
  • 星海项目 --[使用]--> React
  • 星海项目 --[使用]--> PostgreSQL
  • 赵六 --[属于]--> 市场部
  • 赵六 --[准备...方案]--> 星海项目

生成的图谱会将上述实体用节点表示,关系用带箭头的边表示,不同类型实体节点颜色不同,一目了然。

5. 进阶优化与实践建议

现在你已经有了一个可用的原型。为了让它在企业环境中更实用,这里有一些优化思路:

5.1 提升抽取准确性

  • 优化提示词(Prompt)knowledge_graph_builder.py中的prompt模板是效果的关键。你可以根据你的行业术语(如金融、医疗、法律)进一步细化实体类型和关系描述,让模型更精准。例如,明确列出你关心的实体类型:“人物、公司、产品、法规、风险点”
  • 后处理与校验:AI的抽取结果可能有误或重复。可以添加后处理代码,比如合并相同的实体(“创新科技”和“创新科技有限公司”)、过滤掉置信度低的关系。
  • 尝试Few-Shot示例:在Prompt中给模型一两个完美抽取的例子,能显著提升它在类似文本上的表现。

5.2 扩展功能与集成

  • 支持更多文件格式:在app.pyon_message函数中,可以集成PyPDF2(PDF)、python-docx(Word)等库来解析更多格式的企业文档。
  • 批量处理与知识库:修改应用,使其能扫描整个文件夹的文档,批量构建一个庞大的、可查询的知识图谱,并存入图数据库(如Neo4j)。
  • 集成到内部系统:将Chainlit应用打包,通过Docker部署,提供API接口,集成到公司的OA、Wiki或CRM系统中。

5.3 处理可能遇到的问题

  • 模型API连接失败:检查app.pyknowledge_graph_builder.py中的model_api_url是否正确,并确保Nanbeige4.1-3B的vLLM服务正在运行。
  • 抽取结果为空:可能是文本太短或太模糊,尝试提供更丰富、更结构化的文本。也可能是Prompt不够清晰,需要调整。
  • 图谱可视化布局混乱:如果实体和关系太多,spring_layout可能效果不佳。可以尝试其他布局算法,如circular_layoutkamada_kawai_layout,或者使用更专业的可视化库如pyvis生成交互式网页图谱。

6. 总结

通过这个项目,我们完成了一个从想法到实现的完整流程:利用Nanbeige4.1-3B这个高效的小模型作为“大脑”进行智能推理和抽取,利用Chainlit快速搭建起一个用户友好的交互“界面”,最终实现对企业文本的自动化知识图谱构建与可视化

这个方案的优点在于:

  • 轻量高效:30亿参数的模型在性能和资源消耗上取得了很好的平衡。
  • 开发快捷:Chainlit极大简化了前端开发工作。
  • 效果直观:从非结构化的文本到结构化的图谱,信息价值被直观呈现。

你可以以此为基础,根据自己企业的特定需求进行定制和深化,比如针对财务报告、技术专利、客户反馈等不同场景优化模型Prompt,或将其发展为公司内部的一个智能知识中枢。动手试试吧,你会发现让AI帮你理清复杂信息,并没有想象中那么难。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

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

Godot资源包解析工具:从问题诊断到跨场景应用指南

Godot资源包解析工具:从问题诊断到跨场景应用指南 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 问题诊断:当资源提取成为开发瓶颈 你是否遭遇过这些开发困境:从…

作者头像 李华
网站建设 2026/4/18 20:29:08

3步解锁音乐自由:让加密音频重获跨平台播放能力

3步解锁音乐自由:让加密音频重获跨平台播放能力 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 在数字音乐版权保护与用户使用便利性的平衡中,音乐格式转换成为连接两者的关键技术。本文将系统解析NCM加密格式…

作者头像 李华
网站建设 2026/4/18 20:29:09

网页资源捕获浏览器扩展:技术原理与应用指南

网页资源捕获浏览器扩展:技术原理与应用指南 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 网页资源下载是许多用户在日常网络使用中经常遇到的需求,但传统方法往往需要复杂的…

作者头像 李华
网站建设 2026/4/18 20:29:13

baidupankey:解决百度网盘提取码获取难题的智能解析方案

baidupankey:解决百度网盘提取码获取难题的智能解析方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 目标:突破提取码壁垒 | 方法:AI驱动的智能检索技术 | 收益:实现资源获取…

作者头像 李华
网站建设 2026/4/18 20:28:39

由于我不断面试Web前端,发现了大厂的共通点...

前端面试想出彩,真不是背得多就行,关键是回答得有条理、细节到位、说起来有感染力。其实拉开差距的就四个短板,避开就赢一半: 1.JavaScript 基础别只懂皮毛,核心考点得吃透。 原型链、作用域、闭包、事件循环这些要是…

作者头像 李华
网站建设 2026/4/18 20:29:09

颠覆级开源工具QMCDecode全解析:让QQ音乐加密文件重获自由

颠覆级开源工具QMCDecode全解析:让QQ音乐加密文件重获自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…

作者头像 李华