【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 代理可以在以下几个步骤中工作:
-
模型理解问题: 模型接收到输入问题后,会尝试理解并判断问题中是否有需要搜索的部分。
-
生成搜索查询: 如果问题中包含模糊或不完整的信息,模型会生成一个或多个搜索查询,去搜索外部工具或 API 获取更多的上下文信息。
-
执行搜索: 模型通过外部工具进行搜索(例如使用
TavilyAnswer
来获取答案)。 -
生成最终回答: 模型将搜索结果和已有的知识结合,生成完整的回答。
这种机制的优势是它可以将 自动化搜索 与 自我提问 结合起来,帮助模型回答那些超出它当前知识范围的问题。
二、代码分析
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
创建的代理使得模型可以在回答问题时进行自动化搜索,从而提高回答的准确性和广度。