LangChain如何快速入门呢?

构建基本代理 首先我们要对其创建一个简单的代理让他能基本的问答和调用代理下面是简单的实例 我下面调用的是deepseek大模型 [代码] 构建一个天气预报的代理 须有有以下概念: 详细的系统提示 以获得更好的代理行为 创建工具 与外部数据集成 模型配置 以确保响应一致性 结构化输出 以获得可预测的结果 对话记忆 以实…

作者:lh

构建基本代理

首先我们要对其创建一个简单的代理让他能基本的问答和调用代理下面是简单的实例

我下面调用的是deepseek大模型
 # 导入 langgraph 的 create_agent(用于创建可调用工具的智能体)
from langchain.agents import create_agent
# 导入 DeepSeek 模型接口
from langchain_deepseek import ChatDeepSeek


# 定义一个工具函数:获取城市天气
def get_weather(city: str) -> str:
    """获取指定城市的天气。"""
    return f"{city}总是阳光明媚!"


# 初始化 DeepSeek 大模型
model = ChatDeepSeek(
    #如果你要自定义网管就在这里添加就行,导入了上面的langchain_deepseek 这个包调用官网的就不用在填写base URL了
    model="deepseek-chat",
    api_key="****************",
)

# 创建智能体:绑定模型、工具和系统提示词
agent = create_agent(
    model=model,
    tools=[get_weather],
    system_prompt="你是一个乐于助人的助手",
)

# 调用智能体,传入用户消息
data = agent.invoke(
    {"messages": [{"role": "user", "content": "成都的天气怎么样"}]}
)

# 打印返回结果
print(data) 

构建一个天气预报的代理

须有有以下概念:

  1. 详细的系统提示 以获得更好的代理行为
  2. 创建工具 与外部数据集成
  3. 模型配置 以确保响应一致性
  4. 结构化输出 以获得可预测的结果
  5. 对话记忆 以实现类似聊天的交互
  6. 创建并运行代理 构建一个功能完整的代理

1.定义系统提示

SYSTEM_PROMPT = """你是一位擅长用语言表达的专家天气预报员。

你可以使用两个工具:

- get_weather_for_location:用于获取特定地点的天气
- get_user_location:用于获取用户的位置

如果用户询问天气,请确保你知道具体位置。如果从问题中可以判断他们指的是自己所在的位置,请使用 get_user_location 工具来查找他们的位置。"""

2.创建工具

上面写了获取特定位置的天气现在加上获取用户位置的天气下面是实例:

# 导入 langgraph 的 create_agent(用于创建可调用工具的智能体)
from langchain.agents import create_agent
# 导入 DeepSeek 模型接口
from langchain_deepseek import ChatDeepSeek
# 导入 dataclass 装饰器,用于定义数据类
from dataclasses import dataclass
# 导入工具运行时和工具装饰器
from langchain.tools import ToolRuntime, tool


# 定义一个普通工具函数:根据城市名获取天气
def get_weather(city: str) -> str:
    """获取指定城市的天气。"""
    return f"{city}总是阳光明媚!"


# 定义上下文数据类,用于在工具调用时传递额外的运行时信息(如当前用户 ID)
@dataclass
class Context:
    """自定义运行时上下文模式。"""
    user_id: str


# 使用 @tool 装饰器将函数注册为 Agent 可调用的工具
# 该工具通过运行时上下文中的 user_id 判断用户所在位置
@tool
def get_user_location(runtime: ToolRuntime[Context]) -> str:
    """根据用户 ID 获取用户信息。"""
    user_id = runtime.context.user_id
    # 用户 ID 为 "1" 时定位在 Florida,否则默认在 SF
    return "Florida" if user_id == "1" else "SF"


# 初始化 DeepSeek 大模型
model = ChatDeepSeek(
    model="deepseek-chat",
    api_key="sk-b2ca4a5d7291412bae7af96f340cc28d",
)



# 创建智能体:绑定模型、工具、上下文模式和系统提示词
# context_schema=Context 让 agent 在运行时能把上下文信息传递给工具
agent = create_agent(
    model=model,
    tools=[get_weather],
    context_schema=Context,
    system_prompt="你是一个乐于助人的助手",
)

# 调用智能体,传入用户消息和上下文(user_id 为 "1")
# context 中的数据会被注入到 Context 数据类中,供工具使用
data = agent.invoke(
    {"messages": [{"role": "user", "content": "成都的天气怎么样"}]},
    context={"user_id": "1"},
)

# 打印返回结果
print(data)

3.配置模型

配置您使用的模型参数
# 初始化 DeepSeek 大模型
model = ChatDeepSeek(
    model="deepseek-chat",
    api_key="*********",
# 主要是这里添加了参数
    temperature=0.5,
    timeout=10,
    max_tokens=1000,
)

4.定义相应格式(可选)

from dataclasses import dataclass

# 这里使用 dataclass,但也支持 Pydantic 模型。
@dataclass
class ResponseFormat:
    """代理的响应模式。"""
    # 带双关语的回应(始终必需)
    punny_response: str
    # 天气的任何有趣信息(如果有)
    weather_conditions: str | None = None

5.添加记忆

from langgraph.checkpoint.memory import InMemorySaver

checkpointer = InMemorySaver()
在生成环境中往往需要把记忆存到数据库长久记忆

6.创建并运行代理

