快速搭建功能完备的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,以此展示关键的生产级概念:

  1. 详细的系统提示词,优化智能体行为
  2. 创建集成外部数据的工具
  3. 模型配置,确保响应一致
  4. 结构化输出,保证结果可预测
  5. 对话记忆,实现类聊天交互
  6. 创建并运行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'])



Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