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环境安装构建知识图谱应用所需的库。主要需要三个Chainlit用于构建前端Web应用。Requests用于向后端的Nanbeige4.1-3B API服务发送请求。NetworkX Matplotlib用于在后台构建和绘制知识图谱可视化部分我们稍后处理。打开终端执行以下安装命令pip install chainlit requests networkx matplotlib3. 构建企业知识图谱应用现在进入核心部分编写代码。我们将创建两个主要文件一个负责与AI模型对话、抽取知识的后端逻辑另一个是Chainlit的界面定义文件。3.1 核心逻辑知识抽取与图谱构建我们创建一个名为knowledge_graph_builder.py的Python文件。这个文件里包含一个核心类它主要做三件事调用Nanbeige4.1-3B模型让它从文本中提取实体和关系。将提取的结果整理成结构化的数据。可选用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, headersself.headers, jsondata, timeout60) 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], typeentity[type]) # 添加关系边 for relation in graph_data.get(relations, []): G.add_edge(relation[from], relation[to], labelrelation[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, k2, iterations50) # 节点布局算法 nx.draw_networkx_nodes(G, pos, node_colornode_colors, node_size2000, alpha0.8) nx.draw_networkx_edges(G, pos, edge_colorgray, arrowsTrue, arrowstyle-|, arrowsize20) nx.draw_networkx_labels(G, pos, font_size10, font_weightbold) # 绘制边标签关系 edge_labels nx.get_edge_attributes(G, label) nx.draw_networkx_edge_labels(G, pos, edge_labelsedge_labels, font_colorred) plt.title(企业知识图谱, fontsize16) plt.axis(off) plt.tight_layout() plt.savefig(save_path, dpi300, bbox_inchestight) 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, indent2, ensure_asciiFalse)) 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_urlhttp://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, encodingutf-8) as f: text_to_analyze f.read() \n\n # 可以在这里添加对其他文件格式如PDF的解析支持 await cl.Message(contentf已读取上传文件开始分析...).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, deleteFalse) as tmpfile: image_path tmpfile.name # 调用可视化方法 saved_path graph_extractor.visualize_graph(graph_data, save_pathimage_path) if saved_path and os.path.exists(saved_path): # 将图片作为消息的一部分发送给前端 image cl.Image(pathsaved_path, nameknowledge_graph, displayinline) 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.py和knowledge_graph_builder.py两个文件然后运行chainlit run app.py如果一切正常终端会输出类似下面的信息告诉你应用已经启动并提供了一个本地访问地址通常是http://localhost:8000。Your app is available at http://localhost:80004.2 在浏览器中使用打开浏览器访问终端中显示的地址如http://localhost:8000。你会看到一个简洁的聊天界面。方式一输入文本在底部输入框粘贴一段企业相关的文本。例如“项目经理李四向技术总监王五汇报了‘星海’项目的进展。该项目使用Python和React框架数据库选用PostgreSQL预计下季度上线。市场部的赵六正在准备推广方案。”方式二上传文件点击输入框旁的附件图标上传一个纯文本文件.txt或.md。点击发送。稍等片刻界面会先显示AI分析出的实体和关系列表紧接着就会显示一张自动生成的知识图谱图片4.3 看看效果对于上面那段示例文本系统可能会返回如下结果实体列表李四 (人物)王五 (人物)星海项目 (产品)Python (技术)React (技术)PostgreSQL (技术)赵六 (人物)市场部 (组织)关系列表李四 --[向...汇报]-- 王五李四 --[负责]-- 星海项目星海项目 --[使用]-- Python星海项目 --[使用]-- React星海项目 --[使用]-- PostgreSQL赵六 --[属于]-- 市场部赵六 --[准备...方案]-- 星海项目生成的图谱会将上述实体用节点表示关系用带箭头的边表示不同类型实体节点颜色不同一目了然。5. 进阶优化与实践建议现在你已经有了一个可用的原型。为了让它在企业环境中更实用这里有一些优化思路5.1 提升抽取准确性优化提示词Promptknowledge_graph_builder.py中的prompt模板是效果的关键。你可以根据你的行业术语如金融、医疗、法律进一步细化实体类型和关系描述让模型更精准。例如明确列出你关心的实体类型“人物、公司、产品、法规、风险点”。后处理与校验AI的抽取结果可能有误或重复。可以添加后处理代码比如合并相同的实体“创新科技”和“创新科技有限公司”、过滤掉置信度低的关系。尝试Few-Shot示例在Prompt中给模型一两个完美抽取的例子能显著提升它在类似文本上的表现。5.2 扩展功能与集成支持更多文件格式在app.py的on_message函数中可以集成PyPDF2PDF、python-docxWord等库来解析更多格式的企业文档。批量处理与知识库修改应用使其能扫描整个文件夹的文档批量构建一个庞大的、可查询的知识图谱并存入图数据库如Neo4j。集成到内部系统将Chainlit应用打包通过Docker部署提供API接口集成到公司的OA、Wiki或CRM系统中。5.3 处理可能遇到的问题模型API连接失败检查app.py和knowledge_graph_builder.py中的model_api_url是否正确并确保Nanbeige4.1-3B的vLLM服务正在运行。抽取结果为空可能是文本太短或太模糊尝试提供更丰富、更结构化的文本。也可能是Prompt不够清晰需要调整。图谱可视化布局混乱如果实体和关系太多spring_layout可能效果不佳。可以尝试其他布局算法如circular_layout或kamada_kawai_layout或者使用更专业的可视化库如pyvis生成交互式网页图谱。6. 总结通过这个项目我们完成了一个从想法到实现的完整流程利用Nanbeige4.1-3B这个高效的小模型作为“大脑”进行智能推理和抽取利用Chainlit快速搭建起一个用户友好的交互“界面”最终实现对企业文本的自动化知识图谱构建与可视化。这个方案的优点在于轻量高效30亿参数的模型在性能和资源消耗上取得了很好的平衡。开发快捷Chainlit极大简化了前端开发工作。效果直观从非结构化的文本到结构化的图谱信息价值被直观呈现。你可以以此为基础根据自己企业的特定需求进行定制和深化比如针对财务报告、技术专利、客户反馈等不同场景优化模型Prompt或将其发展为公司内部的一个智能知识中枢。动手试试吧你会发现让AI帮你理清复杂信息并没有想象中那么难。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

