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

LangChain 核心组件实操

很多刚接触大模型开发的同学都会遇到三个共性麻烦:

  • 换个模型就要重写一遍调用代码,来回适配接口很折腾
  • 提示词每次都手写大段重复内容,改个规则要翻遍所有代码
  • 模型输出的都是自然语言,想取个数据还得写正则拆分,又麻烦又容易错

LangChain 的核心组件就是专门解决这些问题的。它把大模型应用拆成了一块块标准化“积木”,学会组合这几块基础积木,就能快速搭出稳定可控的小应用。本文只讲最核心的 3 个组件,配新手友好的实操案例,看完就能动手跑通。

一、模型调用:一套代码兼容所有大模型

解决什么问题

不同厂商的大模型(OpenAI、DeepSeek、本地开源模型)接口规范都不一样,如果每次换底座都要重写业务逻辑,开发效率会非常低。

LangChain 做了一层统一封装,不管底层用哪家的模型,上层调用方式完全一致。换模型只需要改一行初始化代码,业务逻辑丝毫不动。

先搞懂两个基础概念

现在主流大模型基本都是对话模型(ChatModel),也就是接收“带角色的对话列表”,返回一条回复。另一种纯文本生成的 LLM 已经很少用了,新手重点掌握对话模型即可。

对话里的三种角色不是单纯的“身份标签”,而是有明确的约束优先级:

  • system:全局规则,比如“你是一个编程入门助教,说话要通俗”,全程生效,优先级最高
  • user:用户当前的问题/指令,推动对话前进
  • assistant:模型之前的回复,用来让模型记住上下文,不然它下一轮就“失忆”了

新手实操:5行代码跑通对话

我们用最常见的兼容 OpenAI 接口的模型做演示,全程只需要“初始化→构造消息→调用→取结果”四步。

fromlangchain_openaiimportChatOpenAIfromdotenvimportload_dotenvimportos# 加载密钥(把密钥存在.env文件里,不要硬写在代码里)load_dotenv()# 1. 初始化模型:换模型只改这里的参数llm=ChatOpenAI(api_key=os.getenv("API_KEY"),base_url=os.getenv("BASE_URL"),model="deepseek-v4-flash",temperature=0.3# 数值越小回答越严谨,越大越有创意)# 2. 构造对话消息messages=[{"role":"system","content":"你是编程入门助教,用大白话解释概念,不超过3句话"},{"role":"user","content":"什么是Python的变量?"}]# 3. 调用模型result=llm.invoke(messages)# 4. 取回复内容print(result.content)

核心要点

  • 统一的invoke()方法是 LangChain 所有组件的通用调用方式,后面的模板、解析器也都用这个方法
  • 想换成本地开源模型?只需要把初始化部分换成 HuggingFace 相关代码,后面的调用逻辑完全不变
  • 多轮对话的本质:每次把新的用户问题和模型回复都追加到消息列表里,再传给模型

二、提示词模板:告别重复写提示词

解决什么问题

比如你想做一个“编程概念解释器”,每次都要把“你是助教、要用大白话、不超过3句话”这些规则重写一遍,不仅麻烦,还容易漏写规则导致输出不稳定。

提示词模板的作用就是把固定规则和动态参数拆开,模板写一次,每次只传不同的参数就行。

基础模板:参数化复用

我们把上面的例子改成模板版,把“概念名称”和“受众”做成可替换的参数:

fromlangchain_core.promptsimportPromptTemplate# 1. 定义模板:用{参数名}占位prompt=PromptTemplate(input_variables=["concept","audience"],template="请用{audience}能听懂的大白话,解释什么是{concept},不超过3句话。")# 2. 传入参数生成完整提示词full_prompt=prompt.format(concept="Python变量",audience="初中生")print(full_prompt)# 3. 传给模型调用result=llm.invoke([{"role":"user","content":full_prompt}])print(result.content)

下次想解释“函数”给“小学生”听,只需要改format()里的参数,模板本身不用动。后续想调整回答风格,也只改模板一处,所有调用都会同步生效。

进阶模板:给示例,让输出格式更听话

光靠文字指令,模型经常输出格式乱飘。比如你想让它按固定格式生成动漫推荐,只说“按格式输出”没用,直接给它看2个示例,效果会好很多,这就是少样本提示模板。

fromlangchain_core.promptsimportFewShotPromptTemplate,PromptTemplate# 1. 准备2个示例examples=[{"name":"千与千寻","recommend":"治愈系动画天花板,适合全年龄段观看"},{"name":"灵能百分百","recommend":"热血又温柔的反套路番,适合喜欢成长向的观众"}]# 2. 定义每个示例的展示格式example_prompt=PromptTemplate(input_variables=["name","recommend"],template="动漫:{name}\n推荐语:{recommend}")# 3. 组装少样本模板few_shot_prompt=FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,suffix="动漫:{new_name}\n推荐语:",input_variables=["new_name"])# 生成提示词并调用full_prompt=few_shot_prompt.format(new_name="进击的巨人")result=llm.invoke([{"role":"user","content":full_prompt}])print(result.content)

核心要点

  • 基础模板解决“重复写提示词”的问题,适合参数化的简单需求
  • 少样本模板解决“输出格式不稳定”的问题,凡是需要固定结构的输出都可以用
  • 实际项目里,示例一般存在 JSON 文件里,不会硬写在代码中,方便批量维护

三、输出解析:把自然语言变成程序能用的数据

解决什么问题

模型默认输出的是一大段自然语言,但业务代码需要的是能直接用的结构化数据(比如字典、列表)。没有解析器的话,你得自己写正则、切字符串来提取信息,又麻烦又容易出错。

