当前位置: 首页 > news >正文

【LangChain系列6】【Agent模块详解】

目录

  • 前言
  • 一、LangChain
    • 1-1、介绍
    • 1-2、LangChain抽象出来的核心模块
    • 1-3、特点
    • 1-4、langchain解决的一些行业痛点
    • 1-5、安装
  • 二、Agent模块详解
    • 2-0、Agent核心思想——React介绍
      • 2-0-1、React的介绍以及由来
      • 2-0-2、伪代码介绍React的执行顺序
    • 2-1、Agent介绍
    • 2-1、Self ask with search
    • 2-3、OpenAI Function
    • 2-4、ReAct
  • 总结


前言

LangChain给自身的定位是:用于开发由大语言模型支持的应用程序的框架。它的做法是:通过提供标准化且丰富的模块抽象,构建大语言模型的输入输出规范,利用其核心概念chains,灵活地连接整个应用开发流程。 这里是LangChain系列的第六篇,主要介绍LangChain的Agent模块。

一、LangChain

1-1、介绍

LangChain是一个框架,用于开发由大型语言模型(LLM)驱动的应用程序。

LangChain 简化了 LLM 应用程序生命周期的每个阶段:

  • 开发:使用LangChain的开源构建块和组件构建应用程序。使用第三方集成和模板开始运行。
  • 生产化:使用 LangSmith 检查、监控和评估您的链条,以便您可以自信地持续优化和部署。
  • 部署:使用 LangServe 将任何链转换为 API。

总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)

在这里插入图片描述

1-2、LangChain抽象出来的核心模块

想象一下,如果要组织一个AI应用,开发者一般需要?

  • 提示词模板的构建,不仅仅只包含用户输入!
  • 模型调用与返回,参数设置,返回内容的格式化输出。
  • 知识库查询,这里会包含文档加载,切割,以及转化为词嵌入(Embedding)向量。
  • 其他第三方工具调用,一般包含天气查询、Google搜索、一些自定义的接口能力调用。
  • 记忆获取,每一个对话都有上下文,在开启对话之前总得获取到之前的上下文吧?

由上边的内容,引出LangChain抽象的一些核心模块:

LangChain通过模块化的方式去高级抽象LLM在不同场景下的能力,其中LangChain抽象出的最重要的核心模块如下:

  • Model I/O :标准化各个大模型的输入和输出,包含输入模版,模型本身和格式化输出;
  • Retrieval :检索外部数据,然后在执行生成步骤时将其传递到 LLM,包括文档加载、切割、Embedding等;
  • Chains :链条,LangChain框架中最重要的模块,链接多个模块协同构建应用,是实际运作很多功能的高级抽象;
  • Memory : 记忆模块,以各种方式构建历史信息,维护有关实体及其关系的信息;
  • Agents : 目前最热门的Agents开发实践,未来能够真正实现通用人工智能的落地方案;
  • Callbacks :回调系统,允许连接到 LLM 应用程序的各个阶段。用于日志记录、监控、流传输和其他任务;

1-3、特点

LangChain的特点如下:

  • 大语言模型(llm): LangChain为自然语言处理提供了不同类型的模型,这些模型可用于处理非结构化文本数据,并且可以基于用户的查询检索信息

  • PromptTemplates: 这个特征使开发人员能够使用多个组件为他们的模型构造输入提示。在查询时,开发人员可以使用PromptTemplates为用户查询构造提示模板,之后模板会传递到大模型进行进一步的处理。

  • :在LangChain中,链是一系列模型,它们被连接在一起以完成一个特定的目标。聊天机器人应用程序的链实例可能涉及使用LLM来理解用户输入,使用内存组件来存储过去的交互,以及使用决策组件来创建相关响应。

  • agent: LangChain中的agent与用户输入进行交互,并使用不同的模型进行处理。Agent决定采取何种行动以及以何种顺序来执行行动。例如,CSV Agent可用于从CSV文件加载数据并执行查询,而Pandas Agent可用于从Pandas数据帧加载数据并处理用户查询。可以将代理链接在一起以构建更复杂的应用程序。

在这里插入图片描述

1-4、langchain解决的一些行业痛点

在使用大模型的过程中,一些行业痛点:

  • 大模型的使用规范以及基于大模型的开发范式不尽相同,当使用一个新模型时,我们往往需要学习新的模型规范。
  • 大模型知识更新的滞后性
  • 大模型的外部API调用能力
  • 大模型输出的不稳定问题,如何稳定输出?
  • 大模型与私有化数据的连接方式?

1-5、安装

pip install langchain

二、Agent模块详解

2-0、Agent核心思想——React介绍

2-0-1、React的介绍以及由来

