【LangChain系列】第三篇:Agent代理简介及实践

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
简介: 【5月更文挑战第17天】LangChain代理利用大型语言模型(LLM)作为推理引擎,结合各种工具和数据库,处理复杂任务和决策。这些代理能理解和生成人类语言,访问外部信息,并结合LLM进行推理。文章介绍了如何通过LangChain构建代理,包括集成DuckDuckGo搜索和维基百科,以及创建Python REPL工具执行编程任务。此外,还展示了如何构建自定义工具,如获取当前日期的示例,强调了LangChain的灵活性和可扩展性,为LLM的应用开辟了新途径。

[toc]


大型语言模型 (LLM) 已成为能够理解和生成类似人类文本的有用 AI 系统。然而,它们的真正潜力在于它们能够充当推理引擎,处理新信息和回答复杂问题。LangChain的代理通过允许LLM与各种工具和数据库进行交互,协助推理和决策任务来释放这种潜力。在这篇博文中,我们将深入探讨LangChain的代理,探索如何使用内置工具配置它们并创建自定义工具来扩展其功能。

一、LLM Agents

1.LLM Agents是什么

LLM 代理的核心是 LLM 和一组工具(如搜索引擎、API 或数据存储)的组合。LLM充当推理引擎,利用这些工具和可用信息来解决复杂的任务。想象一下,拥有一个私人助理,他不仅可以理解您的人类语言指令,还可以访问和处理来自各种来源的信息,以帮助您做出明智的决定。简而言之,这就是 LLM Agents 的强大功能。

2.LLM Agents 的好处

  • 利用 LLM 的自然语言理解和生成能力:LLM 擅长处理和生成类似人类的文本,使其非常适合自然语言交互。

  • 访问和处理来自各种来源的外部信息:通过与搜索引擎、API 和数据库等工具集成,LLM 代理可以检索和处理超出其初始训练数据的信息。

  • 将推理与复杂任务的工具交互相结合:LLM 代理可以对检索到的信息进行推理,并使用它来做出决策、回答问题,甚至通过与集成工具交互来采取行动。

二、通过LangChain 工具 构建Agent

LangChain预装了一系列内置工具,您可以轻松地将其与LLM代理集成。我们来学习两个例子:DuckDuckGo Search 和 Wikipedia。

1.集成 DuckDuckGo 搜索和维基百科

import os
from dotenv import load_dotenv, find_dotenv

_ = load_dotenv(find_dotenv())

#!pip install -U wikipedia

from langchain_experimental.agents.agent_toolkits import create_python_agent
from langchain_experimental.tools.python.tool import PythonREPLTool
from langchain.agents import load_tools
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub

prompt = (
    hub.pull("hwchase17/react")
    + " once you have final answer just exit chain do not continue"
)
llm_model = "gpt-3.5-turbo"
llm = ChatOpenAI(temperature=0, model=llm_model)

tools = load_tools(["llm-math", "wikipedia"], llm=llm)

agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    features="html.parser",
    handle_parsing_errors=True,
    verbose=True,
)

在此代码片段中,我们将导入必要的库和依赖项,配置 LLM 和代理设置,并加载 DuckDuckGo 搜索和 Wikipedia 工具。通过集成这些内置工具,我们的 LLM 代理现在可以使用 DuckDuckGo 在网络上搜索信息并检索相关的维基百科文章以帮助回答问题或解决任务。

agent_executor.invoke({
   "input": "How old is stephan hawkings"})
> Entering new AgentExecutor chain...
I need to find out Stephen Hawking's age.
Action: wikipedia
Action Input: Stephen Hawking
Page: Stephen Hawking
Summary: Stephen William Hawking (8 January 1942 – 14 March 2018) was an English theoretical physicist, cosmologist, and author who was director of research at the Centre for Theoretical Cosmology at the University of Cambridge. Between 1979 and 2009, he was the Lucasian Professor of Mathematics at Cambridge, widely viewed as one of the most prestigious academic posts in the world.

...

I now know Stephen Hawking's age.
Final Answer: Stephen Hawking was 76 years old when he died in 2018.

> Finished chain.
{'input': 'How old is stephan hawkings',
 'output': 'Stephen Hawking was 76 years old when he died in 2018.'}

在此示例中,代理使用维基百科工具搜索有关斯蒂芬霍金的信息,检索他的传记并确定他去世时的年龄。

2.Python Agent

LangChain 还提供了一个 Python REPL工具,允许您的 LLM 代理执行 Python 代码并执行各种编程任务。

agent = create_python_agent(llm, tool=PythonREPLTool(), verbose=True)

customer_list = [
    ["Harrison", "Chase"],
    ["Lang", "Chain"],
    ["Dolly", "Too"],
    ["Elle", "Elem"],
    ["Geoff", "Fusion"],
    ["Trance", "Former"],
    ["Jen", "Ayai"],
]

agent.invoke(
    f"""Sort these customers by
last name and then first name
and print the output: {customer_list}"""
)
> Entering new AgentExecutor chain...
We can use the `sorted()` function in Python to sort the list of customers based on their last name and then first name.
Action: Python_REPL
Action Input: customers = [['Harrison', 'Chase'], ['Lang', 'Chain'], ['Dolly', 'Too'], ['Elle', 'Elem'], ['Geoff', 'Fusion'], ['Trance', 'Former'], ['Jen', 'Ayai']]
sorted_customers = sorted(customers, key=lambda x: (x[1], x[0]))
print(sorted_customers)
Observation: [['Jen', 'Ayai'], ['Lang', 'Chain'], ['Harrison', 'Chase'], ['Elle', 'Elem'], ['Trance', 'Former'], ['Geoff', 'Fusion'], ['Dolly', 'Too']]

