基于 Ollama 的商品描述生成服务:从产品属性到营销文案的 Prompt 工程化
基于 Ollama 的商品描述生成服务从产品属性到营销文案的 Prompt 工程化一、商品描述生成的工程痛点电商平台每天上架数千个 SKU运营团队需要为每个商品撰写描述。手工编写效率低、风格不一致导致搜索结果相关性差。AI 生成商品描述是明确的提效场景——但直接将产品属性拼接后丢给 LLM生成的文案往往缺乏营销感或者在关键参数上出现事实性错误幻觉。工程化的核心在于 Prompt 的结构化设计。不是写一个商品描述而是将产品属性以结构化格式输入约束输出格式注入品牌语气参数。这类似于编译器的前端——将非结构化的需求翻译为 LLM 可精确理解的指令。Ollama 作为本地推理引擎其稳定性优于公有 API无网络延迟波动、无 API 配额限制适合批量生成场景。但默认 Prompt 模板针对对话优化商品描述需要定制化的 System Prompt 和 Few-Shot 示例。二、Prompt 工程化的技术框架Prompt 的工程化设计包含四个组件System Prompt定义模型的角色行为——你是电商平台的商品文案专家。你的任务是生成精确、有营销力、无幻觉的商品描述。结构化输入将产品属性以 JSON 或 YAML 格式注入——{name: ..., material: ..., features: [...], target_audience: ...}。结构化比自然语言拼接更易被模型精确解析。Few-Shot 示例提供 2~3 个高质量的输入-输出对锚定模型的输出风格。示例覆盖不同的营销语气专业型、情感型、功能型让模型学会根据产品类型自适应调整。输出约束在 Prompt 末尾明确格式要求以 3 个短句描述产品每句不超过 20 字。禁止使用敏感词。如果是服装必须包含材质和适用场景。三、Rust 实现的 Prompt 构建引擎use serde::{Deserialize, Serialize}; use std::collections::HashMap; use anyhow::Result; /// 产品属性——结构化输入 #[derive(Debug, Clone, Serialize, Deserialize)] pub struct ProductAttributes { pub name: String, pub category: String, pub brand: OptionString, pub material: OptionString, pub features: VecString, pub target_audience: OptionString, pub price_range: OptionString, } /// 营销语气枚举 #[derive(Debug, Clone, Copy)] pub enum MarketingTone { /// 专业描述——适合 3C 电子产品 Professional, /// 情感共鸣——适合礼品、家居 Emotional, /// 功能导向——适合工具、厨具 Functional, } /// Prompt 模板管理器 /// 设计原因按品类分类模板使模型在特定领域内 /// 生成质量更高——领域特化的 System Prompt 优于通用 Prompt pub struct PromptTemplateEngine { /// 品类 → System Prompt system_prompts: HashMapString, String, /// 品类 → Few-Shot 示例 few_shot_examples: HashMapString, Vec(String, String), /// 输出约束模板 constraints: VecString, } impl PromptTemplateEngine { pub fn new() - Self { let mut system_prompts HashMap::new(); // 服装品类的特化 System Prompt system_prompts.insert(服装.to_string(), 你是专业服装文案。你的描述应包含材质触感、版型特点、适用场景、搭配建议。\ 禁止编造材质——仅使用给定的产品属性。风格简洁每句不超过25字。.to_string() ); system_prompts.insert(电子产品.to_string(), 你是专业3C产品文案。你的描述应包含核心技术参数、差异化卖点、适用人群。\ 参数必须精确——仅使用给定的产品属性。避免营销夸张词。.to_string() ); let mut few_shot HashMap::new(); few_shot.insert(服装.to_string(), vec![ ( // 输入示例 r#{name:经典羊绒衫,material:100%羊绒,features:[亲肤,保暖,不起球]}#.to_string(), // 输出示例 100%山羊绒织造轻柔如云。圆领设计修饰脸型适合日常通勤与周末休闲。冷水手洗养护。.to_string(), ), ]); let constraints vec![ 每条描述3-5句总字数50-120字.to_string(), 必须包含至少一个产品特征.to_string(), 禁止使用的词顶级、完美、绝对.to_string(), 如果缺少某项属性跳过——不要编造.to_string(), ]; Self { system_prompts, few_shot_examples: few_shot, constraints, } } /// 构建完整的 Prompt /// 设计原因System Prompt Few-Shot 结构化输入 约束 /// 四段式结构使模型在有限的 Context Window 内获得最大信息密度 pub fn build_prompt( self, product: ProductAttributes, tone: MarketingTone, ) - ResultString { let sys_prompt self.system_prompts .get(product.category) .cloned() .unwrap_or_else(|| { 你是电商商品文案专家。基于产品属性生成精确、有吸引力的描述。.to_string() }); let mut prompt format!(|system|\n{}\n, sys_prompt); // 注入 Few-Shot 示例 if let Some(examples) self.few_shot_examples.get(product.category) { for (input, output) in examples { prompt.push_str(format!( \n|user|\n商品属性{}\n|assistant|\n{}\n, input, output )); } } // 注入当前产品属性结构化 JSON let attributes_json serde_json::to_string_pretty(product)?; prompt.push_str(format!(\n|user|\n商品属性\n{}\n, attributes_json)); // 注入语气参数 let tone_instruction match tone { MarketingTone::Professional 使用专业、客观的语气。, MarketingTone::Emotional 使用温暖、感性的语气唤起情感共鸣。, MarketingTone::Functional 使用务实、功能的语气强调实际用途。, }; prompt.push_str(format!(\n语气要求{}\n, tone_instruction)); // 注入输出约束 prompt.push_str(\n输出约束\n); for (i, constraint) in self.constraints.iter().enumerate() { prompt.push_str(format!({}. {}\n, i 1, constraint)); } prompt.push_str(\n|assistant|\n); Ok(prompt) } /// 路由选择——根据产品属性自动选择合适的语气 pub fn auto_select_tone(self, product: ProductAttributes) - MarketingTone { match product.category.as_str() { 电子产品 | 家电 MarketingTone::Professional, 礼品 | 家居 | 饰品 MarketingTone::Emotional, 工具 | 厨具 | 运动户外 MarketingTone::Functional, _ MarketingTone::Professional, } } } /// Ollama 推理服务封装 pub struct OllamaDescriptionService { base_url: String, model: String, template_engine: PromptTemplateEngine, } impl OllamaDescriptionService { pub fn new(base_url: str, model: str) - Self { Self { base_url: base_url.to_string(), model: model.to_string(), template_engine: PromptTemplateEngine::new(), } } /// 生成商品描述 pub async fn generate_description( self, product: ProductAttributes, ) - ResultString { let tone self.template_engine.auto_select_tone(product); let prompt self.template_engine.build_prompt(product, tone)?; let client reqwest::Client::new(); let response client .post(format!({}/api/generate, self.base_url)) .json(serde_json::json!({ model: self.model, prompt: prompt, stream: false, options: { temperature: 0.7, // 商品描述需要一定创造性 top_p: 0.9, num_predict: 256, // 限制生成长度 }, })) .send() .await?; let body: serde_json::Value response.json().await?; let description body[response] .as_str() .unwrap_or() .trim() .to_string(); Ok(description) } }Prompt 构建引擎的四段式结构——System Prompt → Few-Shot → 结构化输入 → 约束——是经验验证的高效模式。每段的信息密度逐步聚焦角色定义 → 风格范例 → 具体数据 → 格式规范。温度参数temperature: 0.7是商品描述的平衡点——过低导致所有描述趋同过高产生幻觉。num_predict: 256限制输出 Token 数——商品描述不应超过 200 Token约 150 中文字。四、方案边界与适用场景分析适用场景电商平台的批量商品上架描述生成SKU 类型集中如服装系列Few-Shot 示例复用价值高本地部署 Ollama 的批量生成场景——避免公有 API 的高延迟抖动。不适用场景描述风格极度多样化的平台如艺术品——Few-Shot 示例覆盖率低需要实时上下文感知的交互式生成——用户修改后立即刷新而非批量生成Token 预算极度紧张 512的场景——Prompt 模板本身占用 200~300 Token。Trade-offsPrompt 工程化需要为每个品类维护模板和示例——维护成本随品类增长。Few-Shot 示例的质量直接影响输出——需要领域专家参与撰写。输出校验模块的召回率影响整体通过率——过于严格导致大量重试过于宽松导致低质描述上线。五、总结Prompt 的结构化设计角色 范例 输入 约束是 LLM 文本生成质量的工程保证按品类路由的特化 System Prompt 优于通用 Prompt——领域聚焦提升生成精度Few-Shot 示例锚定输出风格——每个品类 2~3 个示例即可显著提升一致性输出约束的明确表达格式、长度、禁用词减少后处理的人工校验成本Ollama 本地推理的延迟稳定性优于公有 API适合批量生成长时任务

