LangChain-v0.2 Build an Agent 构建代理

news2024/9/24 23:32:46

语言模型本身不能采取行动,它们只是输出文本。LangChain的一个重要用例是创建代理。代理是使用LLM作为推理引擎来确定要采取哪些行动,以及传递哪些输入的系统。执行操作后,可以将结果反馈到LLM中,以确定是否需要更多操作,或者是否可以完成。

本文我们将构建一个可以与搜索引擎交互的代理。您将能够向该代理提问,观看它调用搜索工具,并与之进行对话。

阅读本文后,你将大致了解以下内容:

1、Tavily 搜索引擎;

2、Using Language Models 使用语言模型;

3、Create the agent 创建代理;

4、Streaming Messages 流式消息;

5、Adding in memory​ 添加内存。

一、Installation​安装

LangChain安装:

pip install -U langchain-community langgraph langchain-anthropic tavily-python

二、使用Tavily 搜索引擎

为了使用它,您需要获取并设置一个 API 密钥:

点击前往:Tavily AI

注册并登录账号,会自动生成一个API Keys

配置TAVILY_API_KEY环境:

import os
os.environ["TAVILY_API_KEY"]="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"

我们首先需要创建我们想要使用的工具。我们选择的主要工具将是 Tavily 搜索引擎。我们在LangChain中有一个内置工具,可以轻松地使用Tavily搜索引擎作为工具。 

from langchain_community.tools.tavily_search import TavilySearchResults

search = TavilySearchResults(max_results=2)
search_results = search.invoke("深圳天气怎么样?")
print(search_results)
# If we want, we can create other tools.
# Once we have all the tools we want, we can put them in a list that we will reference later.
tools = [search]

三、使用语言模型

LangChain支持许多不同的语言模型,包含:OpenAI、Anthropic、Azure、Google、Cohere、FireworksAI、Groq、MistralAI、TogetherAI等,您可以互换使用 ,选择您要使用的语言模型!

1)下面内容将居于OpenAI语言模型进行演示:

pip install -qU langchain-openai

2)配置API KEY环境

import os
os.environ["OPENAI_API_KEY"]="填写自己的API KEY"
os.environ["LANGCHAIN_TRACING_V2"]="true"
os.environ["LANGCHAIN_API_KEY"]="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"
from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4")

3)通过传入消息列表来调用语言模型。默认情况下,响应是一个字符串。

from langchain_core.messages import HumanMessage

response = model.invoke([HumanMessage(content="hi!")])
response.content

4)现在,我们可以看到启用此模型进行工具调用的感觉。为了实现这一点,我们用来给语言模型提供这些工具的知识;让我们首先用普通消息调用它,看看它是如何响应的。我们既可以看content,也可以看tool_calls。

model_with_tools = model.bind_tools(tools)

response = model_with_tools.invoke([HumanMessage(content="Hi!")])

print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")

5)让我们尝试使用一些需要调用工具的输入来调用它。

response = model_with_tools.invoke([HumanMessage(content="What's the weather in Beijin?")])

print(f"ContentString: {response.content}")
print(f"ToolCalls: {response.tool_calls}")

我们可以看到现在没有文本内容,但有一个工具调用!它希望我们调用 Tavily Search 工具。这还没有调用该工具,它只是告诉我们可以调用。为了实际调用它,我们需要创建我们的代理。 

四、Create the agent​ 创建代理

现在我们已经定义了工具和 LLM,我们可以创建代理了。我们将使用 LangGraph 来构建代理。
目前,我们正在使用一个高级接口来构建代理,但 LangGraph 的好处是,这个高级接口由一个低级、高度可控的 API 支持,以防你想修改代理逻辑。

1)现在,我们可以使用 LLM 和工具启动代理。请注意,我们传递的是model,而不是model_with_tools。这是因为create_react_agent会在幕后为我们调用.bind_tools。

from langgraph.prebuilt import create_react_agent

agent_executor = create_react_agent(model, tools)

现在,我们可以在一些查询上运行代理!请注意,目前,这些都是查询(它不会记住以前的交互)。请注意,代理将在交互结束时返回状态(包括任何输入,我们将在后面看到如何仅获取输出)。

2)首先,让我们看看当不需要调用工具时它是如何响应的:

response = agent_executor.invoke({"messages": [HumanMessage(content="hi!")]})

response["messages"]

3)现在让我们看看调用该工具时它是如何响应的:

