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

