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:
bashpip install langchain
更多安装细节请参见 LangChain 安装指南。
-
设置 LangSmith (可选但推荐): LangSmith 对于理解应用内部流程非常有帮助。
-
访问 LangSmith 网站 注册。
-
设置环境变量以启用追踪:
bashexport LANGCHAIN_TRACING_V2="true" export LANGCHAIN_API_KEY="..." # 填入你的 LangSmith API 密钥
-
或者在 Python/Notebook 中设置:
pythonimport 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 为例):
bashpip install -qU langchain-openai
-
选择和初始化模型: LangChain 支持多种模型。这里以配置 TogetherAI 访问 Mixtral 为例(需要 TogetherAI API 密钥)。
pythonimport 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
方法。输入通常是包含不同角色消息的列表。pythonfrom langchain_core.messages import HumanMessage, SystemMessage messages = [ SystemMessage(content="将以下内容从英语翻译成意大利语"), # 系统消息:设定 AI 的行为或上下文 HumanMessage(content="hi!"), # 人类消息:代表用户的输入 ] response = model.invoke(messages) print(response)
模型返回一个
AIMessage
对象,包含响应文本和其他元数据:iniAIMessage(content='ciao!', response_metadata={...}, id='...')
4. 使用输出解析器
语言模型的原始输出(AIMessage
)可能包含我们不需要的额外信息。输出解析器帮助我们提取核心内容。
-
导入
StrOutputParser
: 这是一个简单的解析器,仅提取消息中的字符串内容。pythonfrom langchain_core.output_parsers import StrOutputParser parser = StrOutputParser()
-
单独使用解析器:
pythonresult = 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
:pythonfrom langchain_core.prompts import ChatPromptTemplate
-
定义模板: 创建一个包含占位符的模板结构。
pythonsystem_template = "将以下内容翻译成 {language}:" # .from_messages 接受一个元组列表,每个元组是 (角色, 模板字符串) prompt_template = ChatPromptTemplate.from_messages([ ("system", system_template), # 系统消息模板 ("user", "{text}") # 用户消息模板 ])
{language}
和{text}
是变量,将在运行时填充。 -
使用模板生成提示: 调用
.invoke
并传入包含变量值的字典。pythonprompt_value = prompt_template.invoke({"language": "意大利语", "text": "你好"}) print(prompt_value) # 输出 ChatPromptValue 对象 print(prompt_value.to_messages()) # 将其转换为消息列表
输出:
lessChatPromptValue(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:
bashpip 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)
-
运行服务器: 在终端中执行:
bashpython 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 等)打下了基础。