LangChain 快速入门:构建您的第一个 LLM 应用

LangChain 快速入门:构建您的第一个 LLM 应用

本指南将引导您完成使用 LangChain 构建一个基础 LLM 应用的全过程,从核心组件的交互到最终的应用部署。通过这个实例,您将了解 LangChain 的基本工作流程和关键概念,为后续更深入的学习奠定基础。我们将构建一个简单的翻译应用。

1. 核心概念概览

在开始构建之前,了解 LangChain 中的一些基本组件和工具非常重要:

  • 聊天模型 (Chat Model): 与底层大型语言模型(如 GPT、Claude 等)进行交互的接口。
  • 提示词模板 (Prompt Template): 用于根据用户输入或其他动态信息,结构化地生成发送给语言模型的指令(提示)。
  • 输出解析器 (Output Parser): 用于处理和转换语言模型返回的原始响应,提取所需信息或将其格式化为特定结构。
  • LangChain 表达式语言 (LCEL): 一种声明式的方式,允许将不同的 LangChain 组件(如提示模板、模型、解析器)像管道一样串联起来,构建复杂的处理链。
  • LangSmith: 一个用于调试、追踪和监控 LangChain 应用运行过程的平台,有助于理解链内部的每一步。
  • LangServe: 一个用于将使用 LCEL 构建的 LangChain 应用快速部署为 REST API 服务的库。

2. 环境设置

  • Jupyter Notebook(可选): 推荐使用 Jupyter Notebooks 进行交互式学习和开发,便于逐步执行和观察结果。(安装说明请参考 这里

  • 安装 LangChain:

    bash 复制代码
    pip install langchain

    更多安装细节请参见 LangChain 安装指南。

  • 设置 LangSmith (可选但推荐): LangSmith 对于理解应用内部流程非常有帮助。

    • 访问 LangSmith 网站 注册。

    • 设置环境变量以启用追踪:

      bash 复制代码
      export LANGCHAIN_TRACING_V2="true"
      export LANGCHAIN_API_KEY="..." # 填入你的 LangSmith API 密钥
    • 或者在 Python/Notebook 中设置:

      python 复制代码
      import getpass
      import os
      
      os.environ["LANGCHAIN_TRACING_V2"] = "true"
      # 确保在安全的环境中运行 getpass 或直接设置密钥
      # os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
      os.environ["LANGCHAIN_API_KEY"] = "YOUR_LANGSMITH_API_KEY" # 或者直接替换为你的密钥

3. 使用语言模型

首先,学习如何单独与语言模型交互。

  • 安装模型提供商库 (以 OpenAI/TogetherAI 为例):

    bash 复制代码
    pip install -qU langchain-openai
  • 选择和初始化模型: LangChain 支持多种模型。这里以配置 TogetherAI 访问 Mixtral 为例(需要 TogetherAI API 密钥)。

    python 复制代码
    import getpass
    import os
    from langchain_openai import ChatOpenAI # ChatOpenAI 类可用于兼容 OpenAI API 的端点
    
    # 确保设置了 API 密钥环境变量
    # os.environ["TOGETHER_API_KEY"] = getpass.getpass()
    os.environ["TOGETHER_API_KEY"] = "YOUR_TOGETHER_API_KEY" # 替换为你的密钥
    
    model = ChatOpenAI(
        base_url="https://api.together.xyz/v1", # TogetherAI 的 API 端点
        api_key=os.environ["TOGETHER_API_KEY"],
        model="mistralai/Mixtral-8x7B-Instruct-v0.1", # 指定模型
    )
  • 调用模型: ChatModel 实例提供了一个标准的 .invoke 方法。输入通常是包含不同角色消息的列表。

    python 复制代码
    from langchain_core.messages import HumanMessage, SystemMessage
    
    messages = [
        SystemMessage(content="将以下内容从英语翻译成意大利语"), # 系统消息:设定 AI 的行为或上下文
        HumanMessage(content="hi!"), # 人类消息:代表用户的输入
    ]
    
    response = model.invoke(messages)
    print(response)

    模型返回一个 AIMessage 对象,包含响应文本和其他元数据:

    ini 复制代码
    AIMessage(content='ciao!', response_metadata={...}, id='...')

4. 使用输出解析器

语言模型的原始输出(AIMessage)可能包含我们不需要的额外信息。输出解析器帮助我们提取核心内容。

  • 导入 StrOutputParser: 这是一个简单的解析器,仅提取消息中的字符串内容。

    python 复制代码
    from langchain_core.output_parsers import StrOutputParser
    
    parser = StrOutputParser()
  • 单独使用解析器:

    python 复制代码
    result = model.invoke(messages) # 获取 AIMessage 响应
    parsed_result = parser.invoke(result) # 提取字符串内容
    print(parsed_result)

    输出:

    arduino 复制代码
    'ciao!'
  • 使用 LCEL 链接模型和解析器: LCEL 的 | 操作符可以将组件连接起来。数据流从左到右传递。

    python 复制代码
    # model 的输出自动作为 parser 的输入
    chain = model | parser
    parsed_output = chain.invoke(messages)
    print(parsed_output)

    输出:

    arduino 复制代码
    'ciao!'

5. 使用提示词模板

通常,我们不直接硬编码发送给模型的消息,而是根据用户输入动态生成。提示词模板就是为此设计的。

  • 导入 ChatPromptTemplate:

    python 复制代码
    from langchain_core.prompts import ChatPromptTemplate
  • 定义模板: 创建一个包含占位符的模板结构。

    python 复制代码
    system_template = "将以下内容翻译成 {language}:"
    # .from_messages 接受一个元组列表,每个元组是 (角色, 模板字符串)
    prompt_template = ChatPromptTemplate.from_messages([
        ("system", system_template), # 系统消息模板
        ("user", "{text}")          # 用户消息模板
    ])

    {language}{text} 是变量,将在运行时填充。

  • 使用模板生成提示: 调用 .invoke 并传入包含变量值的字典。

    python 复制代码
    prompt_value = prompt_template.invoke({"language": "意大利语", "text": "你好"})
    print(prompt_value) # 输出 ChatPromptValue 对象
    print(prompt_value.to_messages()) # 将其转换为消息列表

    输出:

    less 复制代码
    ChatPromptValue(messages=[SystemMessage(content='将以下内容翻译成 意大利语:'), HumanMessage(content='你好')])
    [SystemMessage(content='将以下内容翻译成 意大利语:'), HumanMessage(content='你好')]

6. 使用 LCEL 连接所有组件

现在,将前面介绍的提示词模板、模型和输出解析器使用 LCEL 组合成一个完整的处理流程。

python 复制代码
# 确保 prompt_template, model, parser 已按前面步骤定义

# 定义完整的链:输入 -> 提示模板 -> 模型 -> 解析器 -> 输出
chain = prompt_template | model | parser

# 调用链,输入是提示词模板所需的字典
final_result = chain.invoke({"language": "意大利语", "text": "你好"})
print(final_result)

输出:

arduino 复制代码
'ciao'

这个 chain 对象封装了从接收输入(语言和文本)到生成最终翻译结果(字符串)的整个逻辑。如果在第 2 步设置了 LangSmith,可以在 LangSmith 界面清晰地看到这个链中每一步的输入和输出。

7. 使用 LangServe 提供服务 (部署)

最后一步是将我们构建的 LangChain 应用部署为一个可供其他服务或用户访问的 API。

  • 安装 LangServe:

    bash 复制代码
    pip install "langserve[all]"
  • 创建 serve.py 文件: 这个 Python 文件包含了运行 API 服务器所需的所有代码。

    python 复制代码
    #!/usr/bin/env python
    from fastapi import FastAPI
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser
    # 假设使用 OpenAI 或兼容的 API (如 TogetherAI)
    from langchain_openai import ChatOpenAI
    from langserve import add_routes
    import os
    import uvicorn
    
    # (确保你的 API 密钥已设置在环境变量中)
    # os.environ["TOGETHER_API_KEY"] = "YOUR_TOGETHER_API_KEY" # 或其他模型提供商的密钥
    # os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" # 如果使用 OpenAI
    
    # 1. 定义提示词模板 (同上)
    system_template = "将以下内容翻译成 {language}:"
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', system_template),
        ('user', '{text}')
    ])
    
    # 2. 定义模型实例 (同上,根据你的选择配置)
    # 示例:使用 OpenAI (需要设置 OPENAI_API_KEY)
    model = ChatOpenAI()
    
    # 3. 定义解析器 (同上)
    parser = StrOutputParser()
    
    # 4. 定义完整的链 (同上)
    chain = prompt_template | model | parser
    
    # 5. 初始化 FastAPI 应用
    app = FastAPI(
      title="LangChain 服务器",
      version="1.0",
      description="一个简单的使用 LangChain Runnable 接口的 API 服务器",
    )
    
    # 6. 使用 LangServe 添加路由
    # 这会自动为你的 'chain' 对象创建必要的 API 端点
    add_routes(
        app,
        chain,
        path="/translate", # 指定 API 路径为 /translate
    )
    
    if __name__ == "__main__":
        # 使用 uvicorn 启动 FastAPI 服务
        uvicorn.run(app, host="localhost", port=8000)
  • 运行服务器: 在终端中执行:

    bash 复制代码
    python serve.py
  • 访问 API: 服务器启动后:

    • API 的交互式文档通常位于 http://localhost:8000/docs

    • 你可以向 http://localhost:8000/translate/invoke 发送 POST 请求来调用翻译链,请求体结构如下:

      json 复制代码
      {
        "input": {
          "language": "法语",
          "text": "hello"
        },
        "config": {}, // 可选配置
        "kwargs": {}  // 可选参数
      }

