函数 | 解释 | 导包 |
---|---|---|
search=TavilySearchResults (max_results=2) | 定义 Tavily 搜索工具,返回两条结果 | from langchain_community.tools. tavily_search import TavilySearchReasults |
chat_model=ChatOpenAI( model="glm-4-flash") | 通过 openai 的函数调用智普 AI | from langchain_openai import ChatopenAI |
chat_model_with_tools= chat_model.bind_tools(工具数组) | 将模型绑定工具 | - |
模型返回的数据.tool_calls | 获取工具调用返回的消息 | - |
agent_executor=create_react_agent (模型名,工具数组) | 创建一个智能体 | from langgraph.prebuilt import create_react_agent |
memory=MenorySaver() | 创建一个记忆存储器 | from langgraph.checkpoint.memory import MemorySaver |
agent_executor=create_react_agent (模型名,工具数组,checkpoint=memory) | 给智能体添加记忆功能 | - |
构建代理(agent)
- 代理(agent)是langchain中的一种组件,它将多个组件组合在一起,形成一个完整的流程
- 代理(agent)可以用于构建聊天机器人、文档检索、数据分析等多种应用
- 代理(agent)的核心是使用大模型来执行任务,并使用其他组件来辅助大模型执行任务
# 加载环境
from dotenv import load_dotenv
load_dotenv()
True
# 配置langsmith
import os
os.environ["LANGCHAIN_TRACING_V2"]="true"
#定义工具(Tavily搜索引擎)
from langchain_community.tools.tavily_search import TavilySearchResults
search=TavilySearchResults(max_results=2) # 定义Tavily搜索工具,返回两条结果
search_results=search.invoke("北京的天气怎么样")
print(search_results)
tools=[search]
[{‘url’: ‘http://m2.weather.com.cn/mweather1d/101010100.shtml’, ‘content’: ‘北京天气预报,…,及时发布北京气象预警信号、各类气象资讯。’}, {‘url’: ‘https://m.weather.com.cn/mweather/101010100.shtml’, ‘content’: ‘北京天气预报,及时准确发布中央气象台天气信息,…、各类气象资讯。’}]
# 加载模型
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(
temperature=0.95,
model="glm-4-flash",
)
chat_model.invoke("你好")
AIMessage(content=‘你好👋!有什么可以帮助你的吗?’, additional_kwargs={‘refusal’: None}, response_metadata={‘token_usage’: …‘output_token_details’: {}})
# 模型一般对话方式
from langchain_core.messages import HumanMessage
response=chat_model.invoke([HumanMessage("你好")])
response.content
‘你好👋!很高兴见到你,有什么可以帮助你的吗?’
# 模型调用工具
chat_model_with_tools=chat_model.bind_tools(tools)
# 查看普通对话过程中工具消息
response=chat_model_with_tools.invoke([HumanMessage("你好")])
print(f"模型回复内容是:{response.content}")
print(f"工具调用返回的消息:{response.tool_calls}")
模型回复内容是:你好👋!我是人工智能助手智谱清言,有什么可以帮助你的吗?
工具调用返回的消息:[]
# 查看需要对用工具对话中的输出
response=chat_model_with_tools.invoke([HumanMessage("拾荒者统治第二季什么时候出?")])
print(f"模型回复内容:{response.content}") #当模型选择使用工具来解决问题,返回的内容为空
print(f"工具调用返回内容:{response.tool_calls}") #工具调用返回时是规范格式的相关参数,不是最终答案
模型回复内容:关于电视剧《拾荒者》第二季的播出时间,我无法提供确切的信息,因为这取决于该剧的制作进度和发行计划。通常,电视剧的续集会在官方社交媒体、官方网站或者通过正规电视台发布的新闻中公布具体的播出日期。建议您关注该剧的官方渠道或者电视台的公告,以获取最新的播出信息。如果您需要,我可以帮您搜索最新的相关信息。您需要我搜索吗?
工具调用返回内容:[]
创建、使用代理(create the agent)
- 代理创建在原模型(chat_model)上,在使用
create_react_agent
构造代理时,会自动bind_tools
# 创建代理
from langgraph.prebuilt import create_react_agent
agent_executor=create_react_agent(chat_model,tools)
# 使用代理:在不需要使用工具的情况下其输出
response=agent_executor.invoke({"messages":[HumanMessage(content="你好")]}) #langgrap框架要求输入的消息要标准化不能直接“你好”
response["messages"]
[HumanMessage(content=‘你好’, additional_kwargs={}, response_metadata={}, id=‘40310f95-e733-4a23-b7ee-b8897ece0b9f’),
AIMessage(content=‘你好👋!我是人工智能助手智谱清言,很高兴见到你,欢迎问我任何问题。’, additional_kwargs={‘refusal’: None}, response_metadata={‘token_usage’: {‘completion_tokens’: 24, ‘prompt_tokens’: 189, ‘total_tokens’: 213, ‘completion_tokens_details’: None, ‘prompt_tokens_details’: None}, ‘model_name’: ‘glm-4-flash’, ‘system_fingerprint’: None, ‘finish_reason’: ‘stop’, ‘logprobs’: None}, id=‘run-cfd7480c-5767-4f1e-ac7f-2616e076d5b0-0’, usage_metadata={‘input_tokens’: 189, ‘output_tokens’: 24, ‘total_tokens’: 213, ‘input_token_details’: {}, ‘output_token_details’: {}})]
# 使用代理:在需要使用工具的情况下其输出(miatral服务器不支持)
response=agent_executor.invoke(
{
"messages":[HumanMessage(content="拾荒者统治第二季什么时候出?")]
}
)
response["messages"]
[HumanMessage(content=‘拾荒者统治第二季什么时候出?’, additional_kwargs={}, response_metadata={}, id=‘65f825b7-3b25-402e-a97c-53e4cd70bb7f’),
AIMessage(content=‘’, additional_kwargs={‘tool_calls’: [{‘id’: ‘call_-9217975564566488604’, …, ‘output_token_details’: {}}),
ToolMessage(content='[{“url”: “https://tieba.baidu.com/p/8755329499”, “content”: “拾荒者统治还会有第二…截止到2023年11月21日,《拾荒者统治》还没有第二季。 但是,这并不意味着该剧不会有第二季。 很多电视剧在播出第一季后,会根据观众反馈和收视情况决定是否制作第二季。”}, …, ‘raw_content’: None}], ‘response_time’: 2.4}),
AIMessage(content=‘截至2023年11月21日,《拾荒者统治》的第二季尚未公布。不过,很多电视剧在播出第一季后会根据观众反馈和收视情况来决定是否制作第二季。因此,第二季的具体播出时间还不确定。更多信息。’, additional_kwargs={‘refusal’: None}, …, ‘output_token_details’: {}})]
流式监视(Streaming tokens)
# 异步监视代理执行过程
async for event in agent_executor.astream_events(
{
"messages":[HumanMessage(content="拾荒者统治第二季什么时候出?")]
},version="v1"
):
kind=event["event"] #获取事件类型
# 1. 代理开始执行
if kind=="on_chain_start":
if event["name"]=="Agent":
print(f"代理开始执行:{event['name']}") # 使用单引号
print(f"输入内容:{event['data'].get('input')}") # 使用单引号
# 2. 代理执行结束
elif kind == "on_chain_end":
if event["name"] == "Agent":
print("\n--")
print(f"代理执行完成: {event['name']}")
print(f"输出结果: {event['data'].get('output')['output']}")
# 3. 模型生成回复流
if kind == "on_chat_model_stream":
content = event["data"]["chunk"].content
if content:
print(content, end="|")
# 4. 工具开始执行
elif kind == "on_tool_start":
print("\n--")
print(f"开始使用工具: {event['name']}")
print(f"工具输入: {event['data'].get('input')}")
# 5. 工具执行结束
elif kind == "on_tool_end":
print(f"工具执行完成: {event['name']}")
print(f"工具输出: {event['data'].get('output')}")
print("--")
–
开始使用工具: tavily_search_results_json
工具输入: {‘query’: ‘拾荒者统治第二季播出时间’}
工具执行完成: tavily_search_results_json
工具输出: content='[{“url”: “https://zhidao.baidu.com/question/1457983469389465820.html”, “content”: “拾荒者统治。有第二季吗目前还没有。根据查询腾讯视频官网、长安人网显示,截至2023年11月28日,《拾荒者统治》没有第二季。《拾荒者统治》播出平台是HBOMax,在网络上通过搜索可以找到相关资源,《拾荒者统治》目前”}, … ‘response_time’: 2.28}
–
据|目前|的信息|,|尚|无|《|拾|荒|者|统治|》|第二季|的|播出|计划|。《|拾|荒|者|统治|》|第一季|于|202|3|年|10|月|19|日|首|播|,|但|关于|第二季|的具体|情况|,|目前|还没有|官方|的消息|公布|。|您可以|关注|官方|渠道|获取|最新的|更新|信息|。|
添加记忆功能
from langgraph.checkpoint.memory import MemorySaver
memory=MemorySaver()
# 在代理中添加记忆功能
agent_executor=create_react_agent(chat_model,tools,checkpointer=memory)
config={"configurable":{"thread_id":"abc123"}}
for chunk in agent_executor.stream( #流式传输
{"messages":[HumanMessage(content="你好,我是黑大帅")]},config
):
print(chunk)
print("----")
{‘agent’: {‘messages’: [AIMessage(content=‘你好呀,黑大帅!有什么可以帮助你的吗?’, additional_kwargs={‘refusal’: None}, response_metadata={‘token_usage’: {‘completion_tokens’: 14, ‘prompt_tokens’: 194, ‘total_tokens’: 208, ‘completion_tokens_details’: None, ‘prompt_tokens_details’: None}, ‘model_name’: ‘glm-4-flash’, ‘system_fingerprint’: None, ‘finish_reason’: ‘stop’, ‘logprobs’: None}, id=‘run-76438582-1681-414a-8488-baf00aeaabc4-0’, usage_metadata={‘input_tokens’: 194, ‘output_tokens’: 14, ‘total_tokens’: 208, ‘input_token_details’: {}, ‘output_token_details’: {}})]}}
----
for chunk in agent_executor.stream(
{"messages":[HumanMessage(content="我叫什么名字?")]},config
):
print(chunk)
print("----")
{‘agent’: {‘messages’: [AIMessage(content=‘你的名字是黑大帅。有什么其他问题或者需要我帮忙的吗?’, additional_kwargs={‘refusal’: None}, response_metadata={‘token_usage’: {‘completion_tokens’: 18, ‘prompt_tokens’: 214, ‘total_tokens’: 232, ‘completion_tokens_details’: None, ‘prompt_tokens_details’: None}, ‘model_name’: ‘glm-4-flash’, ‘system_fingerprint’: None, ‘finish_reason’: ‘stop’, ‘logprobs’: None}, id=‘run-5b4de519-3576-4a80-afa7-4819f6de5624-0’, usage_metadata={‘input_tokens’: 214, ‘output_tokens’: 18, ‘total_tokens’: 232, ‘input_token_details’: {}, ‘output_token_details’: {}})]}}
----