# 创建智能体:绑定模型、工具、上下文模式、记忆和系统提示词
# context_schema=Context 让 agent 在运行时能把上下文信息传递给工具
# checkpointer=checkpointer 让 agent 具备记忆能力,能在同一 thread_id 下保持对话连续
agent = create_agent(
    system_prompt=SYSTEM_PROMPT,
    model=model,
    tools=[get_user_location, get_weather],
    context_schema=Context,
    checkpointer=checkpointer,
)

# 配置对话线程,相同的 thread_id 可以保持对话的上下文连续性(记忆功能)
config = {"configurable": {"thread_id": "1"}}

# 第一次调用智能体
# 用户问"外面的天气怎么样",智能体会先调用 get_user_location 获取用户位置,
# 再调用 get_weather 获取该位置的天气
# context={"user_id": "1"} 传入用户身份信息,供工具使用
data = agent.invoke(
    {"messages": [{"role": "user", "content": "外面的天气怎么样"}]},
    config=config,
    context={"user_id": "1"},
)

# 打印返回结果
print(data)

# 第二次调用智能体,使用相同的 thread_id 继续对话
# 智能体能通过 checkpointer 记住上一轮对话的内容,实现多轮对话
# 这里 context 直接传入 Context 对象,与上面的字典写法效果相同
response = agent.invoke(
    {"messages": [{"role": "user", "content": "谢谢!"}]},
    config=config,
    context=Context(user_id="1")
)

# 打印第二轮对话的返回结果
print(response)

下面是完整代码

# 导入 langgraph 的 create_agent(用于创建可调用工具的智能体)
from langchain.agents import create_agent
# 导入 DeepSeek 模型接口
from langchain_deepseek import ChatDeepSeek
# 导入 dataclass 装饰器,用于定义数据类
from dataclasses import dataclass
# 导入工具运行时和工具装饰器
from langchain.tools import ToolRuntime, tool
# 导入内存检查点保存器,用于在对话过程中保存和恢复状态(实现记忆功能)
from langgraph.checkpoint.memory import InMemorySaver

# 定义系统提示词,设定智能体的角色和行为规则
# 告诉智能体它是一个天气预报员,并且可以使用两个工具
SYSTEM_PROMPT = """你是一位擅长用语言表达的专家天气预报员。

你可以使用两个工具:

- get_weather_for_location:用于获取特定地点的天气
- get_user_location:用于获取用户的位置

如果用户询问天气,请确保你知道具体位置。如果从问题中可以判断他们指的是自己所在的位置,请使用 get_user_location 工具来查找他们的位置。"""

# 定义一个普通工具函数:根据城市名获取天气
def get_weather(city: str) -> str:
    """获取指定城市的天气。"""
    return f"{city}总是阳光明媚!"


# 定义上下文数据类,用于在工具调用时传递额外的运行时信息(如当前用户 ID)
@dataclass
class Context:
    """自定义运行时上下文模式。"""
    user_id: str


# 使用 @tool 装饰器将函数注册为 Agent 可调用的工具
# 该工具通过运行时上下文中的 user_id 判断用户所在位置
@tool
def get_user_location(runtime: ToolRuntime[Context]) -> str:
    """根据用户 ID 获取用户信息。"""
    user_id = runtime.context.user_id
    # 用户 ID 为 "1" 时定位在 Florida,否则默认在 SF
    return "Florida" if user_id == "1" else "SF"


# 初始化 DeepSeek 大模型
# temperature: 控制生成的随机性,0.5 为中等创造性
# timeout: 请求超时时间(秒)
# max_tokens: 模型单次回复的最大 token 数
model = ChatDeepSeek(
    model="deepseek-chat",
    api_key="****************",
    temperature=0.5,
    timeout=10,
    max_tokens=1000,
)

# 创建内存检查点保存器,用于在多轮对话中保存对话历史
# InMemorySaver 将数据存储在内存中,程序结束后会丢失;生产环境可替换为数据库存储
checkpointer = InMemorySaver()

# 创建智能体:绑定模型、工具、上下文模式、记忆和系统提示词
# context_schema=Context 让 agent 在运行时能把上下文信息传递给工具
# checkpointer=checkpointer 让 agent 具备记忆能力,能在同一 thread_id 下保持对话连续
agent = create_agent(
    system_prompt=SYSTEM_PROMPT,
    model=model,
    tools=[get_user_location, get_weather],
    context_schema=Context,
    checkpointer=checkpointer,
)

# 配置对话线程,相同的 thread_id 可以保持对话的上下文连续性(记忆功能)
config = {"configurable": {"thread_id": "1"}}

# 第一次调用智能体
# 用户问"外面的天气怎么样",智能体会先调用 get_user_location 获取用户位置,
# 再调用 get_weather 获取该位置的天气
# context={"user_id": "1"} 传入用户身份信息,供工具使用
data = agent.invoke(
    {"messages": [{"role": "user", "content": "外面的天气怎么样"}]},
    config=config,
    context={"user_id": "1"},
)

# 打印返回结果
print(data)

# 第二次调用智能体,使用相同的 thread_id 继续对话
# 智能体能通过 checkpointer 记住上一轮对话的内容,实现多轮对话
# 这里 context 直接传入 Context 对象,与上面的字典写法效果相同
response = agent.invoke(
    {"messages": [{"role": "user", "content": "谢谢!"}]},
    config=config,
    context=Context(user_id="1")
)

# 打印第二轮对话的返回结果
print(response)

参考中文官网