You need to enable JavaScript to run this app.
导航
通过 Top 接口调用 RAG
最近更新时间:2024.07.10 11:31:22首次发布时间:2024.07.10 11:31:22

IAM 授权

本服务依托于 LAS 服务,首先需要准备一个账号并且设置 AK 和 SK ,推荐使用子账号。
然后给账号授予权限 。首先前往控制台

在这里添加授权,选择你需要的子账号即可。主账号设置的 AK 不需要授权。

接口调用准备

接口采用火山通用方式,参考官网文档。特别是签名过程各个sdk示例。签名后会在请求里增加一个 Header

Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}

比如 python 的话调用示例如下
https://github.com/volcengine/volc-openapi-demos/blob/main/signature/python/sign.py

# coding:utf-8
"""
Copyright (year) Beijing Volcano Engine Technology Ltd.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""

import datetime
import hashlib
import hmac
from urllib.parse import quote

import requests

# 以下参数视服务不同而不同,一个服务内通常是一致的
Service = "las"
Version = "2024-06-30"
Region = "cn-beijing"
Host = "open.volcengineapi.com"
ContentType = "application/json"

# 请求的凭证,从IAM或者STS服务中获取
AK = "AKExample***********"
SK = "QwERrtyasdf*********"
# 当使用临时凭证时,需要使用到SessionToken传入Header,并计算进SignedHeader中,请自行在header参数中添加X-Security-Token头
# SessionToken = ""


def norm_query(params):
    query = ""
    for key in sorted(params.keys()):
        if type(params[key]) == list:
            for k in params[key]:
                query = (
                        query + quote(key, safe="-_.~") + "=" + quote(k, safe="-_.~") + "&"
                )
        else:
            query = (query + quote(key, safe="-_.~") + "=" + quote(params[key], safe="-_.~") + "&")
    query = query[:-1]
    return query.replace("+", "%20")


# 第一步:准备辅助函数。
# sha256 非对称加密
def hmac_sha256(key: bytes, content: str):
    return hmac.new(key, content.encode("utf-8"), hashlib.sha256).digest()


# sha256 hash算法
def hash_sha256(content: str):
    return hashlib.sha256(content.encode("utf-8")).hexdigest()


# 第二步:签名请求函数
def request(method, date, query, header, ak, sk, action, body):
    # 第三步:创建身份证明。其中的 Service 和 Region 字段是固定的。ak 和 sk 分别代表
    # AccessKeyID 和 SecretAccessKey。同时需要初始化签名结构体。一些签名计算时需要的属性也在这里处理。
    # 初始化身份证明结构体
    credential = {
        "access_key_id": ak,
        "secret_access_key": sk,
        "service": Service,
        "region": Region,
    }
    # 初始化签名结构体
    request_param = {
        "body": body,
        "host": Host,
        "path": "/",
        "method": method,
        "content_type": ContentType,
        "date": date,
        "query": {"Action": action, "Version": Version, **query},
    }
    if body is None:
        request_param["body"] = ""
    # 第四步:接下来开始计算签名。在计算签名前,先准备好用于接收签算结果的 signResult 变量,并设置一些参数。
    # 初始化签名结果的结构体
    x_date = request_param["date"].strftime("%Y%m%dT%H%M%SZ")
    short_x_date = x_date[:8]
    x_content_sha256 = hash_sha256(request_param["body"])
    sign_result = {
        "Host": request_param["host"],
        "X-Content-Sha256": x_content_sha256,
        "X-Date": x_date,
        "Content-Type": request_param["content_type"],
    }
    # 第五步:计算 Signature 签名。
    signed_headers_str = ";".join(
        ["content-type", "host", "x-content-sha256", "x-date"]
    )
    # signed_headers_str = signed_headers_str + ";x-security-token"
    canonical_request_str = "\n".join(
        [request_param["method"].upper(),
         request_param["path"],
         norm_query(request_param["query"]),
         "\n".join(
             [
                 "content-type:" + request_param["content_type"],
                 "host:" + request_param["host"],
                 "x-content-sha256:" + x_content_sha256,
                 "x-date:" + x_date,
             ]
         ),
         "",
         signed_headers_str,
         x_content_sha256,
         ]
    )

    # 打印正规化的请求用于调试比对
    print(canonical_request_str)
    hashed_canonical_request = hash_sha256(canonical_request_str)

    # 打印hash值用于调试比对
    print(hashed_canonical_request)
    credential_scope = "/".join([short_x_date, credential["region"], credential["service"], "request"])
    string_to_sign = "\n".join(["HMAC-SHA256", x_date, credential_scope, hashed_canonical_request])

    # 打印最终计算的签名字符串用于调试比对
    print(string_to_sign)
    k_date = hmac_sha256(credential["secret_access_key"].encode("utf-8"), short_x_date)
    k_region = hmac_sha256(k_date, credential["region"])
    k_service = hmac_sha256(k_region, credential["service"])
    k_signing = hmac_sha256(k_service, "request")
    signature = hmac_sha256(k_signing, string_to_sign).hex()

    sign_result["Authorization"] = "HMAC-SHA256 Credential={}, SignedHeaders={}, Signature={}".format(
        credential["access_key_id"] + "/" + credential_scope,
        signed_headers_str,
        signature,
    )
    header = {**header, **sign_result}
    # header = {**header, **{"X-Security-Token": SessionToken}}
    # 第六步:将 Signature 签名写入 HTTP Header 中,并发送 HTTP 请求。
    r = requests.request(method=method,
                         url="https://{}{}".format(request_param["host"], request_param["path"]),
                         headers=header,
                         params=request_param["query"],
                         data=request_param["body"],
                         )
    return r.json()


if __name__ == "__main__":
    # response_body = request("Get", datetime.datetime.utcnow(), {}, {}, AK, SK, "ListUsers", None)
    # print(response_body)

    now = datetime.datetime.utcnow()

    data = {
    "app_identity": "volcano_engine_technology",
    "agent": "jd2question",
    "prompt": "关于java垃圾回收机制,给出11个问题每个问题一行,不需要序号",
    "is_stream": False
    }
    response_body = request(
        "POST", now, {}, {}, AK, SK, "GetQuestionsByLLMAndJD", json.dumps(data)
    )
    print(response_body)

接口调用

给定 Action 和 Version,接口的调用方式如下

curl --location 'https://open.volcengineapi.com?Action={Action}&Version={Version}' \
--header 'Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}' \
--header 'ServiceName: las' \
--header 'Content-Type: application/json' \
--data '{
  "app_identity": "volcano_engine_technology",
   "scene": 2,
  "prompt": "关于java内存模型,给出10个问题每个问题一行"
}'

本期接口如下

数据相关 API

动态更新 RAG 缓存

  • Action: InsertRagFaq
  • Version: 2024-06-30
  • Method: post
  • Body 参数:

参数

类型

描述

例子

app_identity

string

代表租户标识

租户名,如:volcano_engine_technology

question

int

代表问题

rag是什么?

answer

string

代表标准回答

rag是一个不错的LLM对话工程体系。

  • 返回结果:

参数

类型

描述

例子

code

int

代表成功还是失败

200: 成功
非200: 失败

msg

string

成功或者失败的提示信息

"插入成功"

对话服务相关API

生成对话 chatid

  • Action: NewChat
  • Version: 2024-06-30
  • Method: post
  • Body 参数:

参数

类型

描述

例子

app_identity

string

代表租户标识

租户名,如:volcano_engine_technology

username

string

用户名

"Jack@hotmail.com"

  • 返回结果:

参数

类型

描述

例子

code

int

代表成功还是失败

200: 成功
非200: 失败

msg

string

成功或者失败的提示信息

"调用成功"

data

{}

结果数据

{"chat_id":"66711ab1b97cdfd66f1c32e5"}

对话服务

  • Action: CommonChat
  • Version: 2024-06-30
  • Method: post
  • Body 参数:

参数

类型

描述

例子

app_identity

string

代表租户标识

租户名,如:volcano_engine_technology

chat_id

string

代表一个对话的session_id,这里可以通过生成chat_id接口来获取

xxxxxxx

is_stream

bool

代表是否流式返回

True: 流式返回,就跟chatgpt那样,挨个字符返回
False: 同步返回,llm 整体输出完成之后,一次性返回

history

[
{question: str, answer: str}
]

历史对话数组,不包含最新的用户输入

[
{ "question": "开始java答题",
"answer": "欢迎来到我们的模拟面试环节,希望你能展现出最好的自己。现在,开始答题:Spring Boot中的JPA和Hibernate有什么区别?"
},
{ "question": "这块了解不多",
"answer": "你的回答虽然不够详细,但是勇于承认自己的不足也是一种优点,希望你能在接下来的学习中对这个问题有更深入的理解。开始下一题:Spring MVC中,什么是MVC的"约定优于配置"原则?"
},
{ "question": "约定要比配置更规范同时少很多代码",
"answer": "你的回答已经抓住了"约定优于配置"原则的核心思想,继续加油!开始下一题:Spring Cloud和Spring Boot的区别是什么?"
}
]

question

string

最新的用户输入

“这块用的不多”

chat_type

string

对话类型,["single", "multi"], 默认是multi

multi

  • 返回结果, 这里需要区分两种类型:

    • 非流式返回:

参数

类型

描述

例子

code

int

代表成功还是失败

200: 成功
非200: 失败

msg

string

成功或者失败的提示信息

"调用成功"

data

{}

结果数据

{"answer":""}

  • 流式返回:

参数

类型

描述

例子

data

string

json化的流式字符串,这里返回的是 sse

{"logid": "2024061813343101003702602494498", "choices": [{"delta": {"content": "\u4f60"}, "type": "knowledge", "stream": true, "done": false, "references": [], "answer_source": "doc"}]}