基于 Qwen2.5-1.5B-Instruct 的商品信息抽取实践(附完整代码)
在 NLP 应用中,信息抽取(IE)是从非结构化文本中提取结构化实体信息的核心任务,广泛用于电商商品分析、新闻要素提取等场景。本文将以商品信息抽取为例,详细介绍如何使用 Qwen2.5-1.5B-Instruct 模型实现从文本中自动提取 “产品、品牌、价格” 等关键属性,并提供可直接运行的完整代码。
一、任务背景与核心目标
1. 任务定义
我们需要从商品描述文本中,结构化提取预设的 6 个属性:
- 产品:商品具体名称(如 “休闲卫衣”“夏季连衣裙”)
 - 品牌:商品所属品牌(如 “ABC”“JKL”)
 - 特点:商品特性(如 “柔软亲肤”“透气面料”)
 - 原价 / 促销价:商品定价信息
 - 月销量:商品销售数据
 
若文本中不存在某属性,需统一标注为['原文中未提及'],最终输出 JSON 格式结果,方便后续数据处理。
2. 技术选型
选择Qwen2.5-1.5B-Instruct模型的核心原因:
- 中文理解能力强:针对中文场景优化,对商品描述中的口语化表达(如 “现价”“月销”)识别更准确
 - 轻量化部署:1.5B 参数规模,可在 CPU/GPU 环境运行,无需高端硬件
 - 指令跟随性好:支持通过 Few-shot 示例(少量示例)快速适配特定抽取任务,无需大量标注数据
 