Thought: I now know the final answer
Final Answer: [['Jen', 'Ayai'], ['Lang', 'Chain'], ['Harrison', 'Chase'], ['Elle', 'Elem'], ['Trance', 'Former'], ['Geoff', 'Fusion'], ['Dolly', 'Too']]

> Finished chain.
{'input': "Sort these customers by last name and then first name and print the output: [['Harrison', 'Chase'], ['Lang', 'Chain'], ['Dolly', 'Too'], ['Elle', 'Elem'], ['Geoff', 'Fusion'], ['Trance', 'Former'], ['Jen', 'Ayai']]",
 'output': "[['Jen', 'Ayai'], ['Lang', 'Chain'], ['Harrison', 'Chase'], ['Elle', 'Elem'], ['Trance', 'Former'], ['Geoff', 'Fusion'], ['Dolly', 'Too']]"}

在此示例中,代理使用 Python REPL 工具根据客户的姓氏和名字对客户列表进行排序,执行 Python 代码以实现所需的结果。

三、自定义工具

虽然LangChain提供了一系列内置工具,但真正的力量在于能够创建适合您特定需求的自定义工具。这允许您将 LLM 代理连接到所需的任何数据库、API 或函数。

1.通过LangChain Tool装饰器构建自定义工具

from langchain.agents import tool
from datetime import date

@tool
def time(text: str) -> str:
    """Returns todays date, use this for any
    questions related to knowing todays date.
    The input should always be an empty string,
    and this function will always return todays
    date - any date mathmatics should occur
    outside this function."""
    return str(date.today())

在此代码片段中,我们将使用 LangChain 的工具装饰器创建一个名为 time 的自定义工具。此工具在调用时返回当前日期,其行为在文档字符串中定义。

2.将工具与代理集成

在定义了自定义时间工具后,我们需要将其与我们的 LLM 代理集成。为此,我们在创建 create_react_agent 和 AgentExecutor 时将时间工具添加到工具列表中。

agent = create_react_agent(llm=llm, tools=tools + [time], prompt=prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools + [time],
    features="html.parser",
    handle_parsing_errors=True,
    verbose=True,
)

现在,我们的 LLM 代理配备了时间工具以及我们之前加载的其他内置工具。要查看我们的自定义工具的运行情况,我们可以向代理询问与当前日期相关的问题:

try:
    agent_executor.invoke({
   "input": "whats the date today?"})
except:
    print("exception on external access")
> Entering new AgentExecutor chain...
Action: time
Action Input: ""
2024-05-11
Final Answer: 2024-05-11

> Finished chain.

如您所见,代理认识到它需要使用时间工具来检索当前日期,并且它提供了正确的答案,而无需任何其他提示。这个例子演示了自定义工具在LangChain的代理中的有用性。通过创建自己的工具,您可以将 LLM 代理连接到所需的任何数据源、API 或函数,从而扩展其功能以满足您的特定需求。

小结

LangChain的代理彻底改变了我们对大型语言模型的思考方式。通过将 LLM 与外部工具和数据源相结合,该框架使我们能够处理复杂的推理任务并做出明智的决策。无论您是使用 DuckDuckGo Search 和 Wikipedia 等内置工具,还是根据您的特定需求创建自定义工具,LangChain 的代理都提供了灵活且可扩展的解决方案,用于将 LLM 集成到您的应用程序中。

小编是一名热爱人工智能的专栏作者,致力于分享人工智能领域的最新知识、技术和趋势。这里,你将能够了解到人工智能的最新应用和创新,探讨人工智能对未来社会的影响,以及探索人工智能背后的科学原理和技术实现。欢迎大家点赞,评论,收藏,让我们一起探索人工智能的奥秘,共同见证科技的进步!

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
1月前
|
前端开发 API 决策智能
多智能体微调实践:α-UMi 开源
近年来,为了加强大型语言模型(Large-Language Models, LLM)实时信息处理、解决专业问题的能力,催生了工具调用智能体(Tool Integrated Agent)概念
|
15天前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
61 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
7天前
|
数据采集 人工智能 自然语言处理
万字干货|复杂表格多Agent方案:从LLM洞察、系统性 思考到实践经验总结
笔者结合实践经验以近期在负责的复杂表格智能问答为切入点,结合大模型的哲学三问(“是谁、从哪里来、到哪里去”),穿插阐述自己对大模型的一些理解与判断,以及面向公共云LLM的建设模式思考,并分享软件设计+模型算法结合的一些研发实践经验。
|
8天前
|
Prometheus 监控 Java
深入探索:自制Agent监控API接口耗时实践
在微服务架构中,监控API接口的调用耗时对于性能优化至关重要。通过监控接口耗时,我们可以识别性能瓶颈,优化服务响应速度。本文将分享如何自己动手实现一个Agent来统计API接口的调用耗时,提供一种实用的技术解决方案。
18 3
|
1月前
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
61 3
LangChain-26 Custom Agent 自定义一个Agent并通过@tool绑定对应的工具 同时让大模型自己调用编写的@tools函数
|
1月前
|
Shell Docker 容器
LangChain-10(2) 加餐 编写Agent获取本地Docker运行情况 无技术含量只是思路
LangChain-10(2) 加餐 编写Agent获取本地Docker运行情况 无技术含量只是思路
17 4
LangChain-10(2) 加餐 编写Agent获取本地Docker运行情况 无技术含量只是思路
|
1月前
LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回
LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回
36 2
|
1月前
LangChain-24 Agengts 通过TavilySearch Agent实现检索内容并回答 AgentExecutor转换Search 借助Prompt Tools工具
LangChain-24 Agengts 通过TavilySearch Agent实现检索内容并回答 AgentExecutor转换Search 借助Prompt Tools工具
30 0
|
6月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
544 1
|
6月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
150 0

热门文章

最新文章