如何为AWS Bedrock中的meta.llama2-13b-chat-v1提供对话上下文
在AWS Bedrock上为Llama2 13B Chat提供对话上下文的正确方式
AWS Bedrock上的Llama2模型不会自动持久化会话历史,所有对话上下文都需要通过符合Meta官方定义的聊天格式拼接进Prompt中传递给模型。Bedrock的API没有单独的context参数,因为底层大语言模型本身是无状态的,会话上下文的维护需要由你的应用层来实现。
核心原理:Llama2对话格式规范
Llama2 Chat模型要求对话必须用特定标记包裹,模型才能识别多轮上下文关联,单轮及多轮对话的格式如下:
# 单轮对话 <s>[INST] 用户的问题 [/INST] # 多轮对话(按顺序拼接每轮内容) <s>[INST] 用户问题1 [/INST] 模型回答1 </s><s>[INST] 用户问题2 [/INST]
<s>:对话起始标记[INST]/[/INST]:包裹用户输入的标记</s>:单轮对话结束标记- 多轮对话需按「用户提问→模型回复」的顺序依次拼接,确保模型能关联上下文。
修改后的Go代码示例(支持会话上下文)
在你的原代码基础上,加入会话历史维护逻辑,每次调用模型前按规范拼接Prompt:
package main import ( "bufio" "encoding/json" "fmt" "os" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/bedrockruntime" ) type Llama2Request struct { Prompt string `json:"prompt"` MaxGenLength int `json:"max_gen_len,omitempty"` Temperature float64 `json:"temperature,omitempty"` } type Llama2Response struct { Generation string `json:"generation"` } func main() { mySession := session.Must(session.NewSession(&aws.Config{Region: aws.String("us-east-1")})) svc := bedrockruntime.New(mySession) modelId := "meta.llama2-13b-chat-v1" var conversationHistory string // 维护完整会话历史 fmt.Print("Initial Input: ") inputReader := bufio.NewReader(os.Stdin) for { input, err := inputReader.ReadString('\n') if err != nil { fmt.Printf("读取输入失败: %v\n", err) break } input = strings.TrimSpace(input) if input == "BREAK" { break } // 构建符合Llama2格式的Prompt var prompt string if conversationHistory == "" { // 第一轮对话,无需拼接历史 prompt = fmt.Sprintf("<s>[INST] %s [/INST]", input) } else { // 多轮对话:拼接历史内容 + 新提问 prompt = fmt.Sprintf("%s </s><s>[INST] %s [/INST]", conversationHistory, input) } body, err := json.Marshal(Llama2Request{ Prompt: prompt, MaxGenLength: 512, Temperature: 0.5, }) if err != nil { fmt.Printf("序列化请求失败: %v\n", err) break } req, resp := svc.InvokeModelRequest(&bedrockruntime.InvokeModelInput{ ModelId: &modelId, Body: body, }) if err := req.Send(); err != nil { fmt.Printf("调用模型失败: %v\n", err) break } var response Llama2Response if err := json.Unmarshal(resp.Body, &response); err != nil { fmt.Printf("解析响应失败: %v\n", err) break } fmt.Printf("模型回复: %s\n", response.Generation) // 更新会话历史:将当前轮的提问和回复加入历史 conversationHistory = fmt.Sprintf("%s %s", prompt, response.Generation) fmt.Print("下一个输入: ") } }
注意事项
- 上下文窗口限制:Llama2 13B Chat的上下文窗口为4096 tokens,当对话历史过长时需要做截断处理,避免超出模型输入上限。
- 格式严格性:必须严格遵循Meta定义的标记格式,否则模型可能无法正确识别上下文关联。
内容的提问来源于stack exchange,提问作者Jonah
相关产品推荐
相关产品推荐

