文档

Go SDK(旧版)

更新时间:
一键部署

本文主要描述通过Go SDK调用阿里云百炼云服务的使用方式。Go SDK支持1.15以上版本.

重要

本文档适用于使用Go SDK 1.1.0及以下的旧版本,最新版本请参照文档安装SDK

获取和安装SDK

require github.com/aliyun/alibabacloud-bailian-go-sdk v1.1.0

2. 接口说明

2.1 公共参数

所有接口调用需要设置公共参数Access Key、Access Secret Key和Agent Key, 获取方式请参考Access Key、Access Secret Key、Agent Key、AppId获取方式

2.2 生成文本

文本生成接口输入对应的参数后,阿里云百炼处理所有的逻辑,将最终的结果返回。

2.2.1请求参数说明

文本生成请求参数。

参数

类型

必填

描述

RequestId

string

请求唯一标识

SessionId

string

上下文唯一标识

AppId

string

阿里云百炼应用ID, 请参考Completion API文档(旧版)方式获取。

Prompt

string

提示词

TopP

float32

生成过程中核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。默认是0.2

Stream

bool

是否流式输出

HasThoughts

bool

是否输出模型推理中间结果

BizParams

map

插件使用的业务参数,调用api插件是会直接透传

DocReferenceType

string

启用文档检索后,文档引用类型, 取值包括:simple | indexed

simple: 返回文档引用信息,但文本中不包含文档角标的索引位置

indexed: 返回文档引用信息,文本中包含文档角标的索引位置

DocTagIds

list[int]

文档标签id

Prameters.TopK

int32

生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。默认不传递该参数,取值为None或当top_k大于100时,表示不启用top_k策略,此时,仅有top_p策略生效。

Prameters.Seed

int32

生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234

Prameters.UseRawPrompt

bool

是否使用原始prompt

Prameters.Temperature

float

采样温度在0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定。我们通常建议修改temperature或top_p,但不建议两者都修改。

Prameters.MaxTokens

int32

模型生成的token的最大数量。输入token数量和生成token数量的总长度受模型上下文长度的限制。

History.User

string

对话历史的用户消息

History.Bot

string

对话历史的大模型消息

2.2.2 响应结果说明

文本生成的响应参数。

字段名

字段类型

描述

Success

bool

请求是否成功, true: 是, false: 否

Code

int

失败错误码,0表示成功,其他值则表示调用出错

Message

str

失败错误消息,仅当失败时有错误消息

RequestId

str

请求的唯一标识

Data

Dict

文本生成结果

Data: 文本生成的内容。

字段名

字段类型

描述

ResponseId

str

响应唯一标识

SessionId

str

上下文唯一标识

Text

str

最终输出结果

Thoughts

list[Thought]

思考过程

DocReferences

list[DocReference]

文档引用信息

Usage

list[Usage]

应用级别的token消耗

Thought: 推理过程数据格式定义

字段名

字段类型

描述

Thought

str

LLM思考结果

ActionType

str

LLM返回的执行步骤类型, api: 执行api插件, response: 返回最终结果

ActionName

str

执行的action名称, 如文档检索

Action

str

执行的步骤

ActionInputStream

str

入参的流式结果

ActionInput

str

插件的输入参数

Response

str

LLM返回的结果

Observation

str

插件的返回结果

DocReference: 文档引用数据格式定义

字段名

字段类型

描述

IndexId

string

引用的角标索引

Title

string

引用的文档标题

DocId

string

引用的文档Id

DocName

string

引用的文档名

DocUrl

string

文档下载地址

Text

string

引用的文档内容

BizId

string

业务关联标识

Usage: 用量数据格式定义

参数

类型

描述

InputTokens

Integer

输出文本消耗的token

OutputTokens

Integer

输出文本消耗的token

2.2.3 代码示例

import (
	"encoding/json"
	client "github.com/aliyun/alibabacloud-bailian-go-sdk/client"
	"github.com/google/uuid"
	"log"
	"os"
	"strings"
	"time"
)

