ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【Bug已解决】How to pass system prompt to claude 3 haiku on AWS Bedrock Using JavaScript SDK V3 解决方案

【Bug已解决】How to pass system prompt to claude 3 haiku on AWS Bedrock Using JavaScript SDK V3 解决方案 【Bug已解决】How to pass system prompt to claude 3 haiku on AWS Bedrock Using JavaScript SDK V3 解决方案一、现象长什么样你用 AWS SDK for JavaScript v3aws-sdk/client-bedrock-runtime的ConverseCommand调 Claude 3 Haiku想传系统提示却遇到系统提示被忽略模型像没收到指令你把system写在messages第一条user消息里但 Haiku 行为不对或你把system当字符串传给ConverseCommand的system参数报校验错误你不确定 Haiku 和 Sonnet 在 Bedrock 上是否用同一套system传法是的一样报错信息指向system字段格式不对。一句话在 JS SDK v3 的ConverseCommand里system是一个顶层参数**值必须是文本块数组[{ text: ... }]不是字符串、也不是messages里的一条。Haiku 与 Sonnet 在 Bedrock 上的system传法完全一致。**二、背景ConverseCommand的input结构与模型无关Claude 系列通用{ modelId: anthropic.claude-3-5-haiku-20241022-v1:0, // Haiku system: [{ text: 你是简洁的助手 }], // 顶层数组必填格式 messages: [{ role: user, content: [{ text: hi }] }], inferenceConfig: { maxTokens: 256 }, }要点system是ConverseCommand的顶层字段不是messages[0]它的值必须是数组元素是{ text: ... }文本块也可含cachePoint写成字符串system: 你是助手会被校验拒绝HaikuClaude 3 Haiku完全遵循此格式与 Sonnet 无差异。三、根因根因是**system位置/格式错**// 错误 1system 当字符串 const cmd new ConverseCommand({ modelId, system: 你是助手, messages }); // 错误 2system 塞进 messages 第一条 user const cmd new ConverseCommand({ modelId, messages: [ { role: user, content: [{ text: system: 你是助手 }] }, // 不应这样 { role: user, content: [{ text: hi }] }, ], }); // 正确 const cmd new ConverseCommand({ modelId: anthropic.claude-3-5-haiku-20241022-v1:0, system: [{ text: 你是简洁的助手 }], messages: [{ role: user, content: [{ text: hi }] }], inferenceConfig: { maxTokens: 256 }, });四、最小可运行复现import { BedrockRuntimeClient, ConverseCommand } from aws-sdk/client-bedrock-runtime; const client new BedrockRuntimeClient({ region: us-west-2 }); const command new ConverseCommand({ modelId: anthropic.claude-3-5-haiku-20241022-v1:0, // system 顶层文本块数组 system: [{ text: 你是一名只输出 JSON 的助手不要解释。 }], messages: [{ role: user, content: [{ text: 给我北京、上海、广州的人口JSON 数组 }], }], inferenceConfig: { maxTokens: 300 }, }); const res await client.send(command); const text res.output.message.content[0].text; console.log(text); // 应遵守 system只输出 JSON运行后模型会遵守 system 提示只输出 JSON证明system顶层数组生效。五、解决方案第一层最小直接修复最小修复是把system作为顶层数组传给ConverseCommandconst command new ConverseCommand({ modelId: anthropic.claude-3-5-haiku-20241022-v1:0, system: [{ text: 你的系统提示 }], // 顶层数组 messages: [{ role: user, content: [{ text: ... }] }], inferenceConfig: { maxTokens: 256 }, });若用invoke_model原生 bodysystem同样是 body 里的数组const body { anthropic_version: bedrock-2023-05-31, max_tokens: 256, system: [{ text: 你的系统提示 }], // 数组 messages: [{ role: user, content: [{ text: hi }] }], };六、解决方案第二层结构化改进把Haiku system 构造做成策略集中保证格式Haiku 与 Sonnet 通用from dataclasses import dataclass, field from typing import Dict, List dataclass(frozenTrue) class BedrockHaikuSystemPolicy: Bedrock system 提示策略Haiku/Sonnet 通用。 规则 - system 是顶层文本块数组 - 支持多段 system多个 {text} 块 - 生成合法 ConverseCommand input def system_blocks(self, prompts: List[str]) - List[Dict]: return [{text: p} for p in prompts if p] def converse_input(self, *, model_id: str, prompts: List[str], user_text: str, max_tokens: int 256) - Dict: if not prompts: raise ValueError(system 提示不能为空) return { modelId: model_id, system: self.system_blocks(prompts), messages: [{role: user, content: [{text: user_text}]}], inferenceConfig: {maxTokens: max_tokens}, } def demo() - None: policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idanthropic.claude-3-5-haiku-20241022-v1:0, prompts[你是简洁助手, 只输出要点], user_text总结一下云计算, ) assert inp[system] [{text: 你是简洁助手}, {text: 只输出要点}] print(Haiku system 构造 OK) if __name__ __main__: demo()七、解决方案第三层断言 / CI 守护import pytest from your_module import BedrockHaikuSystemPolicy def test_system_is_array(): policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idanthropic.claude-3-5-haiku-20241022-v1:0, prompts[x], user_texty) assert isinstance(inp[system], list) assert inp[system][0][text] x def test_multi_system_blocks(): policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idm, prompts[a, b], user_texty) assert len(inp[system]) 2 def test_empty_prompt_rejected(): policy BedrockHaikuSystemPolicy() with pytest.raises(ValueError): policy.converse_input(model_idm, prompts[], user_texty) def test_model_id_haiku(): policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idanthropic.claude-3-5-haiku-20241022-v1:0, prompts[x], user_texty) assert haiku in inp[modelId] def test_inference_config_present(): policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idm, prompts[x], user_texty, max_tokens128) assert inp[inferenceConfig][maxTokens] 128 def test_user_in_messages(): policy BedrockHaikuSystemPolicy() inp policy.converse_input( model_idm, prompts[x], user_texthi) assert inp[messages][0][role] userCI 里加一条构造 Haiku 请求后断言system是顶层数组、非空避免 system 被忽略或校验失败。八、排查清单system是否放在ConverseCommand的顶层而非 messages 里system是否是文本块数组[{text:...}]不是字符串Haiku 与 Sonnet 的 system 传法是否一致一致都用顶层数组。是否误把 system 写成 messages 第一条 user那不会当 system 生效。是否用inferenceConfig.maxTokens而非顶层max_tokens多段 system 是否拆成多个{text}块九、小结用 JS SDK v3ConverseCommand给 Claude 3 Haiku 传系统提示被忽略/报错根因是system位置或格式错——它应是命令的顶层参数、值为文本块数组如[{text:...}]不是字符串也不是 messages 第一条。Haiku 与 Sonnet 在 Bedrock 上格式完全一致。最小修复是把system作为顶层数组传入结构化做法是抽成BedrockHaikuSystemPolicy统一构造最后用 pytest 守护system顶层、非空数组确保系统提示生效。
返回列表