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

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 []

预期行为

模型应遵循以下逻辑序列调用工具:

  1. 调用get_item_id获取"XYZ"对应的ID
  2. 使用获取到的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:43:16