func TestCreateCompletion() {
	accessKeyId := os.Getenv("ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")

	agentKey := os.Getenv("AGENT_KEY")
	appId := os.Getenv("APP_ID")

	//尽量避免多次初始化
	tokenClient := client.AccessTokenClient{AccessKeyId: &accessKeyId, AccessKeySecret: &accessKeySecret, AgentKey: &agentKey}
	token, err := tokenClient.GetToken()
	if err != nil {
		log.Printf("%v\n", err)
		return
	}

	cc := client.CompletionClient{Token: &token}
	prompt := "帮我生成一篇200字的文章,描述一下春秋战国的政治、军事和经济"

	request := &client.CompletionRequest{}
	request.SetAppId(appId)
	request.SetPrompt(prompt)

	response, err := cc.CreateCompletion(request)
	if err != nil {
		log.Printf("%v\n", err)
		return
	}

	if !response.Success {
		log.Printf("failed to create completion, requestId: %s, code: %s, message: %s\n",
			response.GetRequestId(), response.GetCode(), response.GetMessage())
		return
	}

	log.Printf("requestId: %s, text : %s", response.GetRequestId(), response.GetData().GetText())
	if response.GetData().GetUsage() != nil && len(response.GetData().GetUsage()) > 0 {
		usage := response.GetData().GetUsage()[0]
		log.Printf(", inputTokens: %d, outputTokens: %d\n", usage.GetInputTokens(), usage.GetOutputTokens())
	}
}

2.2.4 其他参数调用示例

import (
	"encoding/json"
	client "github.com/aliyun/alibabacloud-bailian-go-sdk/client"
	"github.com/google/uuid"
	"log"
	"os"
	"strings"
	"testing"
	"time"
)

func TestCreateCompletionWithParams() {
	accessKeyId := os.Getenv("ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")

	agentKey := os.Getenv("AGENT_KEY")
	appId := os.Getenv("APP_ID")

	//尽量避免多次初始化
	tokenClient := client.AccessTokenClient{AccessKeyId: &accessKeyId, AccessKeySecret: &accessKeySecret, AgentKey: &agentKey}
	token, err := tokenClient.GetToken()
	if err != nil {
		log.Printf("%v\n", err)
		return
	}

	cc := client.CompletionClient{Token: &token}

	//设置超时时间
	cc.SetTimeout(30 * time.Second)

	prompt := "云南近5年GNP总和是多少"

	request := &client.CompletionRequest{}
	request.SetAppId(appId)
	request.SetPrompt(prompt)

	//设置模型参数topP的值
	request.SetTopP(0.2)

	//开启历史上下文, sessionId需要采用uuid保证唯一性, 后续传入相同sessionId,百炼平台将自动维护历史上下文
	sessionId := strings.ReplaceAll(uuid.New().String(), "-", "")
	request.SetSessionId(sessionId)

	//设置历史上下文, 由调用侧维护历史上下文, 如果同时传入sessionId和history, 优先使用调用者管理的对话上下文
	message1 := &client.ChatQaMessage{User: "我想去北京", Bot: "北京的天气很不错"}
	message2 := &client.ChatQaMessage{User: "北京有什么旅游景点", Bot: "北京有故宫、天坛、长城等"}
	chatHistory := []*client.ChatQaMessage{message1, message2}
	request.SetHistory(chatHistory)

	//设置模型参数topK,seed, temperature和max tokens
	modelParameter := &client.CompletionRequestModelParameter{}
	//设置模型参数topK
	modelParameter.SetTopK(50)
	//设置模型参数seed
	modelParameter.SetSeed(2222)
	//设置模型参数temperature
	modelParameter.SetTemperature(0.3)
	//设置模型参数max tokens
	modelParameter.SetMaxTokens(20)
	//是否使用原始prompt
	modelParameter.SetUseRawPrompt(true)
	request.SetParameters(modelParameter)

	//设置文档标签tagId,设置后,文档检索召回时,仅从tagIds对应的文档范围进行召回
	request.SetDocTagIds([]int64{100, 101})

	//返回文档检索的文档引用数据
	request.SetDocReferenceType(client.DocReferenceTypeSimple)

	//自然语言转sql调用示例
	sqlSchema := "{" +
		"    \"sqlInput\": {" +
		"      \"synonym_infos\": \"国民生产总值: GNP|Gross National Product\"," +
		"      \"schema_infos\": [" +
		"        {" +
		"          \"columns\": [" +
		"            {" +
		"              \"col_caption\": \"地区\"," +
		"              \"col_name\": \"region\"" +
		"            }," +
		"            {" +
		"              \"col_caption\": \"年份\"," +
		"              \"col_name\": \"year\"" +
		"            }," +
		"            {" +
		"              \"col_caption\": \"国民生产总值\"," +
		"              \"col_name\": \"gross_national_product\"" +
		"            }" +
		"          ]," +
		"          \"table_id\": \"t_gross_national_product_1\"," +
		"          \"table_desc\": \"国民生产总值表\"" +
		"        }" +
		"      ]" +
		"    }" +
		"  }"
	data := make(map[string]interface{})
	err = json.Unmarshal([]byte(sqlSchema), &data)
	if err != nil {
		log.Printf("failed to parse sql schema, json: %s, err: %v\n", sqlSchema, err)
		return
	}
	request.SetBizParams(&data)

	//调用文本生成接口
	response, err := cc.CreateCompletion(request)
	if err != nil {
		log.Printf("%v\n", err)
		return
	}

	if !response.Success {
		log.Printf("failed to create completion, requestId: %s, code: %s, message: %s\n", response.GetRequestId(),
			response.GetCode(), response.GetMessage())
		return
	}

	log.Printf("requestId: %s, text: %s\n", response.GetRequestId(), response.GetData().GetText())
}

