一个企业级的「多Agent协作」知识管理系统
4个AI Agent分工协作,完成企业知识的全生命周期管理:文档解析 → 知识抽取 → 智能问答 → 增量更新
AgentKnowledgeHub 包含 4个核心Agent,通过 LangGraph 有向图编排,实现企业知识的全链路智能处理。
| Agent | 中文名 | 职责 | 类比理解 |
|---|---|---|---|
DocParserAgent |
文档解析Agent | 把PDF/图片/表格等各种格式的文档"读懂",切割成小段落 | 超强秘书,能看懂任何格式的文件 |
KnowledgeExtractAgent |
知识抽取Agent | 从文本中自动提取人名、公司、关系等结构化信息 | 分析师,把信息整理成知识图谱 |
QAAgent |
问答Agent | 接收用户问题,同时查向量库和知识图谱,生成精准答案 | 专家顾问,综合多源信息回答 |
KnowledgeUpdateAgent |
知识更新Agent | 监听文档变更,只更新变化的部分,保持知识库最新 | 勤快管理员,实时维护知识库 |
| 亮点 | 说明 | 解决什么问题 |
|---|---|---|
| 多模态RAG | 不只处理文字,还能理解PDF里的图片、表格、流程图 | 传统系统只能处理纯文字 |
| GraphRAG (知识图谱) | 用图数据库存储实体关系,支持多跳推理 | 纯向量检索无法处理"关系型"和"多步推理"问题 |
| CDC增量更新 | 文档变了只更新变化的部分 | 传统方案每次全量重建,1000个文档改5个要30分钟 |
| 记忆系统 | 支持会话记忆、用户画像和个性设置 | 提供个性化对话体验 |
┌──────────────────────────────────────────────────────────┐
│ 用户接口层 │
│ REST API / Vue Web UI / SDK │
└──────────────┬───────────────────────────┬───────────────┘
│ │
┌──────────────▼───────────────────────────▼───────────────┐
│ 编排引擎 (LangGraph 有向图) │
│ ┌─────────────┬──────────────┬──────────────┐ │
│ │ 文档入库流程 │ 问答流程 │ 增量更新流程 │ │
│ └──────┬──────┴──────┬───────┴──────┬───────┘ │
└───────────│─────────────│──────────────│─────────────────┘
│ │ │
┌───────────▼──┐ ┌───────▼────┐ ┌───────▼──────┐ ┌────────────┐
│ 文档解析Agent │ │ 问答Agent │ │ 知识更新Agent │ │ 知识抽取Agent│
│ │ │ │ │ │ │ │
│ - PDF解析 │ │ - 意图识别 │ │ - 文件监听 │ │ - NER实体识别│
│ - 图片OCR │ │ - 向量检索 │ │ - CDC消费 │ │ - 关系抽取 │
│ - 表格提取 │ │ - 图谱检索 │ │ - 差量对比 │ │ - 事件抽取 │
│ - 文档分块 │ │ - 混合排序 │ │ - 增量更新 │ │ - 三元组生成│
└──────┬───────┘ │ - 答案生成 │ │ - 版本管理 │ └─────┬──────┘
│ └──┬────┬────┘ └──────┬───────┘ │
│ │ │ │ │
┌──────▼────────────▼────│─────────────▼───────────────▼──┐
│ 存储层 │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ChromaDB / │ │ Neo4j │ │ SQLite │ │
│ │ PGVector │ │ 知识图谱 │ │ 记忆存储 │ │
│ │ 向量数据库 │ │ │ │ │ │
│ └─────────────┘ └──────────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────────┘
流水线1:文档入库(上传文档时触发)
用户上传文档
│
▼
文档解析Agent ←── 支持 PDF / Word / Excel / 图片 / Markdown
├── 识别文件类型
├── 解析内容(文字 + 图片OCR + 表格提取)
└── 切割成小块(Chunk)
│
▼
知识抽取Agent
├── 命名实体识别(NER):找出人名、公司名、地名等
├── 关系抽取:找出实体之间的关系
└── 生成三元组:("张三", "就职于", "腾讯")
│
├──────────────────────────────┐
▼ ▼
存入向量数据库 存入知识图谱
(ChromaDB/PGVector) (Neo4j)
流水线2:智能问答(用户提问时触发)
用户提问:"张三负责什么业务?和李四有什么合作关系?"
│
▼
意图识别 + 查询改写
│
├──────────────────┐
▼ ▼
向量检索 图谱检索
(语义相似度) (关系路径查询)
│ │
└────────┬─────────┘
▼
混合重排序
(图谱结果权重更高,因为更精准)
│
▼
LLM生成答案
│
▼
返回答案 + 来源引用
流水线3:增量更新(文档修改时触发)
文档被修改 / 数据库记录更新
│
▼
CDC事件产生(通过文件监听或Kafka)
│
▼
知识更新Agent
├── 差量分析:找出哪些部分变了
├── 增量解析:只重新处理变化的内容
└── 版本管理:记录更新时间和版本号
│
├──────────────┐
▼ ▼
更新向量库 更新知识图谱
| 组件 | 技术选型 | 为什么选它 |
|---|---|---|
| Agent编排 | LangGraph | 2025年生产级Agent编排标准,有向图 + 状态持久化 |
| LLM调用 | LangChain + OpenAI | 最成熟的LLM应用框架,支持几十种LLM |
| 向量数据库 | ChromaDB / PGVector | ChromaDB开箱即用;PGVector适合已有PostgreSQL的企业 |
| 知识图谱 | Neo4j | 图数据库的事实标准,Cypher查询语言强大 |
| 消息队列 | Apache Kafka | CDC事件流处理的工业标准 |
| API框架 | FastAPI | 异步高性能,自动生成OpenAPI/Swagger文档 |
| 文档解析 | Unstructured + PyPDF2 + Tesseract | 多模态文档解析全家桶 |
| 容器化 | Docker Compose | 一键启动所有依赖服务 |
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 框架 | Vue 3 | 渐进式JavaScript框架,Composition API |
| UI组件库 | Element Plus | Vue 3生态最成熟的UI组件库 |
| HTTP客户端 | Axios | 流行的HTTP客户端库 |
在开始之前,你需要安装:
- Docker Desktop(用于一键启动依赖服务)
- Python 3.10+(后端开发)
- Node.js 18+(前端开发)
- 一个 OpenAI API Key(或者用国内兼容接口,见下方FAQ)
git clone https://github.com/bcefghj/agent-knowledge-hub.git
cd agent-knowledge-hubcd python
cp .env.example .env用任意编辑器打开 .env,填入你的配置:
# OpenAI配置(必填)
OPENAI_API_KEY=sk-你的APIKey
OPENAI_BASE_URL=https://api.openai.com/v1 # 国内用户可替换为兼容接口地址
# 数据库配置(使用Docker默认值即可,不用改)
NEO4J_URI=bolt://localhost:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=password
CHROMA_HOST=localhost
CHROMA_PORT=8000
KAFKA_BOOTSTRAP_SERVERS=localhost:9092# 回到项目根目录
cd ..
# 启动所有依赖(Neo4j、ChromaDB、Kafka)
docker-compose up -d等待约1分钟,然后检查服务状态:
docker-compose ps你应该看到所有服务状态为 Up。
cd python
pip install -r requirements.txt
python -m api.main看到 Uvicorn running on http://0.0.0.0:8080 就说明启动成功了!
cd fontend/vue-aapp
npm install
npm run serve前端服务将在 http://localhost:8081 启动。
打开浏览器访问 http://localhost:8080/docs,可以看到交互式API文档。
或者用命令行:
# 健康检查
curl http://localhost:8080/api/health
# 上传一个文档
curl -X POST http://localhost:8080/api/ingest/upload \
-F "file=@你的文档.pdf"
# 提问
curl -X POST http://localhost:8080/api/qa/ask \
-H "Content-Type: application/json" \
-d '{"question": "这个文档讲了什么?"}'文档解析Agent可以自动识别文件类型,调用对应的解析器:
from agents.doc_parser_agent import DocParserAgent
agent = DocParserAgent()
# 解析不同格式的文档
chunks = await agent.parse("年度报告.pdf") # PDF → 文字 + 图片识别 + 表格提取
chunks = await agent.parse("组织架构.png") # 图片 → OCR文字识别 + LLM视觉理解
chunks = await agent.parse("财务数据.xlsx") # Excel → 结构化文本
chunks = await agent.parse("产品文档.md") # Markdown → 纯文本
# 每个chunk包含:
# chunk.text - 文本内容
# chunk.metadata - 来源文件、页码、类型等
# chunk.embedding - 向量表示(自动生成)知识抽取Agent从文本中提取三元组,自动构建知识图谱:
from agents.knowledge_extract_agent import KnowledgeExtractAgent
extractor = KnowledgeExtractAgent()
result = await extractor.extract(chunks)
# 输出示例:
# entities(实体):
# - ("张三", Person, {"职位": "CEO", "年龄": "45"})
# - ("腾讯", Organization, {"行业": "互联网", "规模": "大型"})
# - ("微信", Product, {"类型": "社交软件"})
#
# relations(关系):
# - ("张三", "就职于", "腾讯")
# - ("腾讯", "开发了", "微信")
# - ("张三", "负责", "微信")在Neo4j浏览器(访问 http://localhost:7474)中可以可视化查看知识图谱。
问答Agent同时从向量库和知识图谱中检索,结合两个来源的信息生成答案:
from agents.qa_agent import QAAgent
from services.vector_store import VectorStoreService
from services.knowledge_graph import KnowledgeGraphService
# 初始化
vs = VectorStoreService()
kg = KnowledgeGraphService()
qa = QAAgent(vector_store=vs, knowledge_graph=kg)
# 提问(支持复杂的多跳推理问题)
result = await qa.answer("张三负责的产品,它的主要竞争对手是谁?")
print(result.answer) # 生成的自然语言答案
print(result.sources) # 来源引用(哪些文档/哪些知识图谱节点)
print(result.confidence) # 置信度分数
# 内部执行流程:
# 1. 向量检索 → 找到语义相关的文档段落(用余弦相似度)
# 2. 实体链接 → 识别问题中的"张三"是哪个实体
# 3. 图谱检索 → 张三 → 负责 → 微信 → 竞争对手 → QQ / 钉钉
# 4. 混合重排序 → 图谱路径结果权重×1.25(推理链更精准)
# 5. LLM生成 → 综合所有信息,生成结构化答案from agents.knowledge_update_agent import KnowledgeUpdateAgent
update_agent = KnowledgeUpdateAgent(...)
# 场景:你修改了一个PDF文件的第3页
# ❌ 传统做法(全量更新):
# 1. 删除该文档所有向量 (删 1000 条)
# 2. 重新解析整个PDF (解析 50 页)
# 3. 重新入库所有内容 (写入 1000 条)
# 耗时:~30 分钟
# ✅ CDC做法(增量更新):
# 1. 检测到第3页内容变化
# 2. 只重新解析第3页
# 3. 只更新第3页相关的向量和知识图谱节点
# 耗时:~30 秒(快60倍!)
await update_agent.process_cdc_event(event={
"operation": "UPDATE",
"resource_path": "/docs/年度报告.pdf",
"changed_pages": [3]
})支持会话管理、用户画像和AI个性设置:
from services.memory_service import MemoryService
memory = MemoryService()
# 创建对话会话
conversation = await memory.create_conversation(
session_id="session_001",
user_id="user_001",
title="年度报告咨询"
)
# 保存对话消息
await memory.save_message(
session_id="session_001",
role="user",
content="张三的职位是什么?"
)
# 获取用户画像
profile = await memory.get_user_profile("user_001")
# 设置AI个性参数
await memory.update_personality("user_001", warmth=80, expertise=90, humor=60, empathy=75)AgentKnowledgeHub/
│
├── README.md ← 你正在看的这个文件
├── docker-compose.yml ← 一键启动所有依赖服务
├── memory_service.py ← 记忆服务独立模块
├── rag-v6.0.py ← RAG核心实现
├── plan.txt ← 项目规划文档
├── uploads/ ← 默认文件上传目录
│
├── doc/ ← 项目文档资料
├── docs/ ← 技术文档目录
│ ├── architecture.md ← 架构设计详解(每个决策的理由)
│ ├── project-plan.md ← 项目规划方案
│ └── tech-deep-dive.md ← 核心代码逐行讲解
│
├── python/ ← Python后端实现(功能最完整)
│ ├── agents/ ← 4个核心Agent
│ │ ├── doc_parser_agent.py ← 文档解析Agent
│ │ ├── knowledge_extract_agent.py ← 知识抽取Agent
│ │ ├── qa_agent.py ← 问答Agent
│ │ └── knowledge_update_agent.py ← 知识更新Agent
│ ├── orchestrator/
│ │ └── graph.py ← LangGraph编排引擎(定义3条流水线)
│ ├── services/
│ │ ├── vector_store.py ← 向量库服务(ChromaDB/PGVector)
│ │ ├── knowledge_graph.py ← 知识图谱服务(Neo4j)
│ │ ├── graph_rag.py ← GraphRAG混合检索管道
│ │ ├── cdc_processor.py ← CDC增量更新处理器
│ │ ├── multimodal.py ← 多模态处理服务
│ │ ├── memory_service.py ← 记忆服务
│ │ └── memory_models.py ← 记忆数据模型
│ ├── api/
│ │ └── main.py ← FastAPI入口(REST API)
│ ├── config/
│ │ └── settings.py ← 配置管理
│ ├── tests/ ← 测试目录
│ ├── uploads/ ← 文档上传目录
│ ├── Dockerfile ← Python服务容器化
│ ├── requirements.txt ← Python依赖
│ └── .env.example ← 环境变量模板
│
└── fontend/ ← 前端应用
└── vue-aapp/ ← Vue 3 + Element Plus应用
├── public/ ← 静态资源
├── src/
│ ├── api/ ← API调用封装
│ ├── assets/ ← 静态资源
│ ├── components/ ← Vue组件
│ │ ├── ApiDemo.vue ← API演示组件
│ │ ├── ConversationManager.vue ← 对话管理
│ │ ├── ConversationWorkbench.vue ← 对话工作台
│ │ ├── KnowledgeBase.vue ← 知识库管理
│ │ ├── LoginPage.vue ← 登录页面
│ │ ├── PersonalitySettings.vue ← 个性设置
│ │ └── ProfileSettings.vue ← 用户画像设置
│ ├── composables/ ← Vue组合式函数
│ ├── App.vue ← 根组件
│ └── main.js ← 入口文件
└── package.json ← 前端依赖
启动服务后,访问 http://localhost:8080/docs 查看交互式 Swagger API 文档。
| 方法 | 路径 | 说明 | 示例 |
|---|---|---|---|
POST |
/api/ingest/upload |
上传单个文档 | curl -F "file=@doc.pdf" http://localhost:8080/api/ingest/upload |
POST |
/api/ingest/batch |
批量上传文档 | 上传多个文件,自动并行处理 |
GET |
/api/ingest/documents |
获取已上传文档列表 | - |
DELETE |
/api/ingest/documents/{file_name} |
删除指定文档 | - |
| 方法 | 路径 | 说明 | 请求体示例 |
|---|---|---|---|
POST |
/api/qa/ask |
智能问答 | {"question": "张三的职位?", "session_id": "xxx", "user_id": "xxx"} |
响应示例:
{
"question": "张三的职位?",
"answer": "根据文档,张三担任腾讯公司CEO职务,负责微信产品线。",
"confidence": 0.94,
"intent": "qa",
"sources": [
{"content": "文档内容摘要...", "source": "年度报告.pdf", "score": 0.92, "type": "vector"},
{"content": "张三-就职于-腾讯", "source": "knowledge_graph", "score": 0.98, "type": "graph"}
],
"reasoning_steps": ["步骤1: 实体识别", "步骤2: 向量检索", "步骤3: 图谱推理"]
}| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/memory/profile/{user_id} |
获取用户画像 |
POST |
/api/memory/profile |
更新用户画像 |
GET |
/api/memory/personality/{user_id} |
获取AI个性参数 |
POST |
/api/memory/personality |
更新AI个性参数 |
POST |
/api/memory/retrieve |
检索相关历史记忆 |
| 方法 | 路径 | 说明 |
|---|---|---|
POST |
/api/conversations |
创建新对话会话 |
GET |
/api/conversations |
获取对话列表 |
POST |
/api/conversations/search |
搜索对话 |
GET |
/api/conversations/{session_id} |
获取会话详情 |
POST |
/api/conversations/{session_id}/messages |
添加消息 |
PUT |
/api/conversations/{session_id}/title |
更新会话标题 |
DELETE |
/api/conversations/{session_id} |
删除会话 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/admin/stats |
查看系统统计(文档数、实体数、关系数) |
POST |
/api/admin/update |
手动触发增量更新 |
GET |
/api/health |
健康检查 |
项目包含一个完整的 Vue 3 前端应用,位于 fontend/vue-aapp/ 目录。
| 功能模块 | 说明 |
|---|---|
| 登录页面 | 用户认证入口 |
| 对话工作台 | 智能问答界面,支持上下文保持 |
| 知识库管理 | 文档上传、列表管理、删除操作 |
| 个性设置 | 调整AI助手的温暖度、专业度、幽默感、共情力 |
| 用户画像 | 管理用户个人信息和偏好设置 |
cd fontend/vue-aapp
npm install
npm run serve访问 http://localhost:8081 即可使用前端界面。
完全没问题!可以用任何兼容OpenAI接口的LLM服务:
# 国内免费/便宜的选择:
# 1. 通义千问(阿里)
OPENAI_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
OPENAI_API_KEY=你的通义千问APIKey
# 2. 智谱AI(GLM系列)
OPENAI_BASE_URL=https://open.bigmodel.cn/api/paas/v4/
OPENAI_API_KEY=你的智谱APIKey
# 3. 本地部署(完全免费)
# 先安装 Ollama: https://ollama.ai/
# 然后 ollama pull qwen2
OPENAI_BASE_URL=http://localhost:11434/v1
OPENAI_API_KEY=ollama
OPENAI_MODEL=qwen2# 查看所有服务状态
docker-compose ps
# 查看某个服务的日志
docker-compose logs neo4j
docker-compose logs kafka
# 重启某个服务
docker-compose restart neo4jNeo4j需要的内存比较多,建议给Docker分配至少4GB内存(Docker Desktop → Settings → Resources → Memory)。
这是一个架构展示 + 学习项目,展示了企业级系统的设计思路。如果要用在生产环境,还需要补充:
- 用户认证和权限控制(JWT / OAuth2)
- API限流和熔断(防止滥用)
- 完善的日志和监控(ELK Stack / Prometheus)
- 全面的单元测试和集成测试
- 生产级的数据备份方案
# Python
cd python
pytest tests/# 确保Node.js版本 >= 18
node --version
# 清除缓存重新安装
rm -rf node_modules package-lock.json
npm install
# 检查端口是否被占用
lsof -i :8081- LangGraph 官方文档 — Agent编排框架
- LangChain 官方文档 — LLM应用框架
- FastAPI 官方文档 — Python API框架
- Neo4j 官方文档 — 图数据库
- ChromaDB 官方文档 — 向量数据库
- Vue 3 官方文档 — 前端框架
- RAG原始论文 (2020) — Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
- GraphRAG论文 (2024) — From Local to Global: A Graph RAG Approach to Query-Focused Summarization
- Microsoft GraphRAG 开源项目
欢迎提 Issue 和 PR!
- 发现 Bug?提交 Issue
- 想加新功能?欢迎 Fork 后提 PR
- 觉得有帮助?请点个 ⭐ Star,这是对我最大的鼓励!
MIT License — 可以自由使用、修改、分发,只需保留原始版权声明。