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 等)打下了基础。

相关推荐
处女座_三月12 小时前
大模型架构记录13【hr agent】
人工智能·python·深度学习·langchain
SanMu三木1 天前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板
langchain·prompt
echola_mendes2 天前
LangChain 结构化输出:用 Pydantic + PydanticOutputParser 驯服 LLM 的“自由发挥”
服务器·前端·数据库·ai·langchain
素雪风华2 天前
大模型LLMs框架Langchain之工具Tools
langchain·大模型·tools·llms·langchain工具包
硅谷神农2 天前
LangChain 框架相关概念
人工智能·langchain
小青柑-3 天前
LangChain 文档加载完全指南:从PDF到YouTube的多样化数据源处理
langchain·pdf
硅谷神农3 天前
从模型返回结构化数据指南
人工智能·python·langchain
SanMu三木3 天前
简单有效的编辑AI交互 Prompt(提示)
langchain·dubbo
Eagle_Clark4 天前
基于LangChain实现Function call
python·langchain·ai编程