相关新闻

AI绘图实战:把串珠手作风角色图提示词写成高质量博客

AI绘图实战:把串珠手作风角色图提示词写成高质量博客

🔥 个人主页: 杨利杰YJlio ❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》 《WINDOWS教程》 《Windows PowerShell 实战》 《人工智能实战合集》 《超简单:用Python让Excel飞起来》 …

2026/7/25 1:37:29阅读更多 →
Rust 在秒杀系统中的应用:无锁队列、令牌桶限流与请求合并的性能验证

Rust 在秒杀系统中的应用:无锁队列、令牌桶限流与请求合并的性能验证

Rust 在秒杀系统中的应用:无锁队列、令牌桶限流与请求合并的性能验证 一、秒杀场景对系统性能的极致要求 秒杀活动的流量特征是脉冲式的——开抢瞬间 QPS 从 100 飙升到 10 万,然后在 5 秒内回落。传统架构用消息队列削峰,但消息队列本身成为…

2026/7/25 1:37:29阅读更多 →
电商库存系统的分布式一致性方案:基于 TCC 的扣减、预留与回滚的工程实现

电商库存系统的分布式一致性方案:基于 TCC 的扣减、预留与回滚的工程实现

电商库存系统的分布式一致性方案:基于 TCC 的扣减、预留与回滚的工程实现 一、库存一致性——电商系统的基石 电商库存系统面临一个经典分布式难题:用户下单扣减库存,如果后续支付失败,库存必须归还——即"预留→扣减→回滚&…

