欢迎光临
我们一直在努力

LangChain 框架 | 精简+案例版

目录

一、LangChain 框架基础

1.1 LLM 与 Chat Model 核心区别

1.2 LangChain 框架定位

二、6 大实战案例手把手教学

环境前置

实战 1:Chat Model 基础对话调用

实战 2:提示模板复用(ChatPromptTemplate)

实战 3:少样本提示(FewShotChatMessagePromptTemplate)

实战 4:列表输出解析(CommaSeparatedListOutputParser)

实战 5:结构化信息提取(PydanticOutputParser)

实战 6:LCEL 链式调用(核心最佳实践)

三、实战总结



一、LangChain 框架基础

1.1 LLM 与 Chat Model 核心区别

LLM(大语言模型):本质是 Transformer 解码器架构的生成式模型,核心逻辑是根据上文 token 预测下一个 token,仅支持单轮文本生成,无原生上下文记忆,直接调用 API 为独立单次交互。

Chat Model(聊天模型):是 LLM 的场景化优化版本,像豆包、通义千问等对话产品均属此类,具备上下文记忆能力,输入为结构化角色消息(系统 / 用户 / AI 消息),适配多轮对话场景。

1.2 LangChain 框架定位

LangChain 并非新的大模型,而是LLM 应用开发的标准化框架,将「模型调用、提示词编写、输出解析、流程串联」等复杂操作拆分为即插即用组件,无需从零开发,直接解决几大开发痛点:

  • 大模型输出格式混乱
  • 重复编写提示词效率低
  • 少样本引导模型输出困难

  • 二、6 大实战案例手把手教学

    环境前置

    命令行窗口执行:

    # 核心依赖安装
    pip install langchain-openai
    # 配置环境变量(推荐,避免密钥硬编码)
    # Windows:set DASHSCOPE_API_KEY=你的阿里云API密钥
    # Mac/Linux:export DASHSCOPE_API_KEY=你的阿里云API密钥

      实战 1:Chat Model 基础对话调用

      目标:掌握 LangChain 调用聊天模型的基础流程,理解角色消息格式

      代码:

      from langchain_openai import ChatOpenAI
      from langchain.schema.messages import HumanMessage, SystemMessage
      import os

      # 初始化通义千问(OpenAI兼容接口)
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
      temperature=1.2,
      max_tokens=300
      )

      # 构造角色化对话消息
      messages = [
      SystemMessage(content="作为数学课助教,用通俗语言解释数学原理"),
      HumanMessage(content="什么是勾股定理?"),
      ]

      # 调用并输出
      response = model.invoke(messages)
      print(response.content)

      结果:

      核心知识点:Chat Model 输入为角色化消息列表,SystemMessage定义模型行为,HumanMessage为用户输入。


      实战 2:提示模板复用(ChatPromptTemplate)

      目标:解决重复写提示词问题,实现动态参数替换与批量调用

      代码:

      from langchain.prompts import (
      SystemMessagePromptTemplate,
      HumanMessagePromptTemplate,
      ChatPromptTemplate
      )
      from langchain_openai import ChatOpenAI
      import os

      # 1. 单独定义提示模板
      system_template = SystemMessagePromptTemplate.from_template(
      "你是专业翻译,将{input_language}译为{output_language},按{style}输出,仅返回译文"
      )
      human_template = HumanMessagePromptTemplate.from_template(
      "文本:{text}"
      )

      # 2. 可以直接把1的单独定义整合为统一提示模板
      prompt_template = ChatPromptTemplate.from_messages([
      ("system", "你是专业翻译,将{input_language}译为{output_language},按{style}输出,仅返回译文"),
      ("human", "文本:{text}")
      ])

      # 3. 初始化模型
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
      )

      # 4. 批量调用
      batch_inputs = [
      {"input_language":"汉语","output_language":"汉语","text":"勿以善小而不为","style":"白话文"},
      {"input_language":"法语","output_language":"英语","text":"Je suis désolé","style":"古英语"}
      ]

      for item in batch_inputs:
      res = model.invoke(prompt_template.invoke(item))
      print(res.content)

      结果:

      核心知识点:ChatPromptTemplate支持参数化提示词,整合多角色消息,大幅提升提示复用率。


      实战 3:少样本提示(FewShotChatMessagePromptTemplate)

      目标:通过少量示例引导模型固定输出格式,无需冗长提示词

      代码:

      from langchain_openai import ChatOpenAI
      from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
      import os

      # 1. 定义示例格式
      example_prompt = ChatPromptTemplate.from_messages([
      ("human", "格式化客户信息:\\n姓名->{name}\\n年龄->{age}\\n城市->{city}"),
      ("ai", "##客户信息\\n-姓名:{f_name}\\n-年龄:{f_age}\\n-地址:{f_addr}")
      ])

      # 2. 少样本示例数据
      examples = [
      {"name":"张三","age":"27","city":"长沙","f_name":"张三","f_age":"27岁","f_addr":"湖南省长沙市"},
      {"name":"李四","age":"42","city":"广州","f_name":"李四","f_age":"42岁","f_addr":"广东省广州市"}
      ]

      # 3. 构建少样本提示
      few_shot_prompt = FewShotChatMessagePromptTemplate(
      example_prompt=example_prompt,
      examples=examples
      )

      # 4. 最终提示
      final_prompt = ChatPromptTemplate.from_messages([
      few_shot_prompt,
      ("human", "{input}")
      ])

      # 5. 调用模型
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",
      temperature=0.1
      )

      res = model.invoke(final_prompt.invoke({"input":"格式化:姓名->王五,年龄->31,城市->郑州"}))
      print(res.content)

      结果:

      核心知识点:少样本提示用少量示例替代长提示,temperature=0.1保证输出格式稳定。


      实战 4:列表输出解析(CommaSeparatedListOutputParser)

      目标:将模型文本输出转为 Python 列表,解决格式混乱问题

      第三方库:  

      • ChatOpenAI:LangChain 封装的 OpenAI 风格聊天模型类(这里兼容阿里云通义千问的 API 格式),用于调用大模型。
      • CommaSeparatedListOutputParser:逗号分隔列表解析器,能把模型返回的「A,B,C」格式文本转换成 Python 列表 [A,B,C]。
      • ChatPromptTemplate:LangChain 的聊天型提示模板,用于构建结构化的对话提示(区分系统 / 人类角色)。
      • os:用于读取环境变量中的 API 密钥(避免硬编码密钥,更安全)。

      代码:

      from langchain_openai import ChatOpenAI
      from langchain.output_parsers import CommaSeparatedListOutputParser
      from langchain.prompts import ChatPromptTemplate
      import os

      # 1. 初始化解析器
      parser = CommaSeparatedListOutputParser()
      parser_instr = parser.get_format_instructions()

      # 2. 提示模板
      prompt = ChatPromptTemplate.from_messages([
      ("system", "{parser_instr}"),
      ("human", "列出5个{subject}汽车品牌")
      ])

      # 3. 模型调用
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
      )

      # 4. 解析输出
      raw_res = model.invoke(prompt.invoke({"subject":"中国","parser_instr":parser_instr}))
      print(raw_res)
      parsed_res = parser.invoke(raw_res)
      print("解析后列表:", parsed_res)

      注释:

      • parser = CommaSeparatedListOutputParser():创建解析器实例,核心作用是标准化模型输出格式,确保后续能把文本转成列表。
      • parser_instr = parser.get_format_instructions():获取解析器的「格式说明指令」(比如:"请将输出格式化为逗号分隔的列表,例如:苹果,香蕉,橙子"),这行指令会传给模型,强制模型按逗号分隔的格式输出,方便后续解析。

      ChatPromptTemplate.from_messages():按「角色 – 内容」的格式构建提示模板,模拟真实的对话场景:

      • ("system", "{parser_instr}"):系统角色,传入解析器的格式说明,告诉模型「必须按逗号分隔列表输出」。
      • ("human", "列出5个{subject}汽车品牌"):人类用户的提问,{subject} 是占位符(后续会传入「中国」「德国」等具体值)。

      结果:

      核心知识点:解析器自动将文本转为 Python 数据结构,无需手动字符串处理。


      实战 5:结构化信息提取(PydanticOutputParser)

      目标:自定义数据结构,精准提取多字段、多类型结构化信息,可以理解成Python的字典类型

      第三方库:  

      • from typing import List:导入列表类型注解,用于定义「题材」字段的类型(支持多个题材,如 ["喜剧", "悬疑"])。
      • PydanticOutputParser:LangChain 专为 Pydantic 模型设计的输出解析器,能把模型返回的文本转换成 Pydantic 对象(强类型,可直接通过属性调用)。
      • ChatPromptTemplate:构建结构化的聊天提示模板,区分系统 / 人类角色。
      • BaseModel, Field:Pydantic 的核心类 ——BaseModel 是自定义数据模型的基类,Field 用于给字段添加描述、示例,帮助大模型理解要输出的内容。
      • ChatOpenAI:兼容 OpenAI API 格式的模型调用类(这里用于调用阿里云通义千问)。
      代码:

      from typing import List
      from langchain.output_parsers import PydanticOutputParser
      from langchain.prompts import ChatPromptTemplate
      from langchain_core.pydantic_v1 import BaseModel, Field
      from langchain_openai import ChatOpenAI
      import os

      # 1. 定义结构化数据模型
      class FilmInfo(BaseModel):
      film_name: str = Field(description="电影名", example="唐人街探案")
      director: str = Field(description="导演", example="陈思诚")
      genres: List[str] = Field(description="题材", example=["喜剧"])

      # 2. 初始化解析器
      parser = PydanticOutputParser(pydantic_object=FilmInfo)

      # 3. 提示模板
      prompt = ChatPromptTemplate.from_messages([
      ("system", "{parser_instr} 输出使用中文"),
      ("human", "从概述提取电影名、导演、题材:###{text}###")
      ])

      # 4. 调用&解析
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
      )

      text = """《唐人街探案》由陈思诚执导,是喜剧题材电影"""
      res = model.invoke(prompt.invoke({
      "text":text,
      "parser_instr":parser.get_format_instructions()
      }))

      result = parser.invoke(res)
      print(result)
      print("电影名:", result.film_name)
      print("题材:", result.genres)

      注释:
      • class FilmInfo(BaseModel):自定义一个 Pydantic 数据模型,继承 BaseModel,定义要提取的三个核心字段:
        • film_name: str:字符串类型,存储电影名;Field(description="电影名", example="唐人街探案") 给大模型提供「字段含义 + 示例」,让模型更精准输出。
        • director: str:字符串类型,存储导演名。
        • genres: List[str]:列表类型(支持多个题材),存储电影题材;示例 ["喜剧"] 告诉模型要输出列表格式。
      • Pydantic 对象本质是 基于 Pydantic 库的 BaseModel 自定义类创建的实例,可以把它理解成:带 “严格说明书” 的结构化数据容器 —— 它不仅能存储数据,还会自动校验数据的类型和格式是否符合你定义的规则,且支持通过「对象。属性」的方式便捷访问数据。
      结果:

      核心知识点:BaseModel定义输出规范,解析器自动校验数据类型,支持复杂结构化提取。


      实战 6:LCEL 链式调用(核心最佳实践)

      目标:用管道符|串联组件,极简代码实现全流程调用

      代码:

      from langchain_openai import ChatOpenAI
      from langchain.output_parsers import CommaSeparatedListOutputParser
      from langchain.prompts import ChatPromptTemplate
      import os

      # 1. 定义组件
      prompt = ChatPromptTemplate.from_messages([
      ("system", "{parser_instr}"),
      ("human", "列出5个{subject}汽车品牌")
      ])
      parser = CommaSeparatedListOutputParser()
      model = ChatOpenAI(
      model="qwen-plus",
      openai_api_key=os.getenv("DASHSCOPE_API_KEY"),
      openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
      )

      # 2. LCEL链式串联(核心)
      chain = prompt | model | parser

      # 3. 一键调用
      res = chain.invoke({
      "subject":"中国",
      "parser_instr":parser.get_format_instructions()
      })
      print(res)

      结果:

      核心知识点:LCEL 用|定义数据流向,提示→模型→解析一步到位,代码极简、可复用性拉满。


      三、实战总结

    • Chat Model:角色化消息是对话基础,SystemMessage控制模型行为;
    • 提示模板:参数化 + 复用,解决提示词冗余问题;
    • 少样本提示:少量示例引导格式,比长提示更稳定;
    • 输出解析:文本转结构化数据,适配工程化开发;
    • Pydantic 解析:自定义结构,精准提取复杂信息;
    • LCEL 链式:LangChain 标准开发范式,极简高效。
    • 本文所有代码可直接运行,适配国内通义千问模型,替换model与 API 配置即可兼容 ChatGPT、Ollama 等模型,快速落地各类 LLM 应用。

      赞(0)
      未经允许不得转载:171主机测评 » LangChain 框架 | 精简+案例版
      分享到: 更多 (0)

      评论 抢沙发

      • 昵称 (必填)
      • 邮箱 (必填)
      • 网址