当AI编程越来越快,Vibe Coding为什么反而更需要工程尺度?

当AI编程越来越快,Vibe Coding为什么反而更需要工程尺度?

过去一年,AI编程的变化几乎是肉眼可见的。模型更新频率在加快,IDE形态在演进,对话式生成逐渐成为主流写代码方式。很多开发者第一次感受到一种前所未有的顺滑感:需求用自然语言描述几句,代码就已经在那里;页…

2026/7/6 20:17:09 阅读更多 →
如何突破抢票瓶颈?DamaiHelper自动化方案全攻略

如何突破抢票瓶颈?DamaiHelper自动化方案全攻略

如何突破抢票瓶颈?DamaiHelper自动化方案全攻略 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在演唱会门票秒光的时代,手动抢票如同在人山人海中争夺一张入场券。而Dama…

2026/7/6 16:45:15 阅读更多 →
3步解锁音乐自由:让加密音频重获跨平台播放能力

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

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

2026/7/7 0:02:41 阅读更多 →

最新新闻

Kubeflow实战指南:构建可交付的端到端机器学习流水线

Kubeflow实战指南:构建可交付的端到端机器学习流水线

1. 为什么我们需要 Kubeflow:从“能跑通”到“可交付”的真实断层你有没有过这样的经历?在本地 Jupyter Notebook 里,用 Scikit-learn 训练一个随机森林模型,准确率 92%,代码清爽,逻辑清晰,连注…

2026/7/7 22:00:01 阅读更多 →
SQL Join本质是数据关系翻译,不是拼表语法题

SQL Join本质是数据关系翻译,不是拼表语法题

1. 项目概述:为什么“SQL Join”不是语法题,而是数据关系的翻译器 “Introduction to SQL Joins”——这个标题看起来像教科书第一章,但在我带过37个真实业务团队、处理过2100次线上数据取数需求后,我越来越确信: 绝大…

2026/7/7 21:57:54 阅读更多 →
Python垃圾回收机制深度解析:代际回收、循环引用与调优实战

Python垃圾回收机制深度解析:代际回收、循环引用与调优实战

1. 项目概述:为什么Python的垃圾回收不是“设好就忘”的后台服务Python开发者常有个错觉:对象用完就丢,解释器自会收拾残局——毕竟del obj之后内存似乎就“干净”了。但真实场景里,你写完一个数据处理脚本,跑着跑着内…

2026/7/7 21:55:54 阅读更多 →
Runway视频生成三模型对比:4K画质、快速原型与实时应用实战

Runway视频生成三模型对比:4K画质、快速原型与实时应用实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在寻找能够真正提升视频生成质量的新工具,Runway最新推出的三款模型值得重点关注。这次发布的Seedance 4K、Seeda…

2026/7/7 21:53:53 阅读更多 →
勒索病毒应急响应实战指南:从隔离遏制到系统加固的完整路径

勒索病毒应急响应实战指南:从隔离遏制到系统加固的完整路径

1. 当勒索病毒敲响企业大门:一份来自一线的实战响应指南“服务器所有文件都被加密了,后缀变成了.locked,桌面上留了一个勒索信!”——这可能是IT管理员最不想在深夜或清晨接到的电话。勒索病毒攻击早已不是新闻,但它对…

2026/7/7 21:51:52 阅读更多 →
2026年AI开发者工具链盘点:从模型调用到应用上线全链路

2026年AI开发者工具链盘点:从模型调用到应用上线全链路

写在前面做 AI 应用一年多,工具链换了好几轮。最早只用 OpenAI SDK 直连,后来加向量库,再加框架,再加中转站,再加监控——到现在基本稳定下来了。这篇文章盘点我目前在用的完整工具链,从模型调用到应用上线…

2026/7/7 21:51:52 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