3. LangChain 快速入门
·
快速搭建功能完备的Agent
示例使用本地ollama的qwen模型
构建基础Agent
创建一个简单Agent,能够回答问题并调用工具。使用 阿里通义千问(qwen可以免费申请测试token)作为语言模型,以基础天气查询函数作为工具,通过简单提示词指导行为。
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
#这是在阿里账号中你的API_KEY
DASHSCOPE_API_KEY = "sk-acd1277b590c47c8ba7aec1bf6e72222"
llm = ChatOpenAI(
api_key=DASHSCOPE_API_KEY,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 通义千问兼容接口地址
model="qwen-plus", # 通义千问模型名(也可以用qwen-turbo免费版)
temperature=0.1, # 运维/工具调用场景建议低温度,保证准确性
max_tokens=1024
)
def get_weather(city: str) -> str:
"""获取指定城市的天气。"""
return f"{city} 的天气始终是晴天!"
agent = create_agent(
model=llm, # 模型名称
tools=[get_weather], # 可调用的工具列表
system_prompt="你是一个天气助手", # 系统提示词
)
# 运行智能体
agent.invoke(
{"messages": [{"role": "user", "content": "西安的天气怎么样"}]} # 用户请求
)
构建实际应用场景Agent
接下来,我们将构建一个实用的天气预报Agent,以此展示关键的生产级概念:
- 详细的系统提示词,优化智能体行为
- 创建集成外部数据的工具
- 模型配置,确保响应一致
- 结构化输出,保证结果可预测
- 对话记忆,实现类聊天交互
- 创建并运行Agent,测试完整功能
系统提示词定义
系统提示词定义了Agent的角色和行为。请保持内容具体且可执行:
SYSTEM_PROMPT = """
你是一名专业的天气预报员,回答时要包含双关语。你可以使用以下两个工具:
- get_weather_for_location:用于获取指定地点的天气
- get_user_location:用于获取用户所在位置
如果用户询问天气,务必确认具体地点。若能从问题中判断用户指的是自己当前所在位置,使用 get_user_location 工具获取其位置信息。
"""
创建工具
工具允许模型通过调用自定义函数与外部系统交互,可依赖运行时上下文并与智能体记忆交互。
from dataclasses import dataclass
from langchain.tools import tool, ToolRuntime
@tool
def get_weather_for_location(city: str) -> str:
"""获取指定城市的天气。"""
return f"{city} 的天气始终是晴天!"
@dataclass
class Context:
"""自定义运行时上下文模型。"""
user_id: str # 用户ID
@tool
def get_user_location(runtime: ToolRuntime[Context]) -> str:
"""根据用户ID获取用户所在位置。"""
user_id = runtime.context.user_id
return "西安" if user_id == "1" else "呼和浩特"
配置模型
根据实际使用场景,为语言模型设置合适参数(我这里使用的是是阿里的通义千问):
from langchain_openai import ChatOpenAI
# 替换为你自己的通义千问API Key
DASHSCOPE_API_KEY = "sk-acd1277b590c47c8ba7aec1bf6e7275f"
llm = ChatOpenAI(
api_key=DASHSCOPE_API_KEY,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 通义千问兼容接口地址
model="qwen-plus", # 通义千问模型名(也可以用qwen-turbo免费版)
temperature=0.1, # 运维/工具调用场景建议低温度,保证准确性
max_tokens=1024
根据所选的模型和提供商,初始化参数可能会有所不同。
定义响应格式
定义结构化响应模型确保智能体响应符合特定格式:
from dataclasses import dataclass
@dataclass
class ResponseFormat:
"""Agent的响应格式模型。"""
punny_response: str # 必须包含双关语的响应
weather_conditions: str | None = None # 可选:天气相关的信息
添加记忆功能
为Agent添加记忆功能维持多轮交互中的状态:
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver() # 内存中的检查点(用于存储对话状态)
创建并运行Agent
整合所有组件搭建智能体并运行:
from langchain.agents.structured_output import ToolStrategy
agent = create_agent(
model=llm, # 配置好的语言模型
system_prompt=SYSTEM_PROMPT, # 系统提示词
tools=[get_user_location, get_weather_for_location], # 工具列表
context_schema=Context, # 上下文模型
response_format=ToolStrategy(ResponseFormat), # 结构化响应格式
checkpointer=checkpointer # 记忆检查点
)
# `thread_id` 是特定对话的唯一标识
config = {"configurable": {"thread_id": "1"}}
# 调用智能体
response = agent.invoke(
{"messages": [{"role": "user", "content": "外面天气怎么样?"}]},
config=config,
context=Context(user_id="1") # 传入用户ID上下文
)
print(response['structured_response'])
# 使用相同的 `thread_id` 继续对话
response = agent.invoke(
{"messages": [{"role": "user", "content": "谢谢!"}]},
config=config,
context=Context(user_id="1")
)
print(response['structured_response'])
完整整合代码
#这是带提示词的demo
from langchain.tools import tool, ToolRuntime
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain_core.messages import AIMessage
from dataclasses import dataclass
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents.structured_output import ToolStrategy
@tool
def get_weather_for_location(city: str) -> str:
"""获取指定城市的天气。"""
return f"{city} 的天气始终是晴天!"
@dataclass
class Context:
"""自定义运行时上下文模型。"""
user_id: str # 用户ID
@tool
def get_user_location(runtime: ToolRuntime[Context]) -> str:
"""根据用户ID获取用户所在位置。"""
user_id = runtime.context.user_id
return "西安" if user_id == 1 else "上海"
#定义响应格式
@dataclass
class ResponseFormat:
"""Agent的响应格式模型。"""
punny_response: str # 必须包含双关语的响应
weather_conditions: str | None = None # 可选:天气相关的信息
# 替换为你自己的通义千问API Key
DASHSCOPE_API_KEY = "sk-acd1277b590c47c8ba7aec1bf6e72222"
llm = ChatOpenAI(
api_key=DASHSCOPE_API_KEY,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 通义千问兼容接口地址
model="qwen-plus", # 通义千问模型名(也可以用qwen-turbo免费版)
temperature=0.1, # 运维/工具调用场景建议低温度,保证准确性
max_tokens=1024
)
SYSTEM_PROMPT = """
你是一名专业的天气预报员,回答时要包含双关语。你可以使用以下两个工具:
- get_weather_for_location:用于获取指定地点的天气
- get_user_location:用于获取用户所在位置
如果用户询问天气,务必确认具体地点。若能从问题中判断用户指的是自己当前所在位置,使用 get_user_location 工具获取其位置信息。
"""
checkpointer = InMemorySaver()
agent = create_agent(
model=llm,
tools=[get_weather_for_location, get_user_location],
system_prompt=SYSTEM_PROMPT,
context_schema= Context,
response_format=ToolStrategy(ResponseFormat),
checkpointer=checkpointer
)
config = {"configurable": {"thread_id": "1"}}
# Run the agent
response = agent.invoke(
{"messages": [{"role": "user", "content": "今天的天气怎么样"}]},
config=config,
context= Context(user_id=1),
)
print(response['structured_response'])
# 使用相同的 `thread_id` 继续对话
response = agent.invoke(
{"messages": [{"role": "user", "content": "谢谢!"}]},
config=config,
context=Context(user_id="1")
)
print(response['structured_response'])
更多推荐


所有评论(0)