大语言模型信息抽取系统解析
这段代码实现了一个基于大语言模型的信息抽取系统,能够从金融和新闻类文本中提取结构化信息。下面我将详细解析整个代码的结构和功能。
1. 代码整体结构
代码主要分为以下几个部分:
模式定义:定义不同领域(金融、新闻)需要抽取的实体类型
示例数据:提供每个领域的示例文本和标准答案
初始化函数:构建模型对话的上下文提示
推理函数:实际执行信息抽取
后处理函数:清洗模型输出
主程序:执行整个流程
2. 核心组件详解
2.1 模式定义 (schema)
schema = {"金融": ["日期", "股票名称", "开盘价", "收盘价", "成交量"],"新闻": ["日期", "新闻标题", "新闻内容"],
}
定义了两种文本类型(金融、新闻)及其需要抽取的实体字段
金融类关注股票市场数据,新闻类关注事件信息
2.2 提示模板 (IE_PATTERN)
IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出..."
定义了信息抽取的提示词模板
包含占位符
{}
,运行时会被实际句子和实体类型替换
2.3 示例数据 (ie_examples)
ie_examples = {"金融": [{"content": "...", "answers": {...}}],"新闻": [{"content": "...", "answers": {...}}]
}
为每个领域提供one-shot示例
包含原始文本(content)和标准抽取结果(answers)
2.4 初始化函数 (init_prompts)
def init_prompts():ie_pre_history = [{"role": "system", "content": "你是一个信息抽取助手。"}]# 构建示例对话历史return {"ie_pre_history": ie_pre_history}
设置系统角色为"信息抽取助手"
遍历所有示例,构建模型学习用的对话历史
返回包含完整对话历史的字典
2.5 推理函数 (inference)
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"])
接收待处理句子和初始化设置
为每个句子构造完整的提示词
调用本地Qwen模型进行推理
对输出进行清洗和格式化
2.6 后处理函数 (clean_response)
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. 工作流程示例
假设输入句子为金融类文本:
"2023-02-15,股票佰笃[BD]美股开盘价10美元..."
处理过程:
根据"金融"类型确定需要抽取的字段(日期、股票名称等)
构造提示词:
2023-02-15,股票佰笃[BD]美股开盘价10美元...提取上述句子中"金融"(日期, 股票名称, 开盘价...)的实体...
模型返回JSON格式的抽取结果
后处理后得到结构化数据:
{"日期": ["2023-02-15"],"股票名称": ["佰笃[BD]美股"],"开盘价": ["10美元"],... }
4. 技术亮点
上下文学习(In-context Learning):通过示例让模型学习抽取模式
结构化提示工程:精心设计的提示模板提高抽取准确性
多领域支持:可扩展的schema设计支持不同领域
鲁棒的后处理:处理模型输出的各种格式情况
5. 扩展性建议
可以增加自动文本分类功能,而非手动指定"cls"
添加更多领域和实体类型
实现批量处理优化性能
增加错误处理和日志记录
这个系统展示了如何有效利用大语言模型进行专业领域的信息抽取,核心思想是通过精心设计的提示和示例引导模型完成特定任务。