大语言模型信息抽取系统解析

这段代码实现了一个基于大语言模型的信息抽取系统,能够从金融和新闻类文本中提取结构化信息。下面我将详细解析整个代码的结构和功能。

1. 代码整体结构

代码主要分为以下几个部分:

  1. 模式定义:定义不同领域(金融、新闻)需要抽取的实体类型

  2. 示例数据:提供每个领域的示例文本和标准答案

  3. 初始化函数:构建模型对话的上下文提示

  4. 推理函数:实际执行信息抽取

  5. 后处理函数:清洗模型输出

  6. 主程序:执行整个流程

2. 核心组件详解

2.1 模式定义 (schema)

python 复制代码
schema = {
    "金融": ["日期", "股票名称", "开盘价", "收盘价", "成交量"],
    "新闻": ["日期", "新闻标题", "新闻内容"],
}
  • 定义了两种文本类型(金融、新闻)及其需要抽取的实体字段

  • 金融类关注股票市场数据,新闻类关注事件信息

2.2 提示模板 (IE_PATTERN)

python 复制代码
IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出..."
  • 定义了信息抽取的提示词模板

  • 包含占位符{},运行时会被实际句子和实体类型替换

2.3 示例数据 (ie_examples)

python 复制代码
ie_examples = {
    "金融": [{"content": "...", "answers": {...}}],
    "新闻": [{"content": "...", "answers": {...}}]
}
  • 为每个领域提供one-shot示例

  • 包含原始文本(content)和标准抽取结果(answers)

2.4 初始化函数 (init_prompts)

python 复制代码
def init_prompts():
    ie_pre_history = [{"role": "system", "content": "你是一个信息抽取助手。"}]
    # 构建示例对话历史
    return {"ie_pre_history": ie_pre_history}
  1. 设置系统角色为"信息抽取助手"

  2. 遍历所有示例,构建模型学习用的对话历史

  3. 返回包含完整对话历史的字典

2.5 推理函数 (inference)

python 复制代码
def inference(custom_settings: dict, sentences: List[Dict[str, str]]):
    for item in sentences:
        # 构造提示词
        messages = [*custom_settings["ie_pre_history"], {"role": "user", "content": ...}]
        # 调用模型
        response = ollama.chat(model="qwen2.5:7b", messages=messages)
        # 后处理
        ie_res = clean_response(response["message"]["content"])
  1. 接收待处理句子和初始化设置

  2. 为每个句子构造完整的提示词

  3. 调用本地Qwen模型进行推理

  4. 对输出进行清洗和格式化

2.6 后处理函数 (clean_response)

python 复制代码
def clean_response(response: str):
    if "```json" in response:
        res = re.findall(r"```json(.*?)```", response, re.DOTALL)
    return json.loads(response)
  • 处理模型返回的可能包含Markdown代码块的响应

  • 提取纯JSON部分并转换为Python字典

3. 工作流程示例

假设输入句子为金融类文本:

python 复制代码
"2023-02-15,股票佰笃[BD]美股开盘价10美元..."

处理过程:

  1. 根据"金融"类型确定需要抽取的字段(日期、股票名称等)

  2. 构造提示词:

    python 复制代码
    2023-02-15,股票佰笃[BD]美股开盘价10美元...
    
    提取上述句子中"金融"(日期, 股票名称, 开盘价...)的实体...
  3. 模型返回JSON格式的抽取结果

  4. 后处理后得到结构化数据:

    python 复制代码
    {
      "日期": ["2023-02-15"],
      "股票名称": ["佰笃[BD]美股"],
      "开盘价": ["10美元"],
      ...
    }

4. 技术亮点

  1. 上下文学习(In-context Learning):通过示例让模型学习抽取模式

  2. 结构化提示工程:精心设计的提示模板提高抽取准确性

  3. 多领域支持:可扩展的schema设计支持不同领域

  4. 鲁棒的后处理:处理模型输出的各种格式情况

5. 扩展性建议

  1. 可以增加自动文本分类功能,而非手动指定"cls"

  2. 添加更多领域和实体类型

  3. 实现批量处理优化性能

  4. 增加错误处理和日志记录

这个系统展示了如何有效利用大语言模型进行专业领域的信息抽取,核心思想是通过精心设计的提示和示例引导模型完成特定任务。