Skip to content

whatseven/llm_extract_knowledge

Repository files navigation

知识抽取系统 - LLM Extract

基于大模型的知识抽取系统,用于从文档中提取实体和关系,构建知识图谱。

一、核心功能

1.1 知识抽取

  • 支持Markdown文件输入
  • 可自定义Schema(实体类型、关系类型及其属性)
  • 支持用户自定义提示词(user_prompt)
  • 支持用户提供示例(examples)
  • 支持多轮抽取以提高准确性

1.2 文本处理

  • 智能文本切块(chunk)
  • 可配置chunk_size(默认1000)
  • 可配置overlap(默认200)

1.3 模型调用

  • 使用OpenAI格式API调用
  • 支持多种大模型(DeepSeek、Qwen、GLM等)
  • 配置在 app/llm/config.py

1.4 输出管理

  • 输出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                      # 项目说明

三、Schema设计

3.1 Schema配置格式

{
    "entity_types": ["人物", "地点", "组织", "事件"],
    "entity_attributes": {
        "人物": ["年龄", "职位", "国籍"],
        "地点": ["坐标", "面积"],
        "组织": ["成立时间", "规模"],
        "事件": ["时间", "地点"]
    },
    "relation_types": ["工作于", "位于", "创建", "参与"],
    "relation_attributes": {
        "工作于": ["开始时间", "结束时间", "职位"],
        "位于": ["距离"],
        "创建": ["时间", "目的"],
        "参与": ["角色", "时间"]
    }
}

3.2 输出JSON格式

{
    "entities": [
        {
            "name": "张三",
            "type": "人物",
            "年龄": "35",
            "职位": "工程师",
            "国籍": "中国"
        }
    ],
    "relations": [
        {
            "source": "张三",
            "target": "阿里巴巴",
            "type": "工作于",
            "开始时间": "2020年",
            "职位": "高级工程师"
        }
    ]
}

注意: 如果文本中未提及某个属性,该属性值为 null

四、API接口设计

4.1 主要接口

POST /extract/task

创建知识抽取任务

请求参数:

{
    "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轮验证提示词"
    ]
}

GET /extract/result/{task_id}

获取抽取结果

GET /extract/tasks

查看所有任务列表

五、知识抽取流程

5.1 单轮抽取流程

  1. 接收MD文件和配置参数
  2. 文本切块(按chunk_size和overlap)
  3. 对每个chunk调用LLM进行抽取
  4. 解析返回的JSON结果
  5. 合并所有chunk的结果
  6. 去重处理
  7. 保存到 data/{task_name}/result.json

5.2 多轮抽取流程

rounds > 1 时:

  1. 执行第一轮抽取(同单轮)
  2. 对于第2轮及以后:
    • 将上一轮结果和原文本一起传给LLM
    • 使用验证提示词(检查遗漏、修正错误)
    • 用户可为每轮提供不同的user_prompt
    • 获取修正后的完整结果
  3. 最终输出经过多轮验证的结果

5.3 多轮验证重点

  • 遗漏检查:未提取的实体和关系
  • 错误修正:类型错误、命名不一致
  • 属性补充:缺失的属性值
  • 去重合并:重复实体和关系的清理

六、提示词设计

6.1 支持语言

  • 中文(默认)
  • 英文
  • 根据 language 参数自动选择对应的提示词模板

6.2 提示词类型

  • 第一轮抽取提示词extraction_system_prompt_zh/en

    • 完整的抽取指令
    • Schema定义说明
    • JSON格式要求
    • 可选的用户示例
  • 多轮验证提示词verification_system_prompt_zh/en

    • 审查上一轮结果
    • 重点检查遗漏和错误
    • 输出修正后的完整结果

6.3 提示词关键特性

✅ 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接口

第二阶段:测试与优化

  • 单元测试
  • 性能优化
  • 错误处理完善

第三阶段:前端集成(未来)

  • 前端界面开发
  • 前后端联调

九、使用示例

9.1 启动服务

python main.py

9.2 调用API

import 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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published