You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangChain结构化聊天代理结合维基百科工具的解析错误与整数结果获取方案

解决LangChain结合GPT-4与维基百科工具获取整数结果的问题

问题本质

旧代码示例过时引发解析错误,迭代限制触发停止,核心原因是代理输出格式不规范、工具调用逻辑未聚焦目标,导致无法直接得到整数结果。

具体解决方案

1. 强制输出格式,优化系统提示词

使用create_structured_chat_agent时,在系统提示词中明确约束输出规则,避免冗余内容:

system_prompt = """
你需完成以下任务:
1. 根据输入的电影名称和年份,通过维基百科工具查询该电影的导演
2. 查询该导演在这部电影上映年份之前执导的所有影片数量
3. 最终仅返回这个数量的整数,不要任何额外文字、解释或符号
"""

2. 调整AgentExecutor参数,避免迭代超时

  • 提高max_iterations给代理足够的工具调用次数
  • 保留错误处理的同时关闭冗余输出:
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,
    handle_parsing_errors=True,
    return_intermediate_steps=False,
    verbose=False
)

3. 添加自定义整数提取逻辑,兜底处理

如果代理仍偶尔输出多余内容,用正则提取整数:

def extract_integer(output):
    import re
    match = re.search(r'\d+', str(output))
    return int(match.group()) if match else 0

# 调用后处理结果
result = agent_executor.invoke({"input": "查询1991年《末路狂花》的导演在此之前执导的影片数量"})
final_number = extract_integer(result['output'])

4. 完整可运行代码示例

from langchain_openai import ChatOpenAI
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain.tools import WikipediaQueryRun
from langchain.utilities import WikipediaAPIWrapper

# 初始化维基百科工具
wikipedia_api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=500)
wikipedia_tool = WikipediaQueryRun(api_wrapper=wikipedia_api_wrapper)
tools = [wikipedia_tool]

# 初始化GPT-4模型
llm = ChatOpenAI(model="gpt-4", temperature=0)

# 构建约束性系统提示词
system_prompt = """
你需完成以下任务:
1. 根据用户提供的电影名称和年份,查询该电影的导演姓名
2. 查询该导演在指定年份之前执导的所有电影数量
3. 最终只返回这个数量的整数,不要任何其他内容
"""

# 创建结构化聊天代理
agent = create_structured_chat_agent(llm=llm, tools=tools, system_prompt=system_prompt)

# 配置代理执行器
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,
    handle_parsing_errors=True,
    return_intermediate_steps=False,
    verbose=False
)

# 封装查询函数
def get_director_previous_film_count(movie_name, year):
    input_query = f"电影{movie_name}在{year}年上映,查询其导演在此之前执导的影片数量"
    result = agent_executor.invoke({"input": input_query})
    # 提取整数结果
    import re
    match = re.search(r'\d+', str(result['output']))
    return int(match.group()) if match else 0

# 测试调用
print(get_director_previous_film_count("末路狂花", 1991))

内容的提问来源于stack exchange,提问作者Mark White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:30:13