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

【Self-Ask with Search Agent机制概述】利用TavilyAnswer实现搜索代理

目录

示例代码

一、Self-Ask with Search Agent 机制概述

二、代码分析

1. 加载工具

3. 加载提示模板

4. 构建搜索代理

5. 创建代理执行器

6. 运行代理

三、Self-Ask with Search Agent 的应用场景

四、总结


示例代码

这段代码通过 Self-Ask with Search 代理,结合了大语言模型(qwen-plus)和搜索工具(TavilyAnswer),使得模型能够在处理输入时不仅通过推理生成答案,还能动态地从网络获取实时信息。核心流程包括加载模板、创建代理、并通过 AgentExecutor 执行查询,从而提供更加准确和及时的答案。

from langchain import hub
from langchain.agents import AgentExecutor, create_self_ask_with_search_agent
from langchain_community.tools.tavily_search import TavilyAnswer
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
load_dotenv() # 1、维基百科搜索:将初始化工具,让它提供答案而不是文档
tools = [TavilyAnswer(max_results=1, name="Intermediate Answer", description="Answer Search")]# 2、初始化大模型
llm = ChatOpenAI(temperature=0.95,model="qwen-plus",openai_api_key='sk-fb7ad7857e8a41b',#更换为自己的APIKEY(阿里百炼)openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)# 3、加载提示词模板:获取使用提示 可以修改此提示
prompt = hub.pull("hwchase17/self-ask-with-search")# 4、使用搜索代理构建自助询问
agent = create_self_ask_with_search_agent(llm, tools, prompt)# 5、代理执行器:通过传入代理和工具创建代理执行程序
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)# 6、运行代理
agent_executor.invoke({"input": "中国有哪些省份呢?用中文回复"})

 

运行结果

> Entering new AgentExecutor chain...
No.  
So the final answer is: 中国有以下省份:河北省、山西省、辽宁省、吉林省、黑龙江省、江苏省、浙江省、安徽省、福建省、江西省、山东省、河南省、湖北省、湖南省、广东省、海南省、四川省、贵州省、云南省、陕西省、甘肃省、青海省、台湾省。此外,还包括五个自治区:内蒙古自治区、广西壮族自治区、西藏自治区、宁夏回族自治区、新疆维吾尔自治区,以及两个特别行政区:香港特别行政区、澳门特别行政区。
> Finished chain.
{'input': '中国有哪些省份呢?用中文回复','output': '中国有以下省份:河北省、山西省、辽宁省、吉林省、黑龙江省、江苏省、浙江省、安徽省、福建省、江西省、山东省、河南省、湖北省、湖南省、广东省、海南省、四川省、贵州省、云南省、陕西省、甘肃省、青海省、台湾省。此外,还包括五个自治区:内蒙古自治区、广西壮族自治区、西藏自治区、宁夏回族自治区、新疆维吾尔自治区,以及两个特别行政区:香港特别行政区、澳门特别行政区。'}

 

一、Self-Ask with Search Agent 机制概述

Self-Ask with Search Agent 是一种代理模式,它结合了 自我提问搜索 的能力。它允许模型根据输入的问题自我分析,进行必要的外部搜索,获取相关信息,并将搜索结果作为回答的一部分。

具体来说,Self-Ask 代理可以在以下几个步骤中工作:

  1. 模型理解问题: 模型接收到输入问题后,会尝试理解并判断问题中是否有需要搜索的部分。

  2. 生成搜索查询: 如果问题中包含模糊或不完整的信息,模型会生成一个或多个搜索查询,去搜索外部工具或 API 获取更多的上下文信息。

  3. 执行搜索: 模型通过外部工具进行搜索(例如使用 TavilyAnswer 来获取答案)。

  4. 生成最终回答: 模型将搜索结果和已有的知识结合,生成完整的回答。

这种机制的优势是它可以将 自动化搜索自我提问 结合起来,帮助模型回答那些超出它当前知识范围的问题。


二、代码分析

1. 加载工具

