AWS Bedrock上LLaMA 3.1 70B模型工具调用行为异常求助
AWS Bedrock结合LangChain使用LLaMA 3.1 70B Instruct的智能体函数调用问题
遇到的问题
- 工具调用不一致:即便提供了详细函数描述,相似查询下模型仍会无规律地选择错误工具
- 函数调用数量受限:查询需要时,模型调用工具数量最多不超过3个
- 调用序列异常:无法遵循逻辑调用顺序,例如跳过依赖数据获取步骤(直接调用详情接口而不先获取Item ID)
相关代码
from langchain_aws import ChatBedrock model = ChatBedrock( model_id="meta.llama3-1-70b-instruct-v1:0", verbose=True, beta_use_converse_api=True, model_kwargs={ "temperature": 0.05, "stopSequences": ["Observation:", "Action:"] }, disable_streaming='tool_calling' ) def get_item_id(item_name): """Retrieve item ID based on name.""" if "abc" in item_name.lower(): return 1 elif "xyz" in item_name.lower(): return 2 return 0 def get_item_details(item_id): """Retrieve details of an item.""" if item_id == 1: return {"name": "ABC Item", "price": 100} elif item_id == 2: return {"name": "XYZ Item", "price": 200} return {} def get_item_reviews(item_id): """Retrieve reviews of an item.""" if item_id == 1: return ["Good quality", "Value for money"] elif item_id == 2: return ["Highly recommended", "Durable"] return []
预期行为
模型应遵循以下逻辑序列调用工具:
- 调用
get_item_id获取"XYZ"对应的ID - 使用获取到的ID调用
get_item_details和get_item_reviews
实际行为
- 部分查询场景下模型能按正确序列调用工具,但部分场景会跳过
get_item_id,直接传入无效参数(如{'item_id': 'get_item_id', 'item_name': 'XYZ'})调用get_item_details - 最多仅调用2个工具,无法满足复杂查询的多工具调用需求
- 已在系统提示中明确流程并提供示例,但模型仍难以处理复杂工作流中的多函数调用
解决建议
1. 优化工具描述与系统提示
- 给每个函数补充明确的参数约束和依赖关系,比如在
get_item_details的描述中标注:必须先调用get_item_id获取有效的数字类型item_id,禁止传入非数字参数 - 系统提示中用编号强化工作流优先级,例如:
步骤1:调用get_item_id获取目标商品ID;步骤2:用该ID调用get_item_details;步骤3:用该ID调用get_item_reviews - 增加错误示例,明确说明
错误操作:跳过get_item_id直接调用get_item_details
2. 调整模型参数与API配置
- 将
temperature调至0.0,进一步降低模型输出的随机性 - 尝试关闭
beta_use_converse_api(设为False),使用LangChain原生工具调用流程测试,避免Converse API的格式约束干扰 - 移除
stopSequences中的"Action:"和"Observation:",这类截断词可能打断模型生成完整的工具调用序列
3. 使用LangChain结构化工具与智能体框架
- 用
StructuredTool封装函数,明确参数类型(如指定item_id为int),帮助模型识别参数要求:from langchain.tools import StructuredTool get_item_id_tool = StructuredTool.from_function(get_item_id) get_item_details_tool = StructuredTool.from_function(get_item_details) get_item_reviews_tool = StructuredTool.from_function(get_item_reviews) - 采用
Plan-and-Execute或ReAct智能体框架,这类框架会强制模型先规划步骤再执行,更适配复杂工作流:from langchain.agents import AgentExecutor, create_react_agent from langchain_core.prompts import PromptTemplate prompt = PromptTemplate.from_template(""" 严格按照以下步骤处理用户查询: 1. 首先调用get_item_id获取目标商品的ID 2. 使用获取到的ID调用get_item_details获取商品详情 3. 使用获取到的ID调用get_item_reviews获取商品评价 不得跳过任何步骤。 {tools} {agent_scratchpad} """) agent = create_react_agent(model, [get_item_id_tool, get_item_details_tool, get_item_reviews_tool], prompt) agent_executor = AgentExecutor(agent=agent, tools=[get_item_id_tool, get_item_details_tool, get_item_reviews_tool], verbose=True)
4. 增加工具调用校验与重试机制
- 在工具中添加参数校验逻辑,若参数无效则返回明确错误提示,引导模型修正调用:
def get_item_details(item_id): """Retrieve details of an item. Must call get_item_id first to get valid numeric item_id.""" if not isinstance(item_id, int) or item_id not in [1,2]: return "错误:无效的item_id,请先调用get_item_id获取有效的数字ID" if item_id == 1: return {"name": "ABC Item", "price": 100} elif item_id == 2: return {"name": "XYZ Item", "price": 200} return {} - 配置
AgentExecutor的重试机制,当工具调用失败时自动重新规划执行步骤
内容的提问来源于stack exchange,提问作者Nilesh Malode
相关产品推荐
相关产品推荐

