Vertex AI Gemini函数调用返回结果触发_InactiveRpcError报错求助
数据库交互聊天机器人函数调用错误修复思路
问题场景
正在开发基于Gemini API的数据库交互聊天机器人,已定义list_tables、describe_table、execute_query三个数据库操作函数并封装为工具传入模型。模型生成的SQL存在列名错误(将products表的product_name写成name),手动修正SQL后,尝试将数据库查询结果以函数响应形式返回给模型生成可读内容时,触发_InactiveRpcError,错误提示:
Please ensure that the number of function response parts should be equal to number of function call parts of the function call turn.
错误原因分析
该错误核心是函数响应的结构/数量与模型发起的函数调用不匹配:
- 模型上一轮消息中发起了N个函数调用,当前返回的响应必须对应N个函数的执行结果
- 函数响应的格式不符合Vertex AI SDK要求,比如错误嵌套
content字段,或者响应结构与函数声明的返回类型不匹配 - 手动修正SQL后,未正确执行查询获取结果,反而错误地将修正后的SQL语句作为响应内容传入,导致格式完全错误
修复步骤与代码示例
1. 先执行修正后的SQL获取真实结果
手动修正SQL后,必须先调用execute_query执行查询,拿到数据库返回的结果,而不是直接处理SQL语句本身:
# 修正SQL列名 corrected_sql = func.args["sql"].replace("name", "product_name") # 执行修正后的SQL,获取真实查询结果 query_result = execute_query(corrected_sql)
2. 按正确格式构造函数响应
Part.from_function_response的response参数需要直接传入函数执行结果,无需额外嵌套content字段,且要与函数声明的返回结构一致:
# 构造符合要求的函数响应 function_response = vertexai.generative_models.Part.from_function_response( name=func.name, # 必须与模型调用的函数名完全一致(这里是execute_query) response={"result": query_result} # 匹配execute_query函数的返回字段 ) # 发送响应给模型 user_response = chat.send_message( vertexai.generative_models.Content( role="user", parts=[function_response] ) )
3. 优化方案:避免手动修正SQL
手动修正SQL不是长久方案,可让模型先调用describe_table获取products表的结构,再生成正确SQL:
- 当模型首次生成错误SQL时,触发
describe_table("products")获取字段信息 - 将表结构返回给模型,让模型自动修正SQL并重新发起
execute_query调用
关键注意事项
- 确保函数响应的数量与模型上一轮的函数调用数量完全对应(如果模型调用了1个函数,就返回1个响应)
- 函数响应的结构必须与
FunctionDeclaration中定义的返回类型严格匹配 - 聊天上下文必须连贯,每一轮的函数调用和响应要一一对应
内容的提问来源于stack exchange,提问作者Anna Bozhenko
相关产品推荐
相关产品推荐

