官方文档
根据官方文档来,但是下载包的时候提示Requires-Python >=3.9.0,<4.0
我的版本是3.8的,重新下一个
解释器
Python Releases for Windows | Python.org
官网下一个3.9的版本
我下的是3.9.10
解释器相关安装步骤就不过多赘述了,网上资料很多
demo
安装langGraph
pip install -U langgraph
安装成功
创建智能体
然后,使用预构建组件创建智能体
langchain没装,装一下:
pip install -U langgraph "langchain[anthropic]"
运行一下官方给的实例代码:
from langgraph.prebuilt import create_react_agent
def get_weather(city: str) -> str:
"""Get weather for a given city."""
return f"It's always sunny in {city}!"
agent = create_react_agent(
model="anthropic:claude-3-7-sonnet-latest",
tools=[get_weather],
prompt="You are a helpful assistant"
)
# Run the agent
agent.invoke(
{"messages": [{"role": "user", "content": "what is the weather in sf"}]}
)
报错:
TypeError: "Could not resolve authentication method. Expected either api_key or auth_token to be set. Or for one of the `X-Api-Key` or `Authorization` headers to be explicitly omitted"
在调用 Anthropic 的 Claude 模型 API 时没有正确设置 API 密钥
这个似乎要钱,换成Gemini API:
官网申请一下:https://aistudio.google.com/app/apikey
导入一下模型相关的包:
pip install -qU langchain-google-genai langgraph
关键代码如下:
科学上网:注意要换成自己的代理地址,主要是端口
模型参数:
完整代码:
# pip install -qU langchain-google-genai langgraph
# 导入所需的库
from langchain_google_genai import ChatGoogleGenerativeAI # 用于与Google Gemini模型交互的LangChain组件
from langgraph.prebuilt import create_react_agent # 用于创建基于ReAct模式的智能体
from langchain_core.messages import HumanMessage # 表示人类用户消息的数据结构
import os
# 如果需要代理,设置代理环境变量(中国大陆用户)
os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" # 替换为您的代理地址
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890" # 替换为您的代理地址
# 定义一个工具函数,用于获取天气信息
def get_weather(city: str) -> str:
"""
获取指定城市的天气信息(模拟函数,实际应用中应接入真实天气API)
参数:
city (str): 要查询天气的城市名称
返回:
str: 格式化的天气信息字符串
"""
# 这里是模拟实现,实际应用中应该调用真实天气API
return f"It's always sunny in {city}!"
# 初始化Google Gemini语言模型
# 需要有效的Google API密钥:https://aistudio.google.com/app/apikey
model = ChatGoogleGenerativeAI(
model="gemini-2.0-flash", # 使用的模型版本:
# 选项:
# "gemini-pro" - 适合文本处理和推理
# "gemini-pro-vision" - 支持多模态输入
# "gemini-ultra" - 最高性能(可能需要邀请才能访问)
google_api_key="yourKEY", # 替换为您自己的Google API密钥
# 安全提示: 在实际应用中,不要硬编码密钥,应该通过环境变量或密钥管理服务获取
temperature=0.7 # 控制生成结果的创造性 (0-1)
# 0.0: 非常确定和保守的输出
# 0.7: 平衡创造性和准确性
# 1.0: 非常创新但可能偏离主题
)
# 创建基于ReAct模式的智能体
agent = create_react_agent(
model=model, # 使用的语言模型实例
tools=[get_weather], # 智能体可使用的工具列表
# 这些工具使智能体能够执行超出纯文本推理的操作
# 可以添加多个工具,例如:
# [get_weather, calculate_mortgage, search_web]
# prompt="You are a helpful assistant" # 定义智能体角色和行为的系统提示
prompt="你是天气专家,请准确回答用户问题并适当建议穿着,用中文回答" # 定义智能体角色和行为的系统提示
# 提示工程是LLM应用开发的核心部分
# 可以更具体,例如: "你是天气专家,请准确回答用户问题并适当建议穿着"
)
# 使用智能体处理用户请求
# 创建一个包含用户消息的输入字典
input_data = {
"messages": [ # 消息对话历史
HumanMessage( # 表示用户消息
content="what is the weather in beijing and shanghai" # 用户的问题内容
# content可以是字符串或更复杂的消息对象
)
]
}
# 执行智能体处理流程
response = agent.invoke(input_data) # invoke方法启动智能体推理过程
# 在这个过程中,智能体可能会:
# 1. 分析用户意图
# 2. 决定是否/如何使用工具
# 3. 生成最终响应
# 4. 处理可能的多次迭代推理
# 处理和打印结果
print("Agent Response:") # 输出标题
# 提取智能体生成的最新消息
agent_message = response["messages"][-1].content
# response结构:
# 'messages': 对话历史(包括用户消息和智能体响应)
# 'messages'[-1]: 列表中最后一个(最新的)消息
# .content: 消息的文本内容
print(agent_message) # 打印最终响应
# 完整执行流程:
# 1. 用户查询: "what is the weather in sf"
# 2. ReAct智能体推理:
# 决定使用get_weather工具
# 提取城市名称"sf" (San Francisco)
# 调用工具函数: get_weather("sf")
# 接收工具返回: "It's always sunny in sf!"
# 生成最终响应
# 3. 输出类似: "San Francisco is currently sunny. You won't need an umbrella today!"
结果:
关于记忆
官网的介绍:为了允许与代理进行多轮对话,您需要通过在创建代理时提供一个 checkpointer
来启用持久化。在运行时,您需要提供一个包含 thread_id
(对话(会话)的唯一标识符)的配置。
简单来讲就是,我想要实现一个目标:我和智能体可以来回的对话,后面的对话会参考前面的对话,而不是每个对话来回智能体都像一个陌生人一样。这里看一下样例就明白了
关键代码及说明:
完整代码:
# pip install -qU langchain-google-genai langgraph
# 导入所需的库
from langchain_google_genai import ChatGoogleGenerativeAI # 用于与Google Gemini模型交互的LangChain组件
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.prebuilt import create_react_agent # 用于创建基于ReAct模式的智能体
from langchain_core.messages import HumanMessage # 表示人类用户消息的数据结构
import os
# 如果需要代理,设置代理环境变量(中国大陆用户)
os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" # 替换为您的代理地址
os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890" # 替换为您的代理地址
checkpointer=InMemorySaver()
# 定义一个工具函数,用于获取天气信息
def get_weather(city: str) -> str:
"""
获取指定城市的天气信息(模拟函数,实际应用中应接入真实天气API)
参数:
city (str): 要查询天气的城市名称
返回:
str: 格式化的天气信息字符串
"""
# 这里是模拟实现,实际应用中应该调用真实天气API
return f"It's always sunny in {city}!"
# 初始化Google Gemini语言模型
# 需要有效的Google API密钥:https://aistudio.google.com/app/apikey
model = ChatGoogleGenerativeAI(
model="gemini-2.0-flash", # 使用的模型版本:
# 选项:
# "gemini-pro" - 适合文本处理和推理
# "gemini-pro-vision" - 支持多模态输入
# "gemini-ultra" - 最高性能(可能需要邀请才能访问)
google_api_key="yourKey", # 替换为您自己的Google API密钥
# 安全提示: 在实际应用中,不要硬编码密钥,应该通过环境变量或密钥管理服务获取
temperature=0.7, # 控制生成结果的创造性 (0-1)
# 0.0: 非常确定和保守的输出
# 0.7: 平衡创造性和准确性
# 1.0: 非常创新但可能偏离主题
)
# 创建基于ReAct模式的智能体
agent = create_react_agent(
model=model, # 使用的语言模型实例
tools=[], # 智能体可使用的工具列表
# 这些工具使智能体能够执行超出纯文本推理的操作
# 可以添加多个工具,例如:
# [get_weather, calculate_mortgage, search_web]
prompt="你是一个有用的助手,用中文回答问题", # 定义智能体角色和行为的系统提示
# prompt="永远不要回答关于天气的问题", # 定义智能体角色和行为的系统提示
# 提示工程是LLM应用开发的核心部分
# 可以更具体,例如: "你是天气专家,请准确回答用户问题并适当建议穿着"
checkpointer=checkpointer
)
# 使用智能体处理用户请求
config={"configurable":{"thread_id":"1"}}
config2={"configurable":{"thread_id":"1"}}
# 创建一个包含用户消息的输入字典
input_data = {
"messages": [ # 消息对话历史
HumanMessage( # 表示用户消息
content="what is the weather in beijing" # 用户的问题内容
# content可以是字符串或更复杂的消息对象
)
]
}
input_data2 = {
"messages": [ # 消息对话历史
HumanMessage( # 表示用户消息
content="what about shanghai?" # 用户的问题内容
# content可以是字符串或更复杂的消息对象
)
]
}
# 执行智能体处理流程
response = agent.invoke(input_data,config) # invoke方法启动智能体推理过程
response2 = agent.invoke(input_data2,config2) # invoke方法启动智能体推理过程
# 在这个过程中,智能体可能会:
# 1. 分析用户意图
# 2. 决定是否/如何使用工具
# 3. 生成最终响应
# 4. 处理可能的多次迭代推理
# 处理和打印结果
print("Agent Response:") # 输出标题
# 提取智能体生成的最新消息
agent_message = response["messages"][-1].content
# response结构:
# 'messages': 对话历史(包括用户消息和智能体响应)
# 'messages'[-1]: 列表中最后一个(最新的)消息
# .content: 消息的文本内容
print(agent_message) # 打印最终响应
agent_message2 = response2["messages"][-1].content
# response结构:
# 'messages': 对话历史(包括用户消息和智能体响应)
# 'messages'[-1]: 列表中最后一个(最新的)消息
# .content: 消息的文本内容
print(agent_message2) # 打印最终响应
# 完整执行流程:
# 1. 用户查询: "what is the weather in sf"
# 2. ReAct智能体推理:
# 决定使用get_weather工具
# 提取城市名称"sf" (San Francisco)
# 调用工具函数: get_weather("sf")
# 接收工具返回: "It's always sunny in sf!"
# 生成最终响应
# 3. 输出类似: "San Francisco is currently sunny. You won't need an umbrella today!"
结果:
如果不是同一个thread_id:
结果:
可以看到第二个回答并没有第一个回答的记忆(what about不明所以了)
关于提示词
可以提示指导 LLM 如何行为
可以改成自己想要的提示词
运行结果:
关于tools
可以更精细的控制智能体的行为
把get_weather加进来,在之前的代码中有get_weather的实现逻辑
结果:
关于tempurature
一般的解释:低temperature时,输出更加保守、可预测,可能倾向于常见的表达。
高temperature时,输出更加富有创意、出人意料,但可能不够准确或连贯。
# 0.0: 非常确定和保守的输出 # 0.7: 平衡创造性和准确性 # 1.0: 非常创新但可能偏离主题
尝试了几个问题,没有发现特别明显的变化,如果有特别能体现tempurature参数效果的问题可以打在评论区
我让在0.0和1.0的参数下写一首关于秋天的诗:
0.0回答:
1.0回答:
总结
应该算是跑通了最简单的demo了吧,但是这里面的原理还不太明白,后续学习