在这里插入图片描述
Agent核心思想React的由来: 在React思想之前,Reason和Act是割裂的,即推理和行动。如上图所示:

  • Reason Only (仅推理):这种方式中,模型主要关注于生成推理过程,而不是直接采取行动。即,模型主要聚焦于思考过程。
  • Act Only (仅行动):在这种方式中,模型直接与环境(Env)交互,根据观察(Observations)采取行动(Actions)。即,模型聚焦于根据直接采取行动,而不会去思考行动是否正确,接下来该做什么等问题。
  • ReAct (推理+行动):这种方式结合了推理和行动,模型在采取行动之前会进行推理。即,思考+行动,循环这个过程,直到完成目标。

2-0-2、伪代码介绍React的执行顺序

伪代码介绍执行顺序:

next_action = agent.get_action(...)
while next_action != AgentFinish:observation = run(next_action)next_action = agent.get_action(..., next_action, observation)
return next_action

过程介绍:

  • 判断next_action(下一次操作)是否为AgentFinish标记,如果是的话,则结束循环。
  • 如果next_action(下一次操作)不是AgentFinish标记,则执行并且得到结果,作为模型的观察数据。
  • 模型通过观察执行的操作,以及该操作得到的结果,决定下一次执行的操作。如果为AgentFinish则结束循环,否则重复以上步骤。

解决的问题:

  • 处理Agent选择不存在的工具的情况
  • 处理工具出错的情况
  • 处理Agent生成的输出无法解析为工具调用的情况
  • 所有级别(Agent决策、工具调用)的日志记录和可观察性到 stdout 和/或 LangSmith。

2-1、Agent介绍

在这里插入图片描述
Agent的核心思想是使用LLM来选择一系列要执行的动作,图示相关内容介绍如下。
1、左侧内容:

  • 用户输入(User Input):用户提供输入,这可以是一个问题、一个请求或任何需要代理处理的信息。
  • 补全(Completion):补全是指根据用户输入生成标准响应的过程。这可能涉及到生成文本、回答问题或执行特定的任务。
  • 上下文(Context):上下文是指代理在生成响应时需要考虑的额外信息。这可以包括历史对话、用户偏好或其他相关数据。

2、右侧内容:

  • Agent:Agent主要的组成是大模型+一系列提示策略
  • 提示策略(Prompting Strategies): 主要包含Agent的核心执行思想React(推理+行动),OpenAI Functions(使用OpenAI提供的函数来执行特定任务,这些函数可以是预定义的或用户自定义的),Self ask with search(Agent自我提问并使用搜索来获取信息,然后基于这些信息生成响应)
  • 工具包(Toolkits):Agent可以调用的一组工具或者是API,这些工具可以帮助Agent执行各种任务。可以是Langchain已有的,也可以是自定义的。

2-1、Self ask with search

Self-ask with search: 指的是Agent通过搜索,自我批判来解决复杂问题。这里我们使用tavily 搜索。 tavily 搜索引擎API获取地址 (别看了,没别的介绍,我也是第一次用,不是不用Google搜索,是捣鼓了很久获取不到验证码。 🤷‍♂️)

tavily 安装:

pip install -U langchain-community tavily-python

TavilySearchResults参数介绍

  • max_results:最大返回搜索数量
  • include_answer:是否包含答案
  • include_images: 是否包含图片

Demo测试:

import os os.environ["TAVILY_API_KEY"] = ""from langchain_community.tools import TavilySearchResultstool = TavilySearchResults(max_results=5,include_answer=True,include_raw_content=True,include_images=True,# search_depth="advanced",# include_domains = []# exclude_domains = []
)tool.invoke({'query': '谁是世界上最美丽的女人?'})

输出:
在这里插入图片描述
Agent构建:


from langchain.agents import load_tools, get_all_tool_names
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
from langchain.agents import tool
from langchain.schema import SystemMessage
from langchain.agents import OpenAIFunctionsAgent
from langchain.agents import AgentExecutor
from langchain_community.chat_models import ChatZhipuAI
from langchain.agents import initialize_agent, AgentType, Tool
import os 
os.environ["TAVILY_API_KEY"] = ""from langchain_community.tools import TavilySearchResultstools = [TavilySearchResults(name = 'Intermediate Answer', max_results=5)]os.environ["ZHIPUAI_API_KEY"] = ""
llm = ChatZhipuAI(model="glm-4",temperature=0,
)# 实例化 SELF_ASK_WITH_SEARCH Agent
self_ask_with_search = initialize_agent(tools, llm, agent=AgentType.SELF_ASK_WITH_SEARCH, verbose=True
)
# 实际运行 Agent,查询问题(正确)
self_ask_with_search.invoke("成都举办的大运会是第几届大运会?"
)

输出:

在这里插入图片描述

2-3、OpenAI Function

OpenAIFunctionsAgent 是一个特定的代理(Agent),它被设计用来与 OpenAI 提供的函数调用功能进行交互。这个代理允许用户定义和执行自定义的函数,这些函数可以被语言模型调用,以执行特定的任务或操作。

