Bedrock服务InvokeModel调用报错及Retriever无响应问题求助
问题分析与解决方案
错误根源
ValueError:Bedrock服务抛出错误:调用InvokeModel操作时发生(ValidationException)错误:输入请求格式错误:#: 未找到必填键[messages],请重新格式化输入后重试。
这个错误的核心原因是你使用的Bedrock模型(如Anthropic Claude 3系列)要求输入必须遵循聊天消息格式(包含messages键),但当前代码的自定义prompt是纯文本模板,没有封装成模型要求的结构。此外,代码中存在冗余操作:RetrievalQA会自动通过retriever获取上下文并填充到prompt,手动调用retriever.get_relevant_documents再传入qa会导致格式冲突。
修正步骤与代码示例
1. 切换为聊天模型适配的Prompt格式
使用ChatPromptTemplate替代PromptTemplate,按照模型要求的角色消息结构定义prompt:
2. 删除冗余的上下文获取操作
RetrievalQA会自动处理上下文的检索与填充,无需手动获取后传入。
3. 确保LLM实例为聊天模型类型
使用ChatBedrock而非Bedrock类初始化模型,它会自动处理messages格式的请求封装。
修正后的完整代码
from langchain.chat_models import ChatBedrock from langchain.prompts import ChatPromptTemplate from langchain.chains import RetrievalQA def get_response(llm, vectorstore, question): # 定义适配聊天模型的prompt模板 prompt_template = ChatPromptTemplate.from_messages([ ("system", "请使用给定的上下文简洁回答问题。如果不知道答案,请直接说不知道,不要编造内容。"), ("human", "上下文:\n<context>\n{context}\n</context>\n问题:{question}") ]) # 初始化向量存储检索器 retriever = vectorstore.as_retriever( search_type="similarity", search_kwargs={"k": 5} ) # 创建RetrievalQA链 qa = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True, chain_type_kwargs={"prompt": prompt_template} ) # 直接传入问题,RetrievalQA自动处理上下文 response = qa({"query": question}) return response['result'] # 初始化ChatBedrock示例(根据你的模型调整model_id) llm = ChatBedrock( model_id="anthropic.claude-3-sonnet-20240229-v1:0", credentials_profile_name="your-aws-profile", model_kwargs={"temperature": 0.1} )
额外注意事项
- 确认LangChain版本≥0.1.0,避免版本兼容问题;
- 如果使用Claude 2.x模型,虽然支持纯文本prompt,但Bedrock API的最新规范推荐使用
messages格式,因此使用ChatBedrock更稳妥; - 检查AWS权限配置,确保Bedrock模型的InvokeModel权限正常。
内容的提问来源于stack exchange,提问作者DIVYANSH TRIVEDI
相关产品推荐
相关产品推荐

