Golang試用阿里通義千問大語言模型

FCmmmmmm發表於2024-07-29

一、控制檯配置通義千問密匙

官方操作指南地址

控制檯地址

注意:一個密匙申請之後,官方給了一個月期限共計100萬條Token的額度

二、程式碼階段

1、DashScopRequest 結構體

type EngineRole string

const (
    EngineRoleUser      EngineRole = "user"
    EngineRoleSystem    EngineRole = "system"
    EngineRoleAssistant EngineRole = "assistant"
    EngineRoleTool      EngineRole = "tool"
)
type Message struct {
    Name      string              `json:"name"`
    Role      EngineRole          `json:"role"`
    Content   string              `json:"content"`
    ToolCalls interface{}         `json:"tool_calls"`
}

type Input struct {
    Prompt   string            `json:"prompt"`
    Messages []Message         `json:"messages"`
    History  map[string]string `json:"history"`
}

type Parameter struct {
    ResultFormat      string      `json:"result_format"`      //用於指定返回結果的格式
    Seed              *int64      `json:"seed"`               //生成時使用的隨機數種子
    MaxTokens         *int64      `json:"max_tokens"`         //用於限制模型生成token的數量
    TopP              *float64    `json:"top_p"`              //生成時,核取樣方法的機率閾值。
    TopK              *int64      `json:"top_k"`              //生成時,取樣候選集的大小。
    RepetitionPenalty *float64    `json:"repetition_penalty"` //用於控制模型生成時連續序列中的重複度
    PresencePenalty   *float64    `json:"presence_penalty"`   //使用者控制模型生成時整個序列中的重複度
    Temperature       *float64    `json:"temperature"`        //用於控制隨機性和多樣性的程度。
    Stop              interface{} `json:"stop"`               //string型別當模型將要生成指定的stop詞語時停止。
    EnableSearch      *bool       `json:"enable_search"`      //啟用網際網路搜尋
    //IncrementalOutput bool        `json:"incremental_output"` //控制在流式輸出模式下是否開啟增量輸出
    //Tools             interface{} `json:"tools"`
    //ToolChoice     interface{} `json:"tool_choice"`
}

type DashScopeRequest struct {
    Model      string    `json:"model"`
    Input      Input     `json:"input"`
    Parameters Parameter `json:"parameters"`
}

2、DashResponse結構體

type Usage struct {
    TotalTokens  int `json:"total_tokens"`
    OutputTokens int `json:"output_tokens"`
    InputTokens  int `json:"input_tokens"`
}

type Choice struct {
    FinishReason string  `json:"finish_reason"`
    Message      Message `json:"message"`
}

type Output struct {
    Text         string   `json:"text"`
    FinishReason string   `json:"finish_reason"`
    Choices      []Choice `json:"choices"`
}

type DashScopeResponse struct {
    Output    Output `json:"output"`
    Usage     Usage  `json:"usage"`
    RequestId string `json:"request_id"`
}

3、DashScopErr 結構體

type DashScopeErr struct {
    Code      string `json:"code"`
    Message   string `json:"message"`
    RequestID string `json:"request_id"`
}

4、核心方法

var DashScopeUrl = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
func TongYiHttp(ctx context.Context, request DashScopeRequest) (*DashScopeResponse, *DashScopeErr, error) {
    // 構建請求
    payload, err := json.Marshal(request)
    if err != nil {
        return nil, nil, err
    }
    req, err := http.NewRequest("POST", DashScopeUrl, bytes.NewBuffer(payload))
    if err != nil {
        return nil, nil, err
    }

    // 設定請求頭部
    req.Header.Set("Authorization", "YOUR API KEY") //就是你的API-KEY
    req.Header.Set("Content-Type", "application/json")

    // 傳送請求
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        return nil, nil, err
    }
    defer resp.Body.Close()

    // 檢查HTTP響應狀態碼是否為200
    if resp.StatusCode != http.StatusOK {
        var errResp DashScopeErr
        err = json.NewDecoder(resp.Body).Decode(&errResp)
        if err != nil {
            return nil, nil, err
        }
        return nil, &errResp, nil
    }

    // 讀取響應資料
    response := DashScopeResponse{}
    err = json.NewDecoder(resp.Body).Decode(&response)
    if err != nil {
        return nil, nil, err
    }
    return response, nil, nil
}

三、呼叫測試(多輪對話),我使用了一個預設的大語言模型

func TestDashScope(t *testing.T) {
    // 構建請求資料
    ctx := context.Background()
    request := DashScopeRequest{
        Model: "qwen-turbo",
        Input: Input{
            Messages: []Message{
                {
                    Role:    EngineRoleUser,
                    Content: "1+1=?",
                },
                {
                    Role:    EngineRoleAssistant,
                    Content: "2",
                },
                {
                    Role:    EngineRoleUser,
                    Content: "2+1=?",
                },
                {
                    Role:    EngineRoleAssistant,
                    Content: "3",
                },
                {
                    Role:    EngineRoleUser,
                    Content: "幫我總結我們之間的對話",
                },
            },
        },
        Parameters: Parameter{
            ResultFormat: "message",
        },
    }

    tyResp, _, _ := TongYiHttp(ctx, request)
    fmt.Println(tyResp.Output)
}

同時自己玩的時候發現一個比較明顯的缺點,如果你問簡單問題響應在幾百毫秒之內,涉及到複雜一點或者多輪對話響應時間明顯增加。

要做特定業務方向的話得進行模型定製以及自己喂資料訓練(仁者見仁,智者見智了)

相關文章