2.2.5 流式响应调用示例

import (
	"encoding/json"
	client "github.com/aliyun/alibabacloud-bailian-go-sdk/client"
	"github.com/google/uuid"
	"log"
	"os"
	"strings"
	"time"
)

func TestCreateStreamCompletion() {
	accessKeyId := os.Getenv("ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")

	agentKey := os.Getenv("AGENT_KEY")
	appId := os.Getenv("APP_ID")

	//尽量避免多次初始化
	tokenClient := client.AccessTokenClient{AccessKeyId: &accessKeyId, AccessKeySecret: &accessKeySecret, AgentKey: &agentKey}
	token, err := tokenClient.GetToken()
	if err != nil {
		log.Printf("%v\n", err)
		return
	}

	cc := client.CompletionClient{Token: &token}
	prompt := "帮我生成一篇500字的文章,描述一下春秋战国的政治、军事和经济"

	request := &client.CompletionRequest{}
	request.SetAppId(appId)
	request.SetPrompt(prompt)

	response, err := cc.CreateStreamCompletion(request)
	if err != nil {
		log.Printf("failed to create completion, err: %v\n", err)
		return
	}

	for result := range response {
		if !result.Success {
			log.Printf("get result with error, requestId: %s, code: %s, message: %s\n", result.GetRequestId(),
				result.GetCode(), result.GetMessage())
		} else {
			log.Printf("requestId: %s, text: %s\n", result.GetRequestId(), result.GetData().GetText())
		}
	}
}

2.3 创建文本向量

通过阿里云百炼,将文本内容转换为向量数据。

2.3.1 请求参数说明

文本生成请求参数。

参数

类型

必填

描述

Input

List[str]

文本内容数组

TextType

string

向量化类型,包括query和document。

query: 用来检索召回

document: 用来聚类、分类

2.3.2 响应结果说明

文本生成的结果。

参数

类型

描述

Success

bool

请求是否成功, true: 是, false: 否

Code

string

失败错误码,0表示成功,其他值则表示调用出错

Message

string

失败错误消息,仅当失败时有错误消息

RequestId

string

请求的唯一标识

Data

map

文本生成结果

Data

Embeddings

List[Embeddings]

embeddings列表

Embeddings

Embedding

List[float]

向量数据

TextIndex

int32

向量数据的索引

2.3.3 代码示例

import (
	"encoding/json"
	"fmt"
	apiClient "github.com/alibabacloud-go/bailian-20230601/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	client "github.com/aliyun/alibabacloud-bailian-go-sdk/client"
	"github.com/google/uuid"
	"os"
	"strings"
)

func TestCreateEmbeddings(t *testing.T) {
	accessKeyId := os.Getenv("ACCESS_KEY_ID")
	accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
	agentKey := os.Getenv("AGENT_KEY")
	endpoint := "bailian-pre.cn-hangzhou.aliyuncs.com"

	config := &openapi.Config{AccessKeyId: &accessKeyId,
		AccessKeySecret: &accessKeySecret,
		Endpoint:        &endpoint}

	openapiClient, err := apiClient.NewClient(config)
	if err != nil {
		fmt.Printf("failed to new client, err: %v\n", err)
		return
	}

	request := &apiClient.CreateTextEmbeddingsRequest{AgentKey: &agentKey}
	text := "今天天气怎么样"
	request.SetInput([]*string{&text})
	result, err := openapiClient.CreateTextEmbeddings(request)
	if err != nil {
		fmt.Printf("failed to create token, err: %v\n", err)
		return
	}

	resultBody := result.Body
	if !(*resultBody.Success) {
		requestId := resultBody.RequestId
		if requestId == nil {
			requestId = result.Headers["x-acs-request-id"]
		}

		errMessage := fmt.Sprintf("Failed to create embeddings, reason: %s RequestId: %s", *resultBody.Message, *requestId)
		fmt.Printf("%v\n", errMessage)
		return
	}

	embeddings := resultBody.Data.Embeddings
	if embeddings != nil {
		for _, embedding := range embeddings {
			fmt.Printf("index: %d, embeding : [", embedding.TextIndex)
			for _, num := range embedding.Embedding {
				fmt.Printf("%.16f, ", *num)
			}
			fmt.Printf("]")
		}
	}

  • 本页导读 (0)
文档反馈