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

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
模型训练 PAI-DLC,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 【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 集成到您的应用程序中。

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

相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
4天前
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
|
4天前
|
决策智能 开发者
Multi-Agent实践第8期:轻松拖拽搭建多智能体应用
AgentScope Workstation令多智能体应用的搭建变得轻而易举,只需简单拖拽操作,每位用户都能快速打造出丰富多彩的应用。
|
21天前
|
人工智能 安全 API
【LangChain系列】第十篇:数据保护简介及实践
【5月更文挑战第24天】本文探讨了在使用大型语言模型时保护个人数据的重要性,特别是涉及敏感信息如PII(个人可识别信息)的情况。为了降低数据泄露风险,文章介绍了数据匿名化的概念,通过在数据进入LLM前替换敏感信息。重点讲解了Microsoft的Presidio库,它提供了一个可定制的文本匿名化工具。此外,文章还展示了如何结合LangChain库创建一个安全的匿名化流水线,包括初始化匿名器、添加自定义识别器和操作符,以及在问答系统中集成匿名化流程。通过这种方式,可以在利用LLMs的同时保护数据隐私。
55 0
|
23天前
|
机器学习/深度学习 人工智能
【LangChain系列】第九篇:LLM 应用评估简介及实践
【5月更文挑战第23天】本文探讨了如何评估复杂且精密的语言模型(LLMs)应用。通过创建QA应用程序,如使用GPT-3.5-Turbo模型,然后构建测试数据,包括手动创建和使用LLM生成示例。接着,通过手动评估、调试及LLM辅助评估来衡量性能。手动评估借助langchain.debug工具提供执行细节,而QAEvalChain则利用LLM的语义理解能力进行评分。这些方法有助于优化和提升LLM应用程序的准确性和效率。
86 8
|
24天前
|
存储 机器学习/深度学习 人工智能
【LangChain系列】第八篇:文档问答简介及实践
【5月更文挑战第22天】本文探讨了如何使用大型语言模型(LLM)进行文档问答,通过结合LLM与外部数据源提高灵活性。 LangChain库被介绍为简化这一过程的工具,它涵盖了嵌入、向量存储和不同类型的检索问答链,如Stuff、Map-reduce、Refine和Map-rerank。文章通过示例展示了如何使用LLM从CSV文件中提取信息并以Markdown格式展示
89 2
|
25天前
|
机器学习/深度学习 自然语言处理 数据挖掘
【LangChain系列】第七篇:工作流(链)简介及实践
【5月更文挑战第21天】LangChain是一个框架,利用“链”的概念将复杂的任务分解为可管理的部分,便于构建智能应用。数据科学家可以通过组合不同组件来处理和分析非结构化数据。示例中展示了如何使用LLMChain结合OpenAI的GPT-3.5-turbo模型,创建提示模板以生成公司名称和描述。顺序链(SimpleSequentialChain和SequentialChain)则允许按顺序执行多个步骤,处理多个输入和输出
154 1
|
26天前
|
存储 人工智能 搜索推荐
【LangChain系列】第六篇:内存管理简介及实践
【5月更文挑战第20天】【LangChain系列】第六篇:内存管理简介及实践
70 0
【LangChain系列】第六篇:内存管理简介及实践
|
27天前
|
机器学习/深度学习 人工智能 自然语言处理
【LangChain系列】第五篇:大语言模型中的提示词,模型及输出简介及实践
【5月更文挑战第19天】LangChain是一个Python库,简化了与大型语言模型(LLM)如GPT-3.5-turbo的交互。通过ChatOpenAI类,开发者可以创建确定性输出的应用。提示词是指导LLM执行任务的关键,ChatPromptTemplate允许创建可重用的提示模板。输出解析器如StructuredOutputParser将模型的响应转化为结构化数据,便于应用处理。LangChain提供可重用性、一致性、可扩展性,并有一系列预建功能。它使得利用LLM构建复杂、直观的应用变得更加容易。
94 0
|
1月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
56 1
|
1月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
71 0