如何强制AWS Bedrock Agent始终仅输出JSON格式结果?
针对你遇到的Bedrock Agent偶尔输出额外文本破坏JSON结构的问题,可通过以下几种方式强制其始终输出纯JSON:
强化指令的绝对约束
在Agent的系统指令中,用明确、无歧义的表述强制仅输出JSON,例如:你必须严格按照指定格式输出纯JSON内容,不得包含任何JSON以外的文字,包括解释、说明、问候、前缀或后缀。无论对话上下文如何,输出必须仅为符合语法的JSON对象/数组。
同时可以在指令末尾添加格式示例,对比正确与错误输出:
正确输出示例:
{"result": "xxx", "data": []}
错误输出示例:以下是结果:{"result": "xxx"}(禁止此类格式)自定义编排模板的输出规则
在Bedrock Agent的**编排模板(Orchestration Template)**中,修改最终输出环节的提示词,明确要求模型仅返回JSON。例如在模板的Final Response Generation部分添加:基于会话历史和知识库检索结果,生成严格符合要求的纯JSON响应,不得添加任何额外内容。
启用后处理的JSON提取逻辑
利用Bedrock Agent的后处理功能,添加自定义脚本提取有效JSON:- 在Agent配置中开启后处理
- 编写简单的正则匹配逻辑,例如使用Python的
re模块:import re import json def extract_json(response): # 匹配最外层的JSON结构 json_match = re.search(r'\{.*\}', response, re.DOTALL) if json_match: try: return json.loads(json_match.group()) except json.JSONDecodeError: # 若匹配到的内容无效,返回预设的错误JSON return {"error": "Invalid JSON format"} return {"error": "No valid JSON found"}
该脚本会过滤掉JSON前后的额外文本,只保留有效结构化内容。
切换至结构化输出依从性更高的模型
选择对格式化输出支持更好的基础模型,例如Anthropic Claude 3系列、Amazon Titan Text Premier。这类模型对指令的结构化约束响应更稳定,同时可将模型参数temperature设置为0,降低输出随机性,减少额外文本的产生。会话上下文的重复约束
由于你的应用是无状态架构,依赖Agent的会话记忆,可在每次调用Agent时,在会话历史的系统提示部分追加格式要求,确保每轮对话都明确告知模型必须输出纯JSON,避免因上下文漂移导致的格式违规。
内容的提问来源于stack exchange,提问作者Ibrahim Masalha

