【Python】在使用联网工具时需要的问题

LangChain 的 Agent 默认逻辑是"尽力而为",如果工具报错或返回空,它往往会认为"我还需要更多信息",从而陷入死循环或者幻觉(开始编造答案)。

要控制它在搜索失败后立即停止并返回特定结果,你需要从以下三个层面进行"约束":

1. 工具层:封装"失败信号"

不要让 Agent 直接接收原始的错误堆栈信息(如 ConnectionError...),这会让它困惑。你需要封装工具,当网络请求失败或结果为空时,明确返回一个特殊的失败标记。

python 复制代码
from langchain_community.tools import DuckDuckGoSearchRun
from langchain.agents import tool

# 1. 定义一个带有容错逻辑的自定义工具
@tool
def safe_search(query: str) -> str:
    """
    用于搜索互联网上的最新信息。
    如果搜索失败或没有找到结果,会返回 'SEARCH_FAILED'。
    """
    try:
        search_tool = DuckDuckGoSearchRun()
        result = search_tool.run(query)
        
        # 2. 增加空结果检查
        if not result or len(result) < 10: # 简单的长度校验
            return "SEARCH_FAILED: 没有找到相关信息"
            
        return result
    except Exception as e:
        # 3. 捕获网络异常,返回明确的信号
        print(f"网络错误: {e}") # 后台打印错误,不让 Agent 看到
        return "SEARCH_FAILED: 网络连接失败或无法访问外部资源"

tools = [safe_search]

2. 提示词层:植入"停止指令"

你需要在 System Prompt 中明确告诉 Agent:"当你看到 SEARCH_FAILED 时,不要重试,直接告诉用户搜索失败。"

python 复制代码
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 关键:在 System Message 中加入防御性指令
system_msg = """
你是一个有用的助手。你可以使用以下工具:
{tools}

重要规则:
1. 如果工具返回 "SEARCH_FAILED" 或 "没有找到相关信息",请**立即停止**尝试搜索。
2. 不要尝试更换关键词再次搜索,也不要编造答案。
3. 直接回复用户:"抱歉,由于网络原因或资料缺失,我无法找到关于该主题的信息。"
"""

prompt = ChatPromptTemplate.from_messages([
    ("system", system_msg),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"), 
])

3. 执行层:设置"硬性熔断"

为了防止 Agent 因为"幻觉"而无视指令继续死循环,必须在 AgentExecutor 中设置最大迭代次数。这是最后一道防线。

python 复制代码
from langchain_classic.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent, 
    tools=tools, 
    verbose=True, 
    handle_parsing_errors=True,
    
    # 核心配置:
    max_iterations=3,  # 限制最多只能尝试 3 步(思考-行动)。超过则强制停止。
    max_execution_time=30, # 限制总执行时间(秒),防止无限卡在网络请求上
)

4. 执行层:设置"硬性熔断"

为了防止 Agent 因为"幻觉"而无视指令继续死循环,必须在 AgentExecutor 中设置最大迭代次数。这是最后一道防线。

python 复制代码
from langchain_classic.agents import AgentExecutor

agent_executor = AgentExecutor(
    agent=agent, 
    tools=tools, 
    verbose=True, 
    handle_parsing_errors=True,
    
    # 核心配置:
    max_iterations=3,  # 限制最多只能尝试 3 步(思考-行动)。超过则强制停止。
    max_execution_time=30, # 限制总执行时间(秒),防止无限卡在网络请求上
)
相关推荐
牢姐与蒯1 分钟前
Linux进程(五).之环境变量
linux·运维·服务器·ubuntu
whcyhhh19 分钟前
头歌实践教学平台:大数据存储2023(十四下答案)
大数据·数据库·python
码上有光24 分钟前
Linux:进程控制和进程替换
java·linux·服务器·进程控制·进程替换
Capricorn198825 分钟前
Ox Alpha 1M 上下文科研引用失真怎么排查?知芽 Notebook Skill 技术链路实操
人工智能·笔记·python·深度学习·知识图谱·论文笔记
常山云栈27 分钟前
如何理解python中的鸭子模(类)型?
开发语言·python
weixin1997010801628 分钟前
《alibaba.idle.isv.order.ship 接入实录:闲鱼订单发货回传的5个隐式约束》(附Python源码)
服务器·前端·python
y = xⁿ31 分钟前
DeepSeek harness工具系统什么设计的?
开发语言·python
深圳多奥智能一卡(码、脸)通系统37 分钟前
智能梯控SDK可直接用于第三方开发对接的接口文档说明书
服务器·前端·算法
维核科技37 分钟前
三个业务共用一台服务器,显存不够用了
大数据·服务器·人工智能
民乐团扒谱机44 分钟前
【读论文】基于波分复用和时分复用的单纤高精度双向时间传递系统
运维·服务器·网络