通过以上步骤,您已经体验了使用 LangChain 构建、组合和部署一个简单 LLM 应用的基本流程。这为您探索 LangChain 更丰富的功能(如 RAG、Agents 等)打下了基础。

相关推荐
一切尽在,你来5 小时前
第二章 预告内容
人工智能·langchain·ai编程
一切尽在,你来10 小时前
1.1 AI大模型应用开发和Langchain的关系
人工智能·langchain
一切尽在,你来10 小时前
1.2 LangChain 1.2.7 版本核心特性与升级点
人工智能·langchain
Bruk.Liu11 小时前
(LangChain 实战14):基于 ChatMessageHistory 自定义实现对话记忆功能
人工智能·python·langchain·agent
JaydenAI17 小时前
[拆解LangChain执行引擎] ManagedValue——一种特殊的只读虚拟通道
python·langchain
OPEN-Source17 小时前
大模型实战:搭建一张“看得懂”的大模型应用可观测看板
人工智能·python·langchain·rag·deepseek
一切尽在,你来19 小时前
1.4 LangChain 1.2.7 核心架构概览
人工智能·langchain·ai编程
一切尽在,你来19 小时前
1.3 环境搭建
人工智能·ai·langchain·ai编程
蛇皮划水怪1 天前
深入浅出LangChain4J
java·langchain·llm
、BeYourself1 天前
LangChain4j 流式响应
langchain