You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:35:56