以下是 OpenAIFunctionsAgent 的一些关键特性:

  • 函数定义:用户可以定义自己的函数,这些函数可以接收输入、执行计算或调用外部API,并将结果返回给语言模型。
  • 与语言模型集成:OpenAIFunctionsAgent 允许语言模型调用这些自定义函数,就像调用内置函数一样。这使得模型能够执行更复杂的任务,如数据检索、文件处理等。
from langchain.agents import load_tools, get_all_tool_names
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
from langchain.agents import tool
from langchain.schema import SystemMessage
from langchain.agents import OpenAIFunctionsAgent
from langchain.agents import AgentExecutoros.environ["ZHIPUAI_API_KEY"] = ""
llm = ChatZhipuAI(model="glm-4",temperature=0,
)# 自定义函数
# @tool
# def get_word_length(word: str) -> int:
#     """Returns the length of a word."""
#     return len(word)# tools = [get_word_length]# 调用自带的函数
tools = load_tools(["llm-math"], llm=llm)system_message = SystemMessage(content="你是一个非常强大的AI助手")
prompt = OpenAIFunctionsAgent.create_prompt(system_message=system_message)
agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt)# 实例化 OpenAIFunctionsAgent
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke("单词“educaasdfasdf”中有多少个字母? 字母次数的3次方是多少? 结果再开方,最终结果是什么?")

输出:

在这里插入图片描述
获取所有工具列表:

在这里插入图片描述

2-4、ReAct

1、获取提示词模板:

from langchain import hub
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/react")
prompt

输出: React的提示词模板如下所示。在这里插入图片描述

2、构建React智能体

from langchain_community.chat_models import ChatZhipuAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain.agents import AgentExecutor, create_react_agent
import osos.environ["ZHIPUAI_API_KEY"] = ""
llm = ChatZhipuAI(model="glm-4",temperature=0,
)os.environ["TAVILY_API_KEY"] = ""
tools = [TavilySearchResults(max_results=1)]# 构建React智能体
agent = create_react_agent(llm, tools, prompt)
# 解析错误解决方案:添加参数handle_parsing_errors=True
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "2024年有什么重大事件?"})

输出:
在这里插入图片描述

3、与聊天记录一起使用:

# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/react-chat")# Construct the ReAct agent
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)from langchain_core.messages import AIMessage, HumanMessageagent_executor.invoke({"input": "what's my name? Only use a tool if needed, otherwise respond with Final Answer",# Notice that chat_history is a string, since this prompt is aimed at LLMs, not chat models"chat_history": "Human: Hi! My name is Bob\nAI: Hello Bob! Nice to meet you",}
)

输出:
在这里插入图片描述
Prompt:
在这里插入图片描述

参考文章:

langchain_community.utilities.sql_database.SQLDatabase
LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发
LangChain官网
Rebuff: 防止提示词注入检测器

未完成:
Build a Question/Answering system over SQL data
langchain101 AI应用开发指南
Langchain官方文档tavily_search搜索工具

总结

Agent也没有那么完美,老是会报些奇奇怪怪的错误❌。

http://www.lryc.cn/news/480216.html

相关文章:

  • JavaScript Cookie 与 服务器生成的 Cookie 的区别与应用
  • 深入了解Git、GitHub、GitLab及其应用技巧
  • ctfshow(316,317,318)--XSS漏洞--反射性XSS
  • Visual Studio2022版本的下载与安装
  • nodeJS程序如何引入依赖包
  • 建网站怎么建?只需几个步骤
  • 机器学习课程总结(个人向)
  • 数据分析-43-时间序列预测之深度学习方法GRU
  • Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法
  • Elasticsearch的自定义查询方法到底是啥?
  • Jenkins找不到maven构建项目
  • 怎么更换IP地址 改变IP归属地的三种方法
  • C#-异步查询示例
  • 设计模式之适配器模式(从多个MQ消息体中,抽取指定字段值场景)
  • vue+exceljs前端下载、导出xlsx文件
  • 算法定制LiteAIServer摄像机实时接入分析平台烟火检测算法的主要功能
  • 用 Python 从零开始创建神经网络(二)
  • 嘉吉连续第七年亮相进博会
  • 设计模式之单列模式(7种单例模式案例,Effective Java 作者推荐枚举单例模式)
  • 多个服务器共享同一个Redis Cluster集群,并且可以使用Redisson分布式锁
  • 100种算法【Python版】第59篇——滤波算法之扩展卡尔曼滤波
  • 制造业数字化转型的强大赋能平台:盘古信息IMS OS工软技术底座
  • 域名+服务器+Nginx+宝塔使用SSL证书配置HTTPS
  • UnityAssetsBundle字体优化解决方案
  • Go的环境搭建以及GoLand安装教程
  • git clone,用https还是ssh
  • 量化交易系统开发-实时行情自动化交易-Okex行情交易数据
  • 【重装系统后重新配置2】pycharm 终端无法激活conda环境
  • 【LeetCode每日一题】——802.找到最终的安全状态
  • kafka安装部署--详细教程