response = agent_executor.invoke(
    {"messages": [HumanMessage(content="whats the weather in Beijin?")]}
)
response["messages"]

五、Streaming Messages​ 流式消息

我们已经了解了如何调用代理来获得最终响应。如果代理正在执行多个步骤,则可能需要一段时间。为了显示中间进度,我们可以在消息发生时将其流式传输回。

for chunk in agent_executor.stream(
    {"messages": [HumanMessage(content="whats the weather in Beijin?")]}
):
    print(chunk)
    print("----")

Streaming tokens 流式tokens

除了流式传输回消息外,流式传输回token也很有用。我们可以用这种方法做到这一点。

async for event in agent_executor.astream_events(
    {"messages": [HumanMessage(content="whats the weather in sf?")]}, version="v1"
):
    kind = event["event"]
    if kind == "on_chain_start":
        if (
            event["name"] == "Agent"
        ):  # Was assigned when creating the agent with `.with_config({"run_name": "Agent"})`
            print(
                f"Starting agent: {event['name']} with input: {event['data'].get('input')}"
            )
    elif kind == "on_chain_end":
        if (
            event["name"] == "Agent"
        ):  # Was assigned when creating the agent with `.with_config({"run_name": "Agent"})`
            print()
            print("--")
            print(
                f"Done agent: {event['name']} with output: {event['data'].get('output')['output']}"
            )
    if kind == "on_chat_model_stream":
        content = event["data"]["chunk"].content
        if content:
            # Empty content in the context of OpenAI means
            # that the model is asking for a tool to be invoked.
            # So we only print non-empty content
            print(content, end="|")
    elif kind == "on_tool_start":
        print("--")
        print(
            f"Starting tool: {event['name']} with inputs: {event['data'].get('input')}"
        )
    elif kind == "on_tool_end":
        print(f"Done tool: {event['name']}")
        print(f"Tool output was: {event['data'].get('output')}")
        print("--")

六、Adding in memory​ 添加内存

如前所述,此代理是无状态的。这意味着它不记得以前的交互。为了给它内存,我们需要传入一个检查点。传入检查点时,我们还必须在调用代理时传入一个(以便它知道要从哪个线程/对话恢复)。

from langgraph.checkpoint.sqlite import SqliteSaver

memory = SqliteSaver.from_conn_string(":memory:")

agent_executor = create_react_agent(model, tools, checkpointer=memory)

config = {"configurable": {"thread_id": "abc123"}}

for chunk in agent_executor.stream(
    {"messages": [HumanMessage(content="hi im bob!")]}, config
):
    print(chunk)
    print("----")
for chunk in agent_executor.stream(
    {"messages": [HumanMessage(content="whats my name?")]}, config
):
    print(chunk)
    print("----")

如果我想开始一个新的对话,我所要做的就是改变使用过的thread_id

config = {"configurable": {"thread_id": "xyz123"}}
for chunk in agent_executor.stream(
    {"messages": [HumanMessage(content="whats my name?")]}, config
):
    print(chunk)
    print("----")

至此,我们介绍了如何创建简单的代理,并展示了如何流式传输响应;我们还添加了内存,以便您可以与他们进行历史记录对话。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展,陪玩服务应远而生并迅速唱起,陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁,其模式系统的搭建与开发是得尤为重要,本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程,包…

基础动态规划题目基础动态规划题目

目录 题目1: P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles 代码示例: 题目2: Common Subsequence 代码示例 题目3 :最长上升子序列 最长不下降子序列 最长上升子序列oj答案 题目1: P1216 [USACO1.5]…

Linux热键,shell含义及权限介绍

君子忧道不忧贫。 —— 孔丘 Linux操作系统的权限 1、几个常用的热键介绍1、1、[Tab]键1、2、[ctrl]-c1、3、[ctrl]-d1、4、[ctrl]-r 2、shell命令以及运行原理3、权限3、1、什么是权限3、2、权限的本质3、3、Linux中的用户3、4、Linux中文件的权限3、4、1、快速掌握修改权限的…

华为HCIP Datacom H12-821 卷41

1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述,正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…

古玻璃制品的成分分析与鉴别详解【国一,附完整代码】

声明:2024年数模国赛即将来临,为助力国赛和钉钉杯,我将重温22年小样本国赛C题和23年大样本国赛C题,给出详细思路和完整代码,供广大数模爱好者阅览,如需比赛指导,请联系文章底部卡片咨询。 未经允…