tools = [TavilyAnswer(max_results=1, name="Intermediate Answer", description="Answer Search")]

这里你初始化了一个工具 TavilyAnswer,这个工具负责从某个搜索引擎(假设是基于搜索 API)中返回相关的答案。工具 TavilyAnswer 是从外部获取信息的关键组件。

  • max_results=1 表示每次只返回一个搜索结果。


2. 初始化大模型

llm = ChatOpenAI(temperature=0.95,model="qwen-plus",openai_api_key='sk-fb7ad7857e8a41b*********',openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

这里初始化了一个 OpenAI 的 ChatOpenAI 模型(qwen-plus)。这个模型用于回答用户问题。通过设置 temperature 为 0.95,模型的生成会更加灵活和多样。


3. 加载提示模板

prompt = hub.pull("hwchase17/self-ask-with-search")

 这行代码从 LangChain 的 hub 下载了一个名为 self-ask-with-search 的提示模板。这个模板提供了一个标准化的结构,帮助模型在处理输入问题时执行搜索并生成合适的答案。

特点加载的提示词模板自己定义的模板
来源由第三方(如LangChain Hub)提供开发者自己定义
灵活性有一定的限制,框架已经预设了模板结构完全灵活,可以根据需求进行设计和调整
适用场景适用于快速启动和常见的应用场景适用于需要个性化和特定需求的场景
自定义难度相对较低,用户只需调整参数和传递输入数据较高,需要从头设计并确保模板符合需求
维护难度简单,通常由第三方维护更新需要自己维护和更新
  • 加载的提示词模板:预先设计好的通用模板,可以让你快速使用标准化的功能,但灵活性较低。

  • 自己定义的模板:完全自定义,适用于复杂、特定需求的场景,提供更高的控制权,但需要更多的开发工作。


4. 构建搜索代理

agent = create_self_ask_with_search_agent(llm, tools, prompt)

这里,create_self_ask_with_search_agent 函数创建了一个 Self-Ask with Search Agent,它结合了前面提到的模型(llm)、工具(tools)和提示模板(prompt)。

  • 模型(llm 将用于生成问题和答案。

  • 工具(tools 将帮助模型进行搜索。

  • 提示(prompt 则为模型提供了如何执行这一过程的指导。


5. 创建代理执行器

agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)

这里创建了一个 AgentExecutor,它是执行代理任务的核心组件。AgentExecutor 会启动代理(agent),并在执行时使用工具(tools)来进行外部查询。

这段代码是创建 AgentExecutor 实例,AgentExecutor 是用于执行代理(Agent)并管理与工具交互的类。它接受一些参数来控制代理的行为。以下是每个参数的解析:


1. agent=agent

这个参数将代理(Agent)对象传递给 AgentExecutor。代理通常由模型和工具组成,能够执行特定的任务。在你的代码中,agent 是通过 create_self_ask_with_search_agent 或类似的方式创建的代理实例。

  • agent:这个代理包含了你希望执行的逻辑和行为,例如如何搜索、如何提问和回答问题、如何交互等。它是核心的控制单元。


2. tools=tools

这个参数传递的是工具列表,它是代理可以调用的工具集合。工具是用于处理特定任务的辅助功能,通常是一些函数或服务。

  • tools:这些是代理在执行任务时可以调用的外部工具。在你的代码中,tools 列表包含了 TavilyAnswer,这个工具用于搜索答案并提供相应的结果。代理会通过调用这些工具来获取所需的信息。


3. verbose=True

这个参数用于控制是否在执行过程中输出详细信息。若设置为 True,则在执行时会打印更多的调试信息和步骤,这有助于开发和调试过程中查看代理的行为。

  • verbose:启用详细日志输出。设置为 True 时,执行过程的详细信息(如调用的工具、模型的响应等)会被打印出来。这对于调试和监控非常有用。


4. handle_parsing_errors=True

这个参数控制是否在出现解析错误时进行处理。解析错误可能会在代理执行过程中发生,尤其是当代理需要解析和处理输入或输出时。设置为 True 会确保即使出现解析错误,执行过程也会尽量不中断,而是进行容错处理。

  • handle_parsing_errors:用于决定是否容忍并处理解析错误。如果设置为 True,在遇到解析错误时,代理会尝试继续执行而不是立即终止。这样可以避免整个执行流程因为一个小错误而中断。


这段代码的整体作用:

  • 代理执行器 (AgentExecutor) 是用来执行代理(Agent)的任务,并且它会控制代理与工具的交互。

  • agent 是你定义的代理对象,包含了如何通过工具执行任务的逻辑。

  • tools 是代理可以调用的工具,在执行过程中提供帮助和外部资源。

  • verbose=True 让代理执行器在执行时输出详细的调试信息,方便追踪每一步的执行。

  • handle_parsing_errors=True 保证即使发生解析错误时,代理也能继续执行,而不是中途停止。


6. 运行代理

agent_executor.invoke({"input": "中国有哪些省份呢?用中文回复"})

最后,你调用 invoke 函数,向代理传递了一个输入问题:“中国有哪些省份呢?用中文回复”。这时代理会根据输入问题:

  • 判断是否需要外部搜索。

  • 如果需要搜索,它会通过 TavilyAnswer 获取相关的搜索结果。

  • 然后生成最终的回答。


三、Self-Ask with Search Agent 的应用场景

这个机制非常适合以下几种场景:

  • 知识库扩展: 当模型的知识库有限,无法回答一些非常具体或最新的信息时,模型可以通过搜索代理查找并获取实时信息。

  • 复杂查询: 对于那些含糊不清、需要多轮信息来推断的问题,模型可以自我提问、进行外部搜索,以获取更多背景信息来给出准确的回答。

  • 支持外部插件: 通过结合外部工具或 API,模型可以执行更复杂的任务(如天气查询、股票查询、旅游规划等)。


四、总结

Self-Ask with Search Agent 是一个很强大的机制,它允许模型结合外部搜索来处理一些超出其当前知识范围的问题。在这段代码中,通过 create_self_ask_with_search_agent 创建的代理使得模型可以在回答问题时进行自动化搜索,从而提高回答的准确性和广度。

http://www.xdnf.cn/news/938521.html

相关文章:

  • 【文件传输脚本】
  • XSS攻击防御全指南:核心防护技巧
  • UVM的断言assert详谈
  • 【GESP真题解析】第 17 集 GESP 三级 2024 年 12 月编程题 2:打印数字
  • Linux 基础IO(下)
  • Linux 内核内存管理子系统全面解析与体系构建
  • 基于cornerstone3D的dicom影像浏览器 第三十章 心胸比例测量工具CTRTool
  • 深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
  • 隐函数 因变量确定标准
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (三)数据格式
  • (LeetCode 动态规划(基础版))96. 不同的二叉搜索树 (递推 || 递归)
  • 自定义连接线程池
  • 【Erdas实验教程】016:遥感图像空间增强(卷积增强)
  • 01.SQL语言概述
  • 华为OD机考- 简单的自动曝光/平均像素
  • (每日一道算法题)验证二叉搜索树
  • 随机算法一文深度全解
  • Dify 工作流全解:模块组成、设计思路与DSL实战指南
  • 【ROS2】核心概念8——参数设置(Parameters)
  • 商家平台AI智能搜索工程实践|RAG|向量检索增强
  • AT_abc409_e [ABC409E] Pair Annihilation
  • 三级流水线是什么?
  • OpenJudge | 大整数乘法
  • 5.子网划分及分片相关计算
  • python中使用LibreHardwareMonitorLib.dll获取电脑硬件信息~~【不用同步打开exe文件】
  • Docker知识五:服务编排(Docker Compose概念)
  • [M132][Part_1] chromium codelab
  • JDK 17 新特性
  • three.js 零基础到入门
  • GeoBoundaries下载行政区划边界数据(提供中国资源shapefile)