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

基于LangChain Bedrock的RAG对话AI工具绑定问题

LangChain Bedrock绑定工具的解决办法

方案一:换用ChatBedrock类(最省心)

你当前用的Bedrock类是针对纯文本补全模型的,没有bind_tools方法。直接换成ChatBedrock类就行,它专门适配聊天模型,支持工具绑定:

from langchain.chat_models import ChatBedrock

# 替换原来的Bedrock初始化代码
llm = ChatBedrock(
    model_id="anthropic.claude-v2:1",
    client=bedrock_client,
    model_kwargs={'max_tokens': 512}  # 注意参数名从max_tokens_to_sample改成max_tokens
)

# 现在就能正常绑定工具了
llm_with_tools = llm.bind_tools(tools)

之后要调整你的检索逻辑,因为RetrievalQA默认和纯文本LLM搭配,绑定工具后建议用Agent类结合检索能力,比如RetrievalQAWithSourcesChain或者自定义Agent,让LLM自主决定是用检索到的信息还是调用工具。

方案二:手动在Prompt里定义工具+解析输出

如果不想换类,就手动把工具信息塞进Prompt,然后解析LLM的输出来触发工具调用:

第一步:修改Prompt模板,加上工具说明

把工具的名称、功能、参数都写进系统提示里,同时约定好工具调用的格式,方便后续解析:

def get_response(llm, vectorstore, question, tools ):
    # 先把工具转成可读的描述字符串
    tools_desc = "\n".join([f"- {tool.name}: {tool.description},参数格式:{tool.args}" for tool in tools])
    
    # 改写Prompt模板,加入工具说明和调用格式要求
    prompt_template = """
    System: 我是助手Alex,要结合FAQ、用户信息和下面的工具回答问题:
    {tools_desc}
    如果需要调用工具,必须严格按这个格式输出:
    <tool_call>
    {{"name": "工具名", "parameters": {{"参数键": "参数值"}}}}
    </tool_call>
   不需要调用工具的话直接回答就行。

    另外,我得从用户信息里提取firstName和lastName当称呼;用currencyVerificationData查用户货币账户数量和审批状态(VALID是已通过,其他状态要让用户补材料);用bankFilledData取受益人银行名和账号;用accountDetails拿账户详情。
    
    Human: 按给定上下文简洁回答,不知道就说不知道,别瞎编。需要澄清就提问,回答别提json,只用提取到的值,还要带上用户姓名。
    <context>
    {context}
    </context>
    
    Question: {question}

    Assistant:"""
    
    PROMPT = PromptTemplate(
        template=prompt_template,
        input_variables=["context", "question", "tools_desc"]
    )

第二步:解析LLM输出,触发工具调用

拿到LLM的响应后,检查有没有约定的<tool_call>标签,有的话就解析参数调用对应工具,再把工具结果喂给LLM生成最终回答:

# 先做检索拿上下文
    retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 5})
    context_docs = retriever.get_relevant_documents(question)
    context = "\n".join([doc.page_content for doc in context_docs])
    
    # 生成LLM输入并获取响应
    inputs = {"context": context, "question": question, "tools_desc": tools_desc}
    raw_response = llm(PROMPT.format(**inputs))
    
    # 检查是否需要调用工具
    if "<tool_call>" in raw_response:
        # 提取工具调用内容
        call_str = raw_response.split("<tool_call>")[1].split("</tool_call>")[0].strip()
        try:
            call_data = json.loads(call_str)
            tool_name = call_data["name"]
            params = call_data["parameters"]
            
            # 找到对应工具并执行
            for tool in tools:
                if tool.name == tool_name:
                    tool_result = tool.run(params)
                    # 把工具结果传给LLM生成最终回答
                    final_prompt = f"用这个工具返回的结果回答问题:{tool_result}\n问题:{question}"
                    final_answer = llm(final_prompt)
                    return final_answer
        except Exception:
            # 解析失败就返回原响应
            return raw_response
    else:
        # 不用工具直接返回
        return raw_response

内容的提问来源于stack exchange,提问作者DaviesTobi alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:13:21