前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【LangChain系列6】【Agent模块详解】

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

原创
作者头像
Alice师傅的好宝宝
发布2025-01-13 16:11:42
发布2025-01-13 16:11:42
1K00
代码可运行
举报
文章被收录于专栏:LangchainLangchain
运行总次数:0
代码可运行

一、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、安装

代码语言:javascript
代码运行次数:0
运行
复制
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的执行顺序

伪代码介绍执行顺序:

代码语言:python
代码运行次数:0
运行
复制
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 安装:

代码语言:python
代码运行次数:0
运行
复制
pip install -U langchain-community tavily-python

TavilySearchResults参数介绍

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

Demo测试:

代码语言:python
代码运行次数:0
运行
复制
import os 



os.environ["TAVILY\_API\_KEY"] = ""



from langchain\_community.tools import TavilySearchResults



tool = 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构建:

代码语言:python
代码运行次数:0
运行
复制
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 TavilySearchResults



tools = [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 允许语言模型调用这些自定义函数,就像调用内置函数一样。这使得模型能够执行更复杂的任务,如数据检索、文件处理等。
代码语言:python
代码运行次数:0
运行
复制
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



os.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、获取提示词模板:

代码语言:python
代码运行次数:0
运行
复制
from langchain import hub

# Get the prompt to use - you can modify this!

prompt = hub.pull("hwchase17/react")

prompt

输出: React的提示词模板如下所示。

2、构建React智能体

代码语言:python
代码运行次数:0
运行
复制
from langchain\_community.chat\_models import ChatZhipuAI

from langchain\_community.tools.tavily\_search import TavilySearchResults

from langchain.agents import AgentExecutor, create\_react\_agent

import os



os.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、与聊天记录一起使用:

代码语言:python
代码运行次数:0
运行
复制
# 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, HumanMessage



agent\_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:

其他工具

1、RAG检索工具

代码语言:python
代码运行次数:0
运行
复制
# 报错: cannot import name 'tarfile' from 'backports' (C:\ProgramData\anaconda3\Lib\site-packages\backports\\_\_init\_\_.py)

# 解决方案:删掉C:\ProgramData\anaconda3\Lib\site-packages下的backports文件夹



from langchain.text\_splitter import RecursiveCharacterTextSplitter

from langchain\_community.document\_loaders import WebBaseLoader

from langchain\_community.vectorstores import FAISS

from langchain.embeddings import HuggingFaceEmbeddings

from langchain.embeddings import ModelScopeEmbeddings

from langchain.embeddings import SentenceTransformerEmbeddings



# embeddings = HuggingFaceEmbeddings()

# model\_id = "damo/nlp\_corom\_sentence-embedding\_english-base"

# embeddings = ModelScopeEmbeddings(model\_id=model\_id)

embeddings = ModelScopeEmbeddings()

# embeddings = SentenceTransformerEmbeddings()

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")

# loader = WebBaseLoader("https://baijiahao.baidu.com/s?id=1723160948933478116")

docs = loader.load()

documents = RecursiveCharacterTextSplitter(

    chunk\_size=1000, chunk\_overlap=200

).split\_documents(docs)

vector = FAISS.from\_documents(documents, embeddings)

retriever = vector.as\_retriever()



from langchain.tools.retriever import create\_retriever\_tool



retriever\_tool = create\_retriever\_tool(

    retriever=retriever,

    name="langsmith\_search",

    description="Search for information about LangSmith. For any questions about LangSmith, you must use this tool!",

)

2、文件系统工具

代码语言:python
代码运行次数:0
运行
复制
from langchain.tools.file\_management import (

    ReadFileTool,

    CopyFileTool,

    DeleteFileTool,

    MoveFileTool,

    WriteFileTool,

    ListDirectoryTool,

)

from langchain.agents.agent\_toolkits import FileManagementToolkit

from tempfile import TemporaryDirectory



# We'll make a temporary directory to avoid clutter

working\_directory = TemporaryDirectory()

toolkit = FileManagementToolkit(

    root\_dir=str(working\_directory.name)

)  # If you don't provide a root\_dir, operations will default to the current working directory

toolkit.get\_tools()



tools = FileManagementToolkit(

    root\_dir=str(working\_directory.name),

    selected\_tools=["read\_file", "write\_file", "list\_directory"],

).get\_tools()



read\_tool, write\_tool, list\_tool = tools

write\_tool.run({"file\_path": "example.txt", "text": "2024年11月25日"})

3、Python工具

代码语言:python
代码运行次数:0
运行
复制
from langchain.agents import Tool

from langchain\_experimental.tools.python.tool import PythonAstREPLTool, PythonREPLTool



# 创建PythonREPLTool实例

python\_repl\_tool = PythonREPLTool()



# 定义要传入的查询语句(这里以一个简单的打印语句为例)

query\_value = "print('1+1')"



# # 调用\_run方法并传入查询语句

# result = python\_repl\_tool.\_run(

#     query=query\_value,

# )



# result

# 您可以创建一个工具来传递给一个代理

repl\_tool = Tool(

    name="python\_repl",

    description="一个Python shell。使用它来执行python命令。输入应该是一个有效的python命令。如果你想看到一个值的输出,你应该用`print(...)`打印出来。",

    func=python\_repl\_tool.run,

)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、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
  • 其他工具
    • 1、RAG检索工具
    • 2、文件系统工具
    • 3、Python工具
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档