基于千问+LangChain构建垂直领域大模型应用:电商场景实际案例
随着大语言模型(LLM)技术的发展,越来越多的行业开始探索如何将通用大模型能力应用到特定垂直领域。然而,直接使用原生大模型API往往难以满足垂直领域的专业需求,需要开发适配层将模型能力与业务逻辑有机结合。
LangChain作为一个专为大语言模型应用开发设计的框架,为这一挑战提供了优雅的解决方案。
本文将以电商客服投诉信息的结构化处理为例,详细介绍如何基于LangChain框架和开源大语言模型构建垂直领域的智能应用。通过这一实例,我们将展示LangChain如何助力开发者快速构建、迭代和部署大模型应用,实现从非结构化文本到结构化数据的智能转换。
完整代码放在下方二维码,免费获取
LangChain框架解决方案
LangChain框架通过其灵活的架构设计,为上述挑战提供了系统性解决方案:
- \1. 提示工程工具链:提供结构化的提示模板管理,便于注入领域知识和规则。
- \2. 结构化输出解析:支持将模型输出解析为特定的数据结构,确保输出符合预期格式。
- \3. 可组合的处理链:通过链式组件设计,支持构建复杂的推理流程和容错机制。
- \4. 多模型适配器:支持接入不同的模型提供商,便于根据场景选择合适的模型降低成本。
- \5. 服务化部署工具:提供内置的API部署功能,简化系统集成流程。
所用技术
- \1. LangChain:作为核心框架,负责模型调用、提示管理和处理流程编排
- \2. Ollama:开源本地大语言模型运行环境,支持多种开源大模型
- \3. Pydantic:用于数据验证和结构化模型定义,确保数据格式的规范性
- \4. LangServe:LangChain配套的服务化部署工具,用于快速构建API
- \5. Python:作为主要开发语言,适合AI和数据处理应用
代码实现讲解
环境配置模块
环境配置模块负责管理系统运行参数,采用了Pydantic和环境变量相结合的方式:
import os
from pydantic import BaseModel, Field
classAppConfig(BaseModel):
"""应用配置模型"""
model_name: str = Field("qwen2.5:7b", description="使用的Ollama模型名称")
base_url: str = Field("http://localhost:11434", description="Ollama服务地址")
timeout: int = Field(30, description="模型请求超时时间(秒)")
max_retries: int = Field(3, description="模型请求最大重试次数")
@classmethod
deffrom_env(cls) -> "AppConfig":
"""从环境变量创建配置"""
return cls(
model_name=os.getenv("MODEL_NAME", "qwen2.5:7b"),
base_url=os.getenv("BASE_URL", "http://localhost:11434"),
timeout=int(os.getenv("TIMEOUT", "30")),
max_retries=int(os.getenv("MAX_RETRIES", "3"))
)
config = AppConfig.from_env()
对于垂直领域应用,灵活的配置管理尤为重要,可以在不修改代码的情况下适应不同的业务场景和资源条件。
数据模型模块
数据模型模块定义了系统数据结构,是实现从非结构化文本到结构化数据转换的核心:
# ================== 数据模型 ==================
classComplaint(BaseModel):
"""客户投诉数据模型
Attributes:
order_id: 订单号(格式:大写字母+数字,长度10-20字符)
issue_type: 问题类型(如物流问题、商品质量等)
user_request: 用户核心诉求(如退款、换货等)
urgency_level: 紧急程度分级(1-5级,5级为最紧急)
"""
order_id: Optional[str] = Field(
None,
min_length=10,
max_length=20,
pattern=r"^[A-Z0-9]+$",
description="订单号(大写字母+数字组合,长度10-20字符)"
)
issue_type: Optional[str] = Field(
None,
description="问题类型,如物流问题、商品质量、售后服务等",
examples=["商品质量", "物流延迟"]
)
user_request: Optional[str] = Field(
None,
description="用户核心诉求,如退款、换货、维修等",
examples=["全额退款", "紧急换货"]
)
urgency_level: Optional[int] = Field(
None,
ge=1,
le=5,
description="紧急程度分级(1-5级,5级为最紧急)"
)
在垂直领域应用中,数据模型设计需要注意以下几点:
- \1. 精确的字段约束:通过Field参数定义字段的有效性规则,如长度、格式等
- \2. 可选性设计:合理使用Optional标记,应对文本中可能缺失的信息
- \3. 领域术语映射:模型字段命名应与业务术语一致,降低理解成本
- \4. 文档与示例:为每个字段提供清晰的描述和示例,指导模型输出
Pydantic不仅提供了数据验证功能,还能通过JSON Schema生成API文档,便于团队协作和系统集成。
模型服务模块
模型服务模块负责初始化和配置大语言模型:
from langchain_ollama import ChatOllama
def initialize_model(config: AppConfig) -> ChatOllama:
"""初始化Ollama聊天模型"""
return ChatOllama(
model=config.model_name,
base_url=config.base_url,
temperature=0.3, # 降低随机性以保证稳定性
num_ctx=2048, # 增大上下文窗口
timeout=config.timeout,
max_retries=config.max_retries
)
model = initialize_model(config)
LangChain的优势在于提供了统一的模型接口,使系统可以无缝切换不同的模型提供商(如从Ollama切换到OpenAI),而无需修改其他代码。
提示工程模块
提示工程模块是垂直领域应用的核心,负责设计和管理与模型的交互提示:
from langchain_core.prompts import ChatPromptTemplate
def create_extraction_prompt() -> ChatPromptTemplate:
"""创建结构化提取提示模板"""
return ChatPromptTemplate.from_messages([
("system",
"""您是一个专业的电商客服信息提取助手。请严格按以下规则处理用户输入:
1. 订单号识别规则:
- 格式:大写字母和数字组合(如ORD202405019876)
- 长度:10-20个字符
2. 问题类型分类:
- 物流问题(包含"物流"、"运输"、"延迟"等关键词)
- 商品质量(包含"破损"、"裂痕"、"故障"等关键词)
- 售后服务(包含"客服"、"响应"、"处理"等关键词)
3. 紧急程度判定标准:
5级:涉及安全问题的词汇(如爆炸、漏液、火灾等)
4级:高价商品问题或影响健康的关键词
3级:物流延迟超过3天或影响使用的商品问题
2级:普通退款请求或非紧急问题
1级:咨询类或一般反馈
4. 用户诉求提取:
- 保留原始表达中的核心动词(如退款、换货、维修等)
- 保持诉求的完整性
示例分析:
用户输入:"订单号ORD12345678,收到的手机屏幕有裂痕,要求换货!"
输出:order_id=ORD12345678, issue_type=商品质量, user_request=换货, urgency_level=4
"""),
("human", "用户投诉内容:\n{text}"),
("system", "请根据上述规则严格处理输入,确保输出格式正确且数据准确。如信息缺失请留空。")
])
这里是做一个演示,实际场景可能会需要再完善相关内容
处理链
负责组织数据处理流程,将各个组件连接成一个完整的处理管道:
from langchain_core.runnables import RunnablePassthrough, RunnableSerializable
def build_processing_chain() -> RunnableSerializable:
"""构建处理链"""
prompt = create_extraction_prompt()
return (
RunnablePassthrough.assign(text=lambda x: x["text"])
| prompt
| model.with_structured_output(schema=Complaint)
)
chain = build_processing_chain()
LangChain的链设计体现了"函数式编程"的思想,通过管道操作符(|
)将不同的处理步骤连接起来。在上面的代码中:
- \1. 数据预处理:使用
RunnablePassthrough.assign
从输入字典中提取文本信息 - \2. 提示模板应用:将文本信息填入提示模板,生成完整提示
- \3. 模型调用与结构化输出:调用模型并将输出解析为
Complaint
结构体
链的优势在于:
- \1. 声明式设计:清晰表达处理流程,易于理解和维护
- \2. 组件可复用:链中的每个组件都可以单独测试和复用
- \3. 流程可扩展:可以方便地增加新的处理步骤,如数据验证、后处理等
- \4. 错误处理集成:可以在链的各个环节添加错误处理逻辑
在垂直领域应用中,合理设计处理链可以将复杂任务分解为可管理的步骤,提高系统的可维护性和可扩展性。
业务逻辑模块
处理输入并返回结构化结果:
from typing importDict, Any
from contextlib import suppress
from pydantic import ValidationError
defprocess_complaint(text: str) -> Dict[str, Any]:
"""
处理用户投诉文本并返回结构化结果
Args:
text: 用户输入的投诉文本
Returns:
包含处理结果或错误信息的字典
"""
try:
result = chain.invoke({"text": text})
return {
"success": True,
"data": result.dict(exclude_unset=True)
}
except ValidationError as e:
return {"success": False, "error": f"数据验证失败: {str(e)}"}
except Exception as e:
with suppress(Exception):
# 记录完整错误日志(此处简化处理)
pass
return {"success": False, "error": f"处理失败: {str(e)}"}
API部署模块
API部署模块提供了Web服务接口,便于系统集成:
from langserve import add_routes
# 取消注释以下内容以启用LangServe部署
# add_routes("/api", chain)
通过LangServe,垂直领域应用可以轻松转化为服务,与其他的系统生态集成。
验证效果
商品质量问题
test_text = """我的订单号ORD202405019876,上周买的充电宝到货后发现外壳有裂痕,几乎要漏液了!
这种危险品必须立刻处理,需要全额退款并赔偿!"""
response = process_complaint(test_text)
# 输出:
# {
# 'success': True,
# 'data': {
# 'order_id': 'ORD202405019876',
# 'issue_type': '商品质量',
# 'user_request': '全额退款并赔偿',
# 'urgency_level': 5
# }
# }
系统成功识别了订单号、问题类型,并正确判断了紧急度级别(涉及安全问题,被判定为5级)。
物流延迟问题
test_text = "我滴订单号是ORD64524527566啊,物流慢成龟速!说好的三天到,现在都一周了!赶紧给个说法!"
response = process_complaint(test_text)
# 输出:
# {
# 'success': True,
# 'data': {
# 'order_id': 'ORD64524527566',
# 'issue_type': '物流问题',
# 'user_request': '给个说法',
# 'urgency_level': 3
# }
# }
系统从口语化表达中提取了订单号,识别了物流问题类型,并根据延迟天数判断了紧急度级别。
特殊表达方式
test_text = "A123456798558你们家这荔枝罐头,盖子都鼓包了嗦!网上说这是变质的征兆,咋个处理嘛?"
response = process_complaint(test_text)
# 输出:
# {
# 'success': True,
# 'data': {
# 'order_id': 'A123456798558',
# 'issue_type': '商品质量',
# 'user_request': '处理',
# 'urgency_level': 4
# }
# }
不同垂直领域的迁移
上面只是一个 Demo,实际中这套架构可以轻松迁移到其他垂直领域,如:
医疗问诊信息结构化
class MedicalConsultation(BaseModel):
"""医疗问诊数据模型"""
patient_id: Optional[str] = Field(None, description="患者ID")
symptoms: List[str] = Field([], description="症状描述列表")
duration: Optional[str] = Field(None, description="症状持续时间")
severity: Optional[int] = Field(None, ge=1, le=5, description="严重程度(1-5)")
medical_history: Optional[str] = Field(None, description="相关病史")
defcreate_medical_prompt():
"""创建医疗问诊信息提取提示"""
return ChatPromptTemplate.from_messages([
("system",
"""您是一个专业的医疗问诊信息提取助手。请从患者描述中提取关键信息:
1. 患者ID:识别格式如P12345的ID编号
2. 症状列表:提取所有描述的症状
3. 持续时间:症状持续了多长时间
4. 严重程度:根据描述评估严重程度(1-5级)
5. 病史:提取相关的既往病史信息
示例:
输入:"我是P54321,最近三天一直头疼发热,体温38.5度,吃了退烧药没用。我有高血压病史。"
输出:patient_id=P54321, symptoms=["头疼","发热","体温38.5度"], duration="三天", severity=3, medical_history="高血压"
"""),
("human", "患者描述:\n{text}")
])
# 构建医疗问诊处理链
medical_prompt = create_medical_prompt()
medical_chain = (
RunnablePassthrough.assign(text=lambda x: x["text"])
| medical_prompt
| model.with_structured_output(schema=MedicalConsultation)
)
法律文件信息提取
class LegalDocument(BaseModel):
"""法律文件数据模型"""
case_number: Optional[str] = Field(None, description="案件编号")
parties: List[str] = Field([], description="涉案方列表")
legal_issues: List[str] = Field([], description="法律争议点")
filing_date: Optional[str] = Field(None, description="立案日期")
court: Optional[str] = Field(None, description="管辖法院")
defcreate_legal_prompt():
"""创建法律文件信息提取提示"""
return ChatPromptTemplate.from_messages([
("system",
"""您是一个专业的法律文件信息提取助手。请从文件描述中提取关键信息:
1. 案件编号:识别标准案件编号格式
2. 涉案方:提取原告、被告等各方名称
3. 法律争议点:提取主要法律争议点
4. 立案日期:提取案件立案日期
5. 管辖法院:提取管辖法院名称
示例:
输入:"民事判决书(2021)京01民初123号,原告张三诉被告李四合同纠纷案,北京市第一中级人民法院,2021年3月15日立案。"
输出:case_number="(2021)京01民初123号", parties=["张三","李四"], legal_issues=["合同纠纷"], filing_date="2021年3月15日", court="北京市第一中级人民法院"
"""),
("human", "法律文件内容:\n{text}")
])
# 构建法律文件处理链
legal_prompt = create_legal_prompt()
legal_chain = (
RunnablePassthrough.assign(text=lambda x: x["text"])
| legal_prompt
| model.with_structured_output(schema=LegalDocument)
)
总结
本文以电商客服投诉处理为场景,展示了如何通过LangChain框架与开源大模型构建垂直领域智能应用的完整路径。大家可以根据自己的实际场景进行动态调整。
如何零基础入门 / 学习AI大模型?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?
”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人」
,毕竟AI时代,谁先尝试,谁就能占得先机!
想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
👉 福利来袭
CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
全套AGI大模型学习大纲+路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉 福利来袭
CSDN大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。