输出解析器就是专门做这个转换的,它会引导模型按指定格式输出,再自动转成程序能直接处理的数据类型。

1. 最基础:StrOutputParser

它的作用很简单:把模型返回的AIMessage对象,转成纯字符串。

别小看这个转换,LangChain 里组件串联的时候,类型不统一会出各种问题。它是所有链式调用的基础底座。

fromlangchain_core.output_parsersimportStrOutputParser parser=StrOutputParser()# 链式调用:提示词 → 模型 → 解析器chain=prompt|llm|parser# 直接传参数调用,一步到位拿到字符串结果result=chain.invoke({"concept":"Python列表","audience":"初中生"})print(result)print(type(result))# 纯字符串类型

|是 LangChain 的链式语法,意思是把前一个的输出,传给后一个当输入,不用手动一步步传参。

2. 快速原型:JsonOutputParser

想让模型输出键值对,直接拿到 Python 字典?用这个解析器最快,不需要提前定义数据结构,自动引导模型输出 JSON。

fromlangchain_core.output_parsersimportJsonOutputParser parser=JsonOutputParser()# 模板里嵌入格式要求prompt=PromptTemplate(template="请介绍一部动漫,包含名称、类型、推荐理由3个字段。{format_instructions}",input_variables=[],partial_variables={"format_instructions":parser.get_format_instructions()})chain=prompt|llm|parser result=chain.invoke({})print(result)print(result["名称"])# 直接按键取值

它的优点是简单快捷,缺点是不校验字段类型,适合快速做 Demo。

3. 工程首选:PydanticOutputParser

正式项目里推荐用这个。它需要你先定义一个数据模型,明确每个字段的类型和说明,解析器不仅会引导模型按格式输出,还会自动校验结果,格式不对直接报错,稳定性高很多。

fromlangchain_core.output_parsersimportPydanticOutputParserfrompydanticimportBaseModel,Field# 1. 定义数据模型classAnimeInfo(BaseModel):name:str=Field(description="动漫名称")anime_type:str=Field(description="动漫类型,比如治愈、热血、悬疑")reason:str=Field(description="推荐理由,20字以内")# 2. 创建解析器parser=PydanticOutputParser(pydantic_object=AnimeInfo)# 3. 模板+链式调用prompt=PromptTemplate(template="请推荐一部高分动漫。{format_instructions}",input_variables=[],partial_variables={"format_instructions":parser.get_format_instructions()})chain=prompt|llm|parser result=chain.invoke({})print(result)print(result.name)# 直接访问属性,有代码提示
http://www.jsqmd.com/news/1039387/

相关文章:

  • 老板,你的学习投资回报率有多少?
  • Logistic Regression深度解析:从概率决策到工业级部署
  • 2026全新AI大模型零基础入门指南|小白/程序员/转行专属
  • VS2019使用Microsoft Web Browser控件获取网页源码
  • VXLAN 学习笔记(下篇)
  • Django毕设项目:基于 Django+Vue 的电信业务资费结算管理系统的设计与实现 基于 Django+Vue 的移动通信资费后台管控平台 (源码+文档,讲解、调试运行,定制等)
  • PS501 EEPROM配置与校准实战:从参数解析到精准电量管理
  • 2026玉林防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配桂东南盆地回南天防潮暴雨甄选指南 - 宅安选房屋修缮
  • 安达发|压铸行业生产排单软件:从经验派工到智能调度之变
  • 2026 佛山黄金回收去哪卖 加工碎金古法婚嫁金变现实操攻略 - 靖昱黄金回收
  • 2026十堰防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配秦巴山区多雨湿冷山体渗水防潮甄选指南 - 宅安选房屋修缮
  • RE46C109低功耗报警驱动芯片:集成LDO与升压驱动的设计实战
  • 深度揭秘跨平台GPU加速引擎:whisper.cpp Vulkan后端架构与实践指南
  • 从CVE-2026-24763看沙箱逃逸:环境变量注入如何攻破AI智能体安全防线
  • ShowDoc文件上传漏洞复现:从环境搭建到代码审计的实战指南
  • 计算机毕业设计之创意产品众筹平台
  • 从人脸识别到AR面具:技术实现与创意应用全解析
  • 【人员】人员批量处理与外部数据导入
  • 5分钟快速上手OpenVSP:NASA开源飞机设计软件的完整教程
  • MPC801外部信号全景解析:从引脚到系统交互
  • 深入浅出CSRF攻击:从原理到防御,一篇搞定网络安全漏洞 | 程序员必学,建议收藏
  • 2026 年 6 月上海婚姻律师榜 专业靠谱婚家纠纷处理律师执业全梳理 - 外贸老黄
  • 如何高效管理音频资源:跨平台下载解决方案
  • 赛博格鼓手:机械臂协同演奏的技术实现与音乐应用
  • 2026盘锦防水补漏靠谱服务商盘点:屋面/厨卫/外墙/地下室渗水维修详解,适配辽河口滨海盐碱大风防冻甄选指南 - 宅安选房屋修缮
  • PL2303驱动兼容性终极指南:轻松搞定Windows 10/11黄色感叹号问题
  • NoFences:Windows桌面分区终极解决方案,免费开源告别图标杂乱
  • Discuz! X3.4安全攻防:从任意文件删除到完整Getshell攻击链深度剖析
  • 2026年当下揭阳知名的地下油罐清洗实力公司找哪家?专业实力推荐 - 品牌鉴赏官2026
  • 2026年当下徐州装饰装修公司推荐:聚焦实力与交付的理性之选 - 品牌鉴赏官2026