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