1. 环境准备
首先安装依赖库,主要依赖transformers(加载模型)和torch(深度学习框架):
pip install transformers torch json2. 核心代码实现
代码分为 5 个模块:核心配置、抽取模板与示例、Prompt 构建、推理函数、测试运行,每个模块功能清晰且可复用。
from transformers import AutoTokenizer, AutoModelForCausalLM
import json# -------------------------- 1. 核心配置(根据自身环境调整) --------------------------
# 本地模型路径(替换为你的Qwen2.5-1.5B-Instruct模型路径)
MODEL_PATH = r'C:\Users\23967\Qwen2.5-1.5B-Instruct'
# 信息抽取Schema:定义“实体类型→待提取属性”映射(可扩展至其他实体类型)
SCHEMA = {'商品': ['产品', '品牌', '特点', '原价', '促销价', '月销量']
}# -------------------------- 2. 抽取模板与Few-shot示例 --------------------------
# 模板:明确任务要求,避免模型生成无关内容
IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出。规则:1. 不存在的信息必须用['原文中未提及']表示;2. 多个值用','分隔;3. 仅输出JSON,不添加任何额外文字或对话。"# Few-shot示例:给模型提供参考案例,提升抽取准确性
# 新增“无信息”示例,解决模型误标“无”的问题
IE_EXAMPLES = {'商品': [{'content': '2024年新款时尚运动鞋,品牌 JKL,舒适透气,多种颜色可选。原价 599元,现在促销价 499元。月销量 2000双。','answers': {'产品': ['时尚运动鞋'],'品牌': ['JKL'],'特点': ['舒适透气', '多种颜色可选'],'原价': ['599元'],'促销价': ['499元'],'月销量': ['2000双']}},{'content': '2024年新款T恤,无品牌,仅白色,无价格和销量信息。','answers': {'产品': ['T恤'],'品牌': ['原文中未提及'],'特点': ['仅白色'],'原价': ['原文中未提及'],'促销价': ['原文中未提及'],'月销量': ['原文中未提及']}}]
}# -------------------------- 3. Prompt构建(In-Context Learning关键) --------------------------
def build_ie_prehistory():"""构建包含任务说明和示例的历史对话,让模型理解任务规则"""ie_prehistory = [("现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要帮我抽取出句子中实体信息,并按照JSON格式输出。规则:1. 不存在的信息必须用['原文中未提及']表示;2. 多个值用','分隔;3. 仅输出JSON,不添加任何额外文字或对话。","好的,请输入您的句子。")]# 将示例添加到历史对话中for entity_type, example_list in IE_EXAMPLES.items():for example in example_list:sentence = example["content"]# 拼接属性字符串(如“商品(产品,品牌,特点,原价,促销价,月销量)”)properties = ','.join(SCHEMA[entity_type])schema_str = f'"{entity_type}"({properties})'# 生成示例Promptexample_prompt = IE_PATTERN.format(sentence, schema_str)# 生成示例答案(JSON格式,避免ASCII转义中文)example_answer = json.dumps(example['answers'], ensure_ascii=False)ie_prehistory.append((example_prompt, example_answer))return ie_prehistorydef build_full_prompt(query, history):"""拼接历史对话和当前查询,生成完整输入Prompt"""prompt = ""# 添加历史对话(示例+任务说明)for i, (old_query, response) in enumerate(history):prompt += f"[Round {i + 1}]\n\n问: {old_query}\n\n答: {response}\n\n"# 添加当前待抽取查询prompt += f"[Round {len(history) + 1}]\n\n问: {query}\n\n答:"return prompt# -------------------------- 4. 推理函数(核心抽取逻辑) --------------------------
def ie_inference(sentences: list, entity_type: str = '商品'):"""商品信息抽取主函数Args:sentences: 待抽取的商品描述列表(支持批量处理)entity_type: 实体类型(默认'商品',需在SCHEMA中定义)"""# 1. 加载模型和分词器tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)model = AutoModelForCausalLM.from_pretrained(MODEL_PATH,device_map="auto",  # 自动分配设备(CPU/GPU),无需手动指定dtype="auto"        # 自动选择数据类型,适配硬件)# 2. 构建Few-shot历史对话custom_settings = {'ie_pre_history': build_ie_prehistory()}# 3. 校验实体类型是否合法(避免传入SCHEMA中不存在的类型)if entity_type not in SCHEMA:print(f"错误:实体类型'{entity_type}'未在SCHEMA中定义,已退出。")return# 4. 批量处理待抽取句子for sentence in sentences:# 生成当前句子的抽取Promptproperties_str = ','.join(SCHEMA[entity_type])schema_str = f"{entity_type}({properties_str})"sentence_prompt = IE_PATTERN.format(sentence, schema_str)# 生成完整输入文本(历史对话+当前Prompt)full_input = build_full_prompt(sentence_prompt, custom_settings["ie_pre_history"])# 编码输入:将文本转为模型可识别的张量inputs = tokenizer(full_input,return_tensors="pt",  # 返回PyTorch张量truncation=True,      # 超过max_length时截断(避免模型报错)max_length=1024       # 最大输入长度(根据模型限制调整)).to(model.device)  # 确保输入与模型在同一设备(CPU/GPU)# 模型生成抽取结果outputs = model.generate(inputs["input_ids"],       # 输入张量attention_mask=inputs.attention_mask,  # 注意力掩码(忽略padding部分)pad_token_id=tokenizer.eos_token_id,   # 填充token(避免生成混乱)max_new_tokens=300,        # 最大新增token数(JSON结果无需过长)do_sample=False,           # 关闭采样(确定性生成,结果更稳定)num_return_sequences=1     # 仅生成1个结果(批量生成可调整))# 解码结果:将模型输出的张量转为文本full_reply = tokenizer.decode(outputs[0], skip_special_tokens=True)# 提取纯抽取结果(排除输入Prompt部分)ie_result = full_reply[len(full_input):].strip()# 打印结果(可替换为保存到文件/数据库)print(f"待抽取句子:{sentence}")print(f"抽取结果:{ie_result}\n")# -------------------------- 5. 测试运行 --------------------------
if __name__ == '__main__':# 待抽取的商品描述列表(可替换为你的实际数据)test_sentences = ["2025年新款休闲卫衣,品牌 ABC,柔软亲肤,有黑/白/灰三色。原价 399元,现价 299元,月销 1500件。","2024年夏季连衣裙,无品牌信息,透气面料,原价 459元,无促销价和销量数据。"]# 执行信息抽取ie_inference(sentences=test_sentences, entity_type='商品')调试模式:

三、关键优化点解析
在实际测试中,模型容易出现 “生成无关内容”“无信息标注错误” 等问题,以下是针对性优化方案:
1. 解决 “生成无关内容”(如 “再见!感谢支持”)
- 模板约束:在
IE_PATTERN中明确 “仅输出 JSON,不添加任何额外文字或对话”,强制模型聚焦任务。 - 控制生成长度:将
max_new_tokens从 500 缩减到 300,避免模型 “画蛇添足” 生成对话结尾。 - 关闭采样:
do_sample=False确保模型按规则生成,而非随机生成冗余内容。 
2. 解决 “无信息标注错误”(如将 “无品牌” 标为 “[' 无 ']”)
- 新增 Few-shot 示例:在
IE_EXAMPLES中添加 “无品牌、无价格” 的案例,明确 “无信息” 需标注为['原文中未提及'],让模型通过示例学习正确规则。 - Schema 强约束:通过
SCHEMA固定属性列表,避免模型遗漏属性或自定义标注格式。 
3. 适配不同硬件环境
- 自动设备分配:
device_map="auto"让模型根据硬件自动选择 CPU/GPU,无需手动修改代码(GPU 环境会自动加速,CPU 环境也可运行)。 - 截断保护:
truncation=True避免长文本超出模型输入限制导致报错。 
四、运行结果与效果验证
1. 测试输入
test_sentences = ["2025年新款休闲卫衣,品牌 ABC,柔软亲肤,有黑/白/灰三色。原价 399元,现价 299元,月销 1500件。","2024年夏季连衣裙,无品牌信息,透气面料,原价 459元,无促销价和销量数据。"
]2. 输出结果

3. 结果分析
- 结构化完整:所有预设属性均被提取,无遗漏。
 - 标注准确:“无品牌”“无促销价” 等信息正确标注为
['原文中未提及'],无错误。 - 无冗余内容:仅输出 JSON 结果,符合任务要求。
 
五、扩展与优化方向
支持多实体类型:在
SCHEMA中新增 “新闻”“财务报告” 等类型,例如:
SCHEMA = {'商品': ['产品', '品牌', '特点', '原价', '促销价', '月销量'],'新闻': ['标题', '时间', '来源', '关键词']
}同时补充对应
IE_EXAMPLES即可实现多场景抽取。结果持久化:将抽取结果保存到 JSON 文件或数据库,而非仅打印,例如:
# 保存结果到JSON文件
with open('ie_results.json', 'w', encoding='utf-8') as f:json.dump({'sentence': sentence, 'result': ie_result}, f, ensure_ascii=False, indent=2)性能优化:
- 模型量化:使用
bitsandbytes库对模型进行 4bit/8bit 量化,降低显存占用(1.5B 模型量化后可在 8GB 显存 GPU 运行)。 - 批量推理:修改代码支持批量输入句子,减少模型加载次数,提升处理效率。
 
- 模型量化:使用
 
六、常见问题排查
- 模型路径错误:确保
MODEL_PATH指向本地模型文件夹(包含config.json、pytorch_model.bin等文件),若路径错误会报 “文件不存在”。 - 设备不匹配:若报错 “CUDA out of memory”,可强制使用 CPU 运行(在加载模型时添加
device_map="cpu")。 - JSON 格式错误:若模型生成的 JSON 格式异常,可增加
try-except捕获错误并提示重试,例如: 
try:json.loads(ie_result)  # 验证JSON格式
except json.JSONDecodeError:print(f"警告:{sentence} 的抽取结果JSON格式错误,结果:{ie_result}")通过本文的方案,你可以快速实现基于大模型的商品信息抽取,且代码具有良好的可扩展性,可轻松适配其他实体类型的抽取任务。如果在实践中遇到问题,欢迎在评论区交流!