2026/7/25 1:37:29阅读更多 →
高性能ADC设计实战:时钟抖动与JESD204B接口优化指南

高性能ADC设计实战:时钟抖动与JESD204B接口优化指南

1. 项目概述与核心挑战在雷达、无线通信基站或者高端测试测量设备里,我们经常需要处理GHz级别的射频信号。这时候,模数转换器(ADC)就成了整个信号链的咽喉要道,它的性能好坏,直接决定了后端数字信号处理能拿…

2026/7/25 3:03:46阅读更多 →
2026年AI大模型应用开发全景学习路径:从Python到RAG与低代码平台

2026年AI大模型应用开发全景学习路径:从Python到RAG与低代码平台

如果你在2026年想成为一名能真正交付AI应用、而不仅仅是调用API的开发者,那么你需要的不是零散的教程,而是一张清晰的、能串联起从基础到实战的完整知识地图。Python、Prompt、RAG、Coze、Dify……这些词你或许都听过,但它们之间的关系是什么…

2026/7/25 3:03:46阅读更多 →
Unity PSD导入器:打通UI设计到开发的高效工作流

Unity PSD导入器:打通UI设计到开发的高效工作流

1. 项目概述:为什么我们需要一个专业的PSD导入器? 在Unity项目开发中,尤其是UI界面制作环节,美术同学交付的源文件通常是Photoshop的PSD格式。传统的处理流程非常繁琐:美术需要将PSD中的每个图层导出为单独的PNG图片&a…

2026/7/25 3:03:46阅读更多 →
终极指南:如何用本地ImageSearch在3分钟内从千万级图库中精准找图

终极指南:如何用本地ImageSearch在3分钟内从千万级图库中精准找图

终极指南:如何用本地ImageSearch在3分钟内从千万级图库中精准找图 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 还在为海量图片管理…

2026/7/25 3:03:46阅读更多 →
ADS8598S数据手册图表深度解析:从18位ADC架构到多通道同步采样系统设计

ADS8598S数据手册图表深度解析:从18位ADC架构到多通道同步采样系统设计

1. 项目概述:从数据手册图表到系统级理解 刚拿到ADS8598S这颗料的时候,我习惯性地先翻到数据手册的“典型特性”部分。这一堆图表,什么DNL、INL、SNR vs. Temperature,乍一看都是冷冰冰的曲线和数字,但这里面藏着决定你…

2026/7/25 3:03:46阅读更多 →
DDR2/DDR3 PCB设计实战:从阻抗控制到等长匹配的完整信号完整性指南

DDR2/DDR3 PCB设计实战:从阻抗控制到等长匹配的完整信号完整性指南

1. 项目概述与核心挑战在嵌入式系统、服务器主板乃至高性能消费电子产品的硬件设计里,DDR内存接口的PCB布局与信号完整性设计,一直是个既基础又极具挑战性的“硬骨头”。我经手过不少项目,从早期的DDR2到后来的DDR3,每次设计评审&…

2026/7/25 3:01:46阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →