大模型应用技术之Langchain1.x实践
LangChain v1.0 是一个强大的框架,用于构建基于大型语言模型(LLM)的智能应用。它提供标准化的模型接口,支持 OpenAI、Anthropic 和 Google 等主流模型,并可通过不到 10 行代码快速创建智能体。核心特性包括统一的 API 接口、智能体构建、LangGraph 集成和调试工具 LangSmith。安装简单,支持流式响应和批量处理。开发者可以轻松创建各种工具(如天气
·
什么是 LangChain?
LangChain 是构建由大型语言模型(LLM)驱动的应用程序和智能体的最便捷方式。通过不到 10 行代码,您可以连接到 OpenAI、Anthropic、Google 等主流模型提供商。
v1.0 版本核心特性
LangChain v1.0 是一个重要的里程碑版本,带来了以下核心改进:
- 标准化的模型接口:统一不同提供商的 API,实现无缝切换
- 易于使用的智能体:10 行代码即可创建功能强大的智能体
- 基于 LangGraph 构建:享受持久化执行、人机交互、流式处理等高级特性
- 强大的调试能力:通过 LangSmith 获得深度可视化和追踪能力
LangChain vs LangGraph
- LangChain:适合快速构建智能体和自主应用,提供预构建的智能体架构
- LangGraph:低级别的智能体编排框架,适合需要确定性工作流、深度定制和精确控制延迟的高级场景
环境安装与配置
基础安装
# 安装 LangChain v1.0(需要 Python 3.10+)
pip install -U langchain
# 安装特定模型提供商的集成(按需选择)
pip install -qU "langchain[anthropic]" # Anthropic Claude
pip install -qU "langchain[openai]" # OpenAI GPT
pip install -qU "langchain[google]" # Google Gemini
环境变量配置
创建 .env 文件或在系统环境变量中设置:
# OpenAI
export OPENAI_API_KEY="your-openai-api-key"
# Anthropic
export ANTHROPIC_API_KEY="your-anthropic-api-key"
# Google
export GOOGLE_API_KEY="your-google-api-key"
# LangSmith(可选,用于调试和追踪)
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="your-langsmith-api-key"
验证安装
import langchain
print(f"LangChain 版本: {langchain.__version__}")
模型使用
1. 基础模型调用
使用 OpenAI 模型
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# 创建模型实例
llm = ChatOpenAI(
model="gpt-4o",
temperature=0.7,
max_tokens=1000
)
# 单次调用
response = llm.invoke("什么是人工智能?")
print(response.content)
使用 Anthropic Claude 模型
from langchain_anthropic import ChatAnthropic
# 创建 Claude 模型实例
llm = ChatAnthropic(
model="claude-sonnet-4-5-20250929",
temperature=0.7
)
# 调用模型
response = llm.invoke("解释一下量子计算的基本原理")
print(response.content)
使用 Google Gemini 模型
from langchain_google_genai import ChatGoogleGenerativeAI
# 创建 Gemini 模型实例
llm = ChatGoogleGenerativeAI(
model="gemini-pro",
temperature=0.7
)
response = llm.invoke("Python 中如何实现异步编程?")
print(response.content)
2. 流式响应
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", streaming=True)
# 流式调用
for chunk in llm.stream("写一首关于春天的诗"):
if chunk.content:
print(chunk.content, end="", flush=True)
3. 批量调用
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o")
# 批量处理多个输入
messages = [
[HumanMessage(content="什么是机器学习?")],
[HumanMessage(content="什么是深度学习?")],
[HumanMessage(content="什么是强化学习?")]
]
responses = llm.batch(messages)
for response in responses:
print(response.content)
4. 带系统提示词的对话
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage
llm = ChatOpenAI(model="gpt-4o")
messages = [
SystemMessage(content="你是一个专业的技术顾问,擅长解释复杂的技术概念。"),
HumanMessage(content="请用简单的语言解释什么是区块链?")
]
response = llm.invoke(messages)
print(response.content)
工具(Tools)开发
工具是智能体与外部世界交互的接口。LangChain 支持多种工具类型。
1. 基础函数工具
最简单的工具就是 Python 函数:
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。
Args:
city: 城市名称,例如:北京、上海、深圳
"""
# 这里应该是实际的天气 API 调用
# 示例返回
weather_data = {
"北京": "晴天,温度 25°C",
"上海": "多云,温度 22°C",
"深圳": "小雨,温度 28°C"
}
return weather_data.get(city, f"{city}的天气信息暂时无法获取")
# 使用工具
result = get_weather.invoke({"city": "北京"})
print(result)
2. 计算器工具
from langchain_core.tools import tool
import math
@tool
def calculator(expression: str) -> str:
"""执行数学计算。
Args:
expression: 数学表达式,例如:2+2, 10*5, sqrt(16)
"""
try:
# 安全的数学计算
result = eval(expression, {"__builtins__": {}}, {
"sqrt": math.sqrt,
"sin": math.sin,
"cos": math.cos,
"tan": math.tan,
"pi": math.pi,
"e": math.e
})
return str(result)
except Exception as e:
return f"计算错误: {str(e)}"
# 使用示例
result = calculator.invoke({"expression": "sqrt(16) + 10*2"})
print(result)
3. 网络搜索工具
from langchain_core.tools import tool
import requests
@tool
def search_web(query: str) -> str:
"""在网络上搜索信息。
Args:
query: 搜索关键词
"""
# 这里应该调用实际的搜索 API(如 Google Search API、Serper API 等)
# 示例实现
try:
# 实际项目中应该使用真实的搜索 API
return f"关于'{query}'的搜索结果:这是一个示例返回,实际应该调用搜索 API"
except Exception as e:
return f"搜索失败: {str(e)}"
4. 数据库查询工具
from langchain_core.tools import tool
import sqlite3
@tool
def query_database(query: str) -> str:
"""执行数据库查询。
Args:
query: SQL 查询语句
"""
try:
# 示例:SQLite 数据库
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute(query)
results = cursor.fetchall()
conn.close()
return str(results)
except Exception as e:
return f"查询错误: {str(e)}"
5. 文件操作工具
from langchain_core.tools import tool
import os
@tool
def read_file(file_path: str) -> str:
"""读取文件内容。
Args:
file_path: 文件路径
"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
return f.read()
except Exception as e:
return f"读取文件失败: {str(e)}"
@tool
def write_file(file_path: str, content: str) -> str:
"""写入文件内容。
Args:
file_path: 文件路径
content: 要写入的内容
"""
try:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return f"文件已成功写入: {file_path}"
except Exception as e:
return f"写入文件失败: {str(e)}"
6. 工具组合示例
from langchain_core.tools import tool
# 定义多个工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
return f"{city}的天气:晴天,25°C"
@tool
def get_time(timezone: str = "UTC") -> str:
"""获取当前时间。
Args:
timezone: 时区,默认为 UTC
"""
from datetime import datetime
return f"当前时间({timezone}): {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
@tool
def translate_text(text: str, target_language: str) -> str:
"""翻译文本到目标语言。
Args:
text: 要翻译的文本
target_language: 目标语言代码,如:en, zh, ja
"""
# 这里应该调用实际的翻译 API
return f"[{target_language}] {text}"
# 工具列表
tools = [get_weather, get_time, translate_text]
智能体(Agent)创建与使用
1. 最简单的智能体
根据官方文档,创建智能体只需要几行代码:
from langchain.agents import create_agent
from langchain_anthropic import ChatAnthropic
# 定义工具
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
return f"{city}的天气:晴天,25°C"
# 创建智能体
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[get_weather],
system_prompt="你是一个有用的助手",
)
# 运行智能体
response = agent.invoke(
{"messages": [{"role": "user", "content": "北京的天气怎么样?"}]}
)
print(response["messages"][-1].content)
2. 使用 OpenAI 模型的智能体
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# 定义多个工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
return f"{city}的天气:晴天,25°C"
@tool
def calculator(expression: str) -> str:
"""执行数学计算。"""
try:
result = eval(expression)
return str(result)
except:
return "计算错误"
# 创建智能体
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", temperature=0),
tools=[get_weather, calculator],
system_prompt="你是一个智能助手,可以帮助用户查询天气和执行计算。",
)
# 运行智能体
response = agent.invoke({
"messages": [{
"role": "user",
"content": "北京天气如何?另外帮我计算 123 * 456 等于多少?"
}]
})
print(response["messages"][-1].content)
3. 流式智能体响应
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
return f"{city}的天气:晴天,25°C"
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", streaming=True),
tools=[get_weather],
system_prompt="你是一个有用的助手",
)
# 流式调用
for chunk in agent.stream({
"messages": [{"role": "user", "content": "告诉我北京、上海、深圳的天气"}]
}):
if "messages" in chunk:
for message in chunk["messages"]:
if hasattr(message, "content") and message.content:
print(message.content, end="", flush=True)
4. 带记忆的智能体
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
return f"{city}的天气:晴天,25°C"
agent = create_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[get_weather],
system_prompt="你是一个有用的助手,会记住之前的对话内容。",
)
# 第一轮对话
response1 = agent.invoke({
"messages": [{"role": "user", "content": "我的名字是张三"}]
})
print("助手:", response1["messages"][-1].content)
# 第二轮对话(智能体会记住名字)
response2 = agent.invoke({
"messages": response1["messages"] + [{"role": "user", "content": "我刚才告诉你我的名字是什么?"}]
})
print("助手:", response2["messages"][-1].content)
5. 复杂工具组合的智能体
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
import math
# 定义多个专业工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息。"""
weather_data = {
"北京": "晴天,温度 25°C,湿度 60%",
"上海": "多云,温度 22°C,湿度 70%",
"深圳": "小雨,温度 28°C,湿度 80%"
}
return weather_data.get(city, f"{city}的天气信息暂时无法获取")
@tool
def calculator(expression: str) -> str:
"""执行数学计算,支持基本运算和常用数学函数。"""
try:
result = eval(expression, {"__builtins__": {}}, {
"sqrt": math.sqrt,
"sin": math.sin,
"cos": math.cos,
"tan": math.tan,
"pi": math.pi,
"e": math.e,
"log": math.log,
"exp": math.exp
})
return str(result)
except Exception as e:
return f"计算错误: {str(e)}"
@tool
def get_time(timezone: str = "Asia/Shanghai") -> str:
"""获取当前时间。"""
from datetime import datetime
import pytz
tz = pytz.timezone(timezone)
return datetime.now(tz).strftime('%Y-%m-%d %H:%M:%S %Z')
# 创建智能体
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", temperature=0),
tools=[get_weather, calculator, get_time],
system_prompt="""你是一个多功能的智能助手,可以帮助用户:
1. 查询天气信息
2. 执行数学计算
3. 查询当前时间
请根据用户的问题,智能地选择和使用合适的工具。""",
)
# 复杂查询
response = agent.invoke({
"messages": [{
"role": "user",
"content": """请帮我:
1. 查询北京的天气
2. 计算 sqrt(144) + 10*5 的结果
3. 告诉我当前北京时间"""
}]
})
print(response["messages"][-1].content)
完整实战案例
案例 1:智能客服助手
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 模拟产品数据库
products_db = {
"iPhone 15": {"price": 5999, "stock": 100, "description": "最新款 iPhone"},
"MacBook Pro": {"price": 12999, "stock": 50, "description": "专业级笔记本电脑"},
"AirPods Pro": {"price": 1899, "stock": 200, "description": "降噪无线耳机"}
}
@tool
def search_product(product_name: str) -> str:
"""搜索产品信息。
Args:
product_name: 产品名称
"""
product = products_db.get(product_name)
if product:
return f"产品:{product_name}\n价格:{product['price']}元\n库存:{product['stock']}件\n描述:{product['description']}"
return f"未找到产品:{product_name}"
@tool
def check_order_status(order_id: str) -> str:
"""查询订单状态。
Args:
order_id: 订单编号
"""
# 模拟订单查询
return f"订单 {order_id} 的状态:已发货,预计明天送达"
@tool
def create_order(product_name: str, quantity: int) -> str:
"""创建订单。
Args:
product_name: 产品名称
quantity: 购买数量
"""
product = products_db.get(product_name)
if not product:
return f"产品 {product_name} 不存在"
if product['stock'] < quantity:
return f"库存不足,当前库存:{product['stock']}件"
order_id = f"ORD{hash(product_name + str(quantity)) % 10000}"
total_price = product['price'] * quantity
return f"订单创建成功!\n订单号:{order_id}\n产品:{product_name}\n数量:{quantity}\n总价:{total_price}元"
# 创建客服智能体
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", temperature=0.3),
tools=[search_product, check_order_status, create_order],
system_prompt="""你是一个专业的电商客服助手。你的职责是:
1. 帮助客户查询产品信息
2. 查询订单状态
3. 协助客户下单
请用友好、专业的语气与客户交流。""",
)
# 模拟客服对话
queries = [
"我想了解一下 iPhone 15 的信息",
"帮我查一下订单 ORD1234 的状态",
"我想买 2 个 AirPods Pro"
]
for query in queries:
print(f"\n客户: {query}")
response = agent.invoke({
"messages": [{"role": "user", "content": query}]
})
print(f"客服: {response['messages'][-1].content}")
案例 2:数据分析助手
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
import pandas as pd
import numpy as np
# 模拟数据
data = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=30),
'sales': np.random.randint(1000, 5000, 30),
'region': np.random.choice(['北京', '上海', '深圳'], 30)
})
@tool
def get_sales_summary() -> str:
"""获取销售数据摘要。"""
summary = {
'总销售额': data['sales'].sum(),
'平均销售额': data['sales'].mean(),
'最高销售额': data['sales'].max(),
'最低销售额': data['sales'].min()
}
return str(summary)
@tool
def get_region_sales(region: str) -> str:
"""获取指定区域的销售数据。
Args:
region: 区域名称(北京、上海、深圳)
"""
region_data = data[data['region'] == region]
if region_data.empty:
return f"未找到区域 {region} 的数据"
summary = {
'区域': region,
'总销售额': region_data['sales'].sum(),
'平均销售额': region_data['sales'].mean(),
'数据点数量': len(region_data)
}
return str(summary)
@tool
def calculate_growth_rate(period: int = 7) -> str:
"""计算增长率。
Args:
period: 时间周期(天数),默认 7 天
"""
recent = data.tail(period)['sales'].mean()
previous = data.iloc[-period*2:-period]['sales'].mean()
growth = ((recent - previous) / previous) * 100
return f"最近 {period} 天相比前 {period} 天的增长率:{growth:.2f}%"
# 创建数据分析智能体
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", temperature=0),
tools=[get_sales_summary, get_region_sales, calculate_growth_rate],
system_prompt="""你是一个数据分析专家。你可以:
1. 提供销售数据摘要
2. 分析特定区域的销售情况
3. 计算增长率等指标
请用清晰、专业的方式呈现分析结果。""",
)
# 使用示例
response = agent.invoke({
"messages": [{
"role": "user",
"content": "请帮我分析一下销售情况,包括总体摘要、各区域对比和增长率"
}]
})
print(response["messages"][-1].content)
案例 3:代码生成与执行助手
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
import subprocess
import sys
@tool
def execute_python_code(code: str) -> str:
"""执行 Python 代码并返回结果。
Args:
code: 要执行的 Python 代码
"""
try:
# 安全执行代码(实际应用中需要更严格的安全检查)
result = eval(code)
return f"执行结果:{result}"
except Exception as e:
return f"执行错误:{str(e)}"
@tool
def generate_code(description: str, language: str = "python") -> str:
"""根据描述生成代码。
Args:
description: 代码功能描述
language: 编程语言,默认 python
"""
# 这里应该调用代码生成模型或 API
# 示例返回
if language == "python":
if "排序" in description:
return "sorted_list = sorted(your_list)"
elif "文件读取" in description:
return "with open('file.txt', 'r') as f:\n content = f.read()"
return f"# {description}\n# 代码生成功能需要集成代码生成模型"
# 创建代码助手智能体
agent = create_agent(
model=ChatOpenAI(model="gpt-4o", temperature=0.3),
tools=[execute_python_code, generate_code],
system_prompt="""你是一个编程助手,可以帮助用户:
1. 生成代码
2. 执行简单的 Python 代码
3. 解答编程问题
请确保生成的代码安全、高效、易读。""",
)
# 使用示例
response = agent.invoke({
"messages": [{
"role": "user",
"content": "帮我生成一个 Python 函数,用于计算斐波那契数列的第 n 项"
}]
})
print(response["messages"][-1].content)
高级特性
1. 自定义系统提示词
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
custom_system_prompt = """你是一个专业的 AI 助手,具有以下特点:
1. 回答准确、专业
2. 语言简洁明了
3. 能够主动使用工具解决问题
4. 对不确定的问题会明确说明
请始终遵循以上原则。"""
agent = create_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[get_weather],
system_prompt=custom_system_prompt,
)
2. 模型参数调优
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# 高创造性任务
creative_agent = create_agent(
model=ChatOpenAI(
model="gpt-4o",
temperature=0.9, # 高温度,更创造性
max_tokens=2000
),
tools=[get_weather],
system_prompt="你是一个富有创造力的助手",
)
# 精确性任务
precise_agent = create_agent(
model=ChatOpenAI(
model="gpt-4o",
temperature=0, # 低温度,更精确
max_tokens=1000
),
tools=[calculator],
system_prompt="你是一个精确的计算助手",
)
3. 错误处理与重试
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
import time
@tool
def unreliable_api_call() -> str:
"""模拟不稳定的 API 调用。"""
import random
if random.random() < 0.5:
raise Exception("API 调用失败")
return "API 调用成功"
# 带重试的工具
@tool
def reliable_api_call(max_retries: int = 3) -> str:
"""带重试机制的 API 调用。"""
for attempt in range(max_retries):
try:
return unreliable_api_call.invoke({})
except Exception as e:
if attempt == max_retries - 1:
return f"重试 {max_retries} 次后仍然失败: {str(e)}"
time.sleep(1)
return "未知错误"
agent = create_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[reliable_api_call],
system_prompt="你是一个可靠的助手",
)
4. 工具链式调用
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
@tool
def get_user_location(user_id: str) -> str:
"""获取用户位置。"""
locations = {
"user1": "北京",
"user2": "上海",
"user3": "深圳"
}
return locations.get(user_id, "未知位置")
@tool
def get_weather(city: str) -> str:
"""获取天气信息。"""
return f"{city}的天气:晴天,25°C"
# 智能体可以链式调用工具
agent = create_agent(
model=ChatOpenAI(model="gpt-4o"),
tools=[get_user_location, get_weather],
system_prompt="你可以先获取用户位置,然后查询该位置的天气",
)
# 智能体会自动链式调用
response = agent.invoke({
"messages": [{"role": "user", "content": "user1 所在城市的天气如何?"}]
})
print(response["messages"][-1].content)
最佳实践与注意事项
1. 工具设计原则
- 单一职责:每个工具应该只做一件事
- 清晰的文档字符串:工具的描述和参数说明要详细,帮助模型理解何时使用
- 错误处理:工具应该优雅地处理错误,返回有意义的错误信息
- 类型提示:使用类型提示帮助模型理解参数类型
@tool
def good_tool_example(city: str, unit: str = "celsius") -> str:
"""获取指定城市的天气信息。
这是一个好的工具设计示例:
- 有清晰的文档字符串
- 参数有类型提示
- 有默认值
- 返回类型明确
Args:
city: 城市名称,例如:北京、上海
unit: 温度单位,celsius(摄氏度)或 fahrenheit(华氏度),默认 celsius
"""
# 实现逻辑
return f"{city}的天气信息"
2. 系统提示词编写
- 明确角色:清楚定义智能体的角色和职责
- 行为规范:说明智能体应该如何行为
- 工具使用指导:告诉智能体何时使用哪些工具
- 输出格式:如果需要特定格式的输出,在提示词中说明
3. 性能优化
- 模型选择:根据任务复杂度选择合适的模型
- 温度设置:创造性任务用高温度,精确性任务用低温度
- 批量处理:对于多个相似请求,使用批量调用
- 缓存:对于重复的查询,考虑添加缓存机制
4. 安全考虑
- 输入验证:验证用户输入,防止注入攻击
- 工具权限:限制工具的执行权限
- 敏感信息:不要在工具中硬编码 API 密钥等敏感信息
- 代码执行:如果工具涉及代码执行,需要严格的安全检查
5. 调试技巧
- 启用 LangSmith:使用 LangSmith 追踪智能体的执行过程
- 日志记录:记录工具调用和模型响应
- 分步测试:先测试单个工具,再测试完整智能体
- 错误信息:提供详细的错误信息帮助调试
# 启用 LangSmith 追踪
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
# 现在所有的调用都会被追踪
agent.invoke({"messages": [{"role": "user", "content": "测试"}]})
更多推荐


所有评论(0)