首页 > 其他分享 >Golang试用阿里通义千问大语言模型

Golang试用阿里通义千问大语言模型

时间:2024-07-29 22:56:25浏览次数:18  
标签:err string nil 通义 struct Golang json type 千问

一、控制台配置通义千问密匙

官方操作指南地址

控制台地址

注意:一个密匙申请之后,官方给了一个月期限共计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)
}

同时自己玩的时候发现一个比较明显的缺点,如果你问简单问题响应在几百毫秒之内,涉及到复杂一点或者多轮对话响应时间明显增加。

要做特定业务方向的话得进行模型定制以及自己喂数据训练(仁者见仁,智者见智了)

 

标签:err,string,nil,通义,struct,Golang,json,type,千问
From: https://www.cnblogs.com/FCmmmmmm/p/18331182

相关文章

  • 【Golang 面试 - 进阶题】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • 【Golang 面试 - 进阶题】每日 3 题(四)
     ✍个人博客:Pandaconda-CSDN博客......
  • 用依赖倒置和控制反转,突破Golang循环调用限制之后的思考
    在软件开发中,随着项目规模的扩大和业务逻辑的复杂化,重构代码变得越来越重要。本文将介绍如何在既有代码基础上,通过依赖倒置(DIP)和控制反转(IoC),实现新增加的代码可以循环引用到服务层的代码。然后,我们将探讨接口隔离、设计小而清晰的接口和包,以及共同依赖原则等内容。包引用时的......
  • 使用Chainlit接入通义千问快速实现一个多模态的对话应用
    开通灵识服务首先需要到阿里云-模型服务灵积开通账户,获得apiKey模型服务灵积https://dashscope.aliyun.com/进入控制台,在API-KEY管理里,创建一个新的API-KEY,然后保存起来,后面会用到。模型服务灵积服务所有API文档地址https://help.aliyun.com/zh/dashscope/developer......
  • 【Golang 面试 - 进阶题】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......
  • golang 数组转为链表 - 正序和逆序
    有时候,有这样的场景,我们需要就给定数组将其转为一个链表,通常的思路有两种:正序逆序以下是具体的代码实现和测试函数:packagemainimport("fmt""testing")typelistNodestruct{next*listNodevalint}//正序遍历构建链表//通过一个虚拟头结点,不......
  • Golang 高性能 Websocket 库 gws 使用与设计(一)
    前言大家好这里是,白泽,这期分析一下golang开源高性能websocket库gws。视频讲解请关注......
  • 【golang设计模式】—— 外观模式
    模式定义外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调......
  • Golang常见的并发模式
    Golang常见的并发模式Go语言最吸引人的地方是它内建的并发支持首先要明确一个概念:并发不是并行。并发更关注的是程序的设计层面,并发的程序完全是可以顺序执行的,只有在真正的多核CPU上才可能真正地同时运行。并行更关注的是程序的运行层面,并行一般是简单的大量重复,例如GPU......
  • 【golang设计模式】—— 简单工厂模式
    模式定义简单工厂模式(SimpleFactoryPattern):又称为静态工厂方法(StaticFactoryMethod)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式结构工......