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
相关产品推荐
相关产品推荐

