基于大模型的知识抽取系统,用于从文档中提取实体和关系,构建知识图谱。
- 支持Markdown文件输入
- 可自定义Schema(实体类型、关系类型及其属性)
- 支持用户自定义提示词(user_prompt)
- 支持用户提供示例(examples)
- 支持多轮抽取以提高准确性
- 智能文本切块(chunk)
- 可配置chunk_size(默认1000)
- 可配置overlap(默认200)
- 使用OpenAI格式API调用
- 支持多种大模型(DeepSeek、Qwen、GLM等)
- 配置在
app/llm/config.py
- 输出JSON格式的知识图谱
- 每个任务创建独立文件夹存储
- 保存在
data/{task_name}/目录下
llm_extract/
├── app/
│ ├── api/
│ │ └── routes.py # FastAPI路由接口
│ ├── extraction/
│ │ ├── extractor.py # 第一轮抽取逻辑
│ │ └── multi_round.py # 多轮抽取逻辑
│ ├── llm/
│ │ ├── config.py # LLM配置(API密钥等)
│ │ ├── prompt.py # 提示词模板(中英文)
│ │ └── llm_client.py # LLM调用封装
│ ├── schema/
│ │ ├── schema_model.py # Schema数据模型
│ │ └── default_schema.py # 默认Schema配置
│ ├── utils/
│ │ ├── text_processor.py # 文本处理(切块等)
│ │ └── output_handler.py # 输出处理(JSON保存)
│ └── models/
│ └── task.py # 任务数据模型
├── data/ # 输出目录(按任务名称组织)
├── test/ # 测试文件
├── frontend/ # 前端文件夹(预留)
├── main.py # FastAPI启动入口
├── requirements.txt # 依赖包
└── readme.md # 项目说明
{
"entity_types": ["人物", "地点", "组织", "事件"],
"entity_attributes": {
"人物": ["年龄", "职位", "国籍"],
"地点": ["坐标", "面积"],
"组织": ["成立时间", "规模"],
"事件": ["时间", "地点"]
},
"relation_types": ["工作于", "位于", "创建", "参与"],
"relation_attributes": {
"工作于": ["开始时间", "结束时间", "职位"],
"位于": ["距离"],
"创建": ["时间", "目的"],
"参与": ["角色", "时间"]
}
}{
"entities": [
{
"name": "张三",
"type": "人物",
"年龄": "35",
"职位": "工程师",
"国籍": "中国"
}
],
"relations": [
{
"source": "张三",
"target": "阿里巴巴",
"type": "工作于",
"开始时间": "2020年",
"职位": "高级工程师"
}
]
}注意: 如果文本中未提及某个属性,该属性值为 null
创建知识抽取任务
请求参数:
{
"task_name": "任务名称",
"file": "MD文件路径或内容",
"chunk_size": 1000,
"overlap": 200,
"rounds": 1,
"model": "deepseek",
"language": "中文",
"user_prompt": "用户自定义提示词(可选)",
"examples": "用户提供的示例(可选)",
"schema": {
"entity_types": [...],
"entity_attributes": {...},
"relation_types": [...],
"relation_attributes": {...}
},
"multi_round_prompts": [
"第2轮验证提示词",
"第3轮验证提示词"
]
}获取抽取结果
查看所有任务列表
- 接收MD文件和配置参数
- 文本切块(按chunk_size和overlap)
- 对每个chunk调用LLM进行抽取
- 解析返回的JSON结果
- 合并所有chunk的结果
- 去重处理
- 保存到
data/{task_name}/result.json
当 rounds > 1 时:
- 执行第一轮抽取(同单轮)
- 对于第2轮及以后:
- 将上一轮结果和原文本一起传给LLM
- 使用验证提示词(检查遗漏、修正错误)
- 用户可为每轮提供不同的user_prompt
- 获取修正后的完整结果
- 最终输出经过多轮验证的结果
- 遗漏检查:未提取的实体和关系
- 错误修正:类型错误、命名不一致
- 属性补充:缺失的属性值
- 去重合并:重复实体和关系的清理
- 中文(默认)
- 英文
- 根据
language参数自动选择对应的提示词模板
-
第一轮抽取提示词:
extraction_system_prompt_zh/en- 完整的抽取指令
- Schema定义说明
- JSON格式要求
- 可选的用户示例
-
多轮验证提示词:
verification_system_prompt_zh/en- 审查上一轮结果
- 重点检查遗漏和错误
- 输出修正后的完整结果
✅ JSON格式输出
✅ 支持自定义Schema和属性
✅ N元关系分解为二元关系
✅ 命名一致性保证
✅ 关系去重和方向处理
✅ 第三人称、避免代词
✅ 专有名词处理规则
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| task_name | string | 必填 | 任务名称,用于创建输出文件夹 |
| file | string | 必填 | MD文件路径或内容 |
| chunk_size | int | 1000 | 文本切块大小 |
| overlap | int | 200 | 切块重叠大小 |
| rounds | int | 1 | 抽取轮数 |
| model | string | "deepseek" | 使用的LLM模型 |
| language | string | "中文" | 输出语言(中文/English) |
| user_prompt | string | "" | 用户自定义提示词 |
| examples | string/list | null | 用户提供的示例 |
| schema | object | 必填 | Schema定义 |
| multi_round_prompts | list | [] | 多轮验证时每轮的用户提示词 |
- 项目结构设计
- Prompt设计(中英文)
- LLM调用封装
- 文本处理模块
- 抽取逻辑实现
- 输出处理
- FastAPI接口
- 单元测试
- 性能优化
- 错误处理完善
- 前端界面开发
- 前后端联调
python main.pyimport requests
# 创建抽取任务
response = requests.post("http://localhost:8000/extract/task", json={
"task_name": "test_extraction",
"file": "path/to/document.md",
"schema": {
"entity_types": ["人物", "组织"],
"entity_attributes": {
"人物": ["职位", "年龄"],
"组织": ["行业"]
},
"relation_types": ["工作于"],
"relation_attributes": {
"工作于": ["时间"]
}
},
"rounds": 2,
"language": "中文"
})
# 获取结果
task_id = response.json()["task_id"]
result = requests.get(f"http://localhost:8000/extract/result/{task_id}")- 后端框架:FastAPI
- LLM调用:OpenAI API格式
- 数据格式:JSON
- 文本处理:Python标准库
- 依赖管理:requirements.txt