UNiapp微信小程序Ucharts

效果图如下 以上为加载接口所得数据的玫瑰图与折线图 具体步骤如下 1,将插件导入Hbuiler 所需要的项目中(插件地址:秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场) 2,导入成功是这样的 3&#xff0c…

Windows终端远程登陆Linux服务器(SSH+VScode)

W i n d o w s 终端远程登陆 L i n u x 服务器( S S H V S c o d e ) \huge{Windows终端远程登陆Linux服务器(SSHVScode)} Windows终端远程登陆Linux服务器(SSHVScode) 文章目录 写在前面通过SSH远程连接L…

rust + python+ libtorch

1: 环境,ubuntu 1.1 rust : rust-1.79.0 (在官方下载linux版本后,解压文件夹,内部有个install的sh文件,可安装) 安装成功测试:cargo --version 1.2 python3.10 (直接使用apt install pytho…

Redis-基础概念

目录 概念 Redis是什么 Redis 和 MySQL 的区别? Redis单线程有什么极端场景的瓶颈 Redis为什么快? 为什么Redis是单线程? Redis是单线程还是多线程 Redis为什么选择单线程做核心处理 Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存和I…

SAP PP学习笔记28 - 生产订单的收货及品质管理

上一章讲了生产订单的很多概念,比如确认(报工)以及报工的各种形式,反冲,自动入库等。 SAP PP学习笔记27 - Confirmation(报工/确认)(CO11,CO11N,CO15,CO12),…

IOS系统有什么好用的藏语翻译软件推荐吗?

藏语翻译通是我使用过的比较好用实用的藏语翻译软件。 藏语翻译通是一款专为藏语和汉语互译设计的智能翻译软件,它利用最新的人工智能技术,为用户提供高效、准确的翻译服务。软件界面简洁直观,易于操作,无论是藏语学习者、研究者…

C++中的变量的同名隐藏

同名隐藏是C中的一个概念,在一个类的继承关系中,子类中定义了一个与父类中同名的成员函数。当这种情况发生时,子类中的函数会隐藏掉所有父类中同名的函数,这意味着在子类中调用这个函数时,会优先调用子类中定义的版本&…

图书馆定位导航:RFID、VR与AR技术在图书馆中的应用

图书馆作为知识的宝库,承载着无数求知者的梦想与期待,随着馆藏书籍数量的激增与图书馆布局的日益复杂,读者在寻找目标书籍往往有许多困难。传统的索引号查询方式虽能提供书籍的基本信息,但在寻找过程中,因不熟悉图书馆…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日,位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道,三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来,博物馆作为重要的文化场所,也迎来了大量游客。博物馆作为文化和历史的重要载体,其安全保…

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA) CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

网络开局 与 Underlay网络自动化

由于出口和核心设备 部署在核心机房,地理位置集中,业务复杂,开局通常需要网络工程师进站调测。 因此核心层及核心以上的设备(包含核心层设备,旁挂独立AC设备和出口设备)推荐采用WEB网管开局方式或命令行开局方式。 核心以下的设备(包含汇聚层设备、接入层设备和AP)由于数量众…

【程序大侠传】服务发布引发mq消息重复消费

前序 在编程武侠世界中,有一个门派“天机楼”,连接并协调各大门派之间的关系,确保整个江湖的运作流畅无阻。天机楼住要的业务范围主要如下: 信息传递的信使: 天机楼就像是江湖中的飞鸽传书,确保各门派之间…

学生管理系统(C语言)(Easy-x)

课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : XXXXX XXXXX 学 生 姓 名 : XXX 学 号 : 231040700302 任 课 教 师 &a…

电瓶车检测AI算法:视频智能分析技术助力电瓶车规范与安全管理

随着电瓶车(电动自行车)的普及,其在城市交通中扮演着越来越重要的角色。然而,电瓶车的管理、安全监控以及维护等方面也面临着诸多挑战。近年来,人工智能(AI)技术的发展为解决这些问题提供了新的…

Ubuntu安装virtualbox(win10)

virtualbox下载安装 1、下载virtualbox 下载路径:Linux_Downloads – Oracle VM VirtualBox 根据自己的Ubuntu版本选择对应的安装包下载 2、安装virtualbox 到下载路径(一般为~/Download)打开终端输入命令 sudo dpkg -i xxx.deb 继续执…