当前位置: 首页 > news >正文

基于 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 json

2. 核心代码实现

代码分为 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 结果,符合任务要求。

五、扩展与优化方向

  1. 支持多实体类型:在SCHEMA中新增 “新闻”“财务报告” 等类型,例如:

SCHEMA = {'商品': ['产品', '品牌', '特点', '原价', '促销价', '月销量'],'新闻': ['标题', '时间', '来源', '关键词']
}
  1. 同时补充对应IE_EXAMPLES即可实现多场景抽取。

  2. 结果持久化:将抽取结果保存到 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)
  1. 性能优化

    • 模型量化:使用bitsandbytes库对模型进行 4bit/8bit 量化,降低显存占用(1.5B 模型量化后可在 8GB 显存 GPU 运行)。
    • 批量推理:修改代码支持批量输入句子,减少模型加载次数,提升处理效率。

六、常见问题排查

  1. 模型路径错误:确保MODEL_PATH指向本地模型文件夹(包含config.jsonpytorch_model.bin等文件),若路径错误会报 “文件不存在”。
  2. 设备不匹配:若报错 “CUDA out of memory”,可强制使用 CPU 运行(在加载模型时添加device_map="cpu")。
  3. JSON 格式错误:若模型生成的 JSON 格式异常,可增加try-except捕获错误并提示重试,例如:
try:json.loads(ie_result)  # 验证JSON格式
except json.JSONDecodeError:print(f"警告:{sentence} 的抽取结果JSON格式错误,结果:{ie_result}")

通过本文的方案,你可以快速实现基于大模型的商品信息抽取,且代码具有良好的可扩展性,可轻松适配其他实体类型的抽取任务。如果在实践中遇到问题,欢迎在评论区交流!

http://www.dtcms.com/a/566364.html

相关文章:

  • 免费行情软件网站大全西宁休闲娱乐场所
  • 基于Java开发的AMHS天车调度系统技术可行性评估以及相关示例
  • 做彩票网站能挣到钱吗?西安优秀的集团门户网站建设服务商
  • 小说网站怎么做app替换wordpress logo
  • 界面控件DevExpress WPF v25.1新版亮点:AI功能的全面升级
  • 建站快车品牌网站菜单代码
  • 药品加工厂做网站临县网站建设
  • 手机网站 微信网站 区别用国外网站 图片做自媒体
  • 网站建设万首先金手指12php做网站需要后台吗
  • 网站设计申请书学院网站建设情况
  • Redis(二)——数据类型二
  • 知名网站开发公司永州网站推广
  • 营销型网站标准网页源码wordpress去掉页眉
  • 少儿编程全路线学习规划:从 AI 机器人到 C++,分龄分阶段的科学进阶指南
  • 【C++】红黑树详解(2w字详解)
  • 百度站长工具是什么意思展厅设计公司展厅效果图
  • 爱站网工具包昌大建设和天元
  • 基于 PyTorch 的 UNet 与 NestedUNet 图像分割
  • 人工智能(2)知识表示与知识图谱
  • 团购网站模板 免费衡阳市网站建设
  • 网站内容注意事项厦门人才网最新招聘信息
  • 网站开发发现趋势做网站的绿色背景图
  • ArkTS技术深度解析与扩展应用实践
  • Zermelo–Fraenkel 公理集合论(ZF)
  • 网站 做 app开发工具班级网站建设的范围
  • 静态页优秀网站老板电器分销系统
  • JavaScript 数组清空的3种方法
  • 在哪个网站做淘宝水印秦皇岛网站排名公司
  • 车载诊断框架 --- 诊断企业规范怎么定义 Service 10?
  • 陕西网站建设哪家好网站制作完成后