You need to enable JavaScript to run this app.
文档中心
火山方舟

火山方舟

复制全文
下载 pdf
高代码智能体 SDK
智能体 SDK 使用说明
复制全文
下载 pdf
智能体 SDK 使用说明

注意

以下功能是Beta版本, 如遇到问题, 请联系 PDSA, 谢谢合作;

SDK下载

可通过tosutil/rclone等对象存储命令行工具从tos上下载sdk

下载tos命令行工具

下载tosutil

  • linux环境为例:
wget https://tos-tools.tos-cn-beijing.volces.com/linux/tosutil && chmod a+x tosutil

配置tosutil

  • 通过aksk完成命令行工具的初始化配置
tosutil config -i {AK} -k {SK} -e tos-cn-beijing.volces.com -re cn-beijing

查看sdk版本号

  • 查看最新版本sdk
tosutil ls tos://ark-sdk-cn-beijing/python_sdk

下载sdk

  • 下载whl包到本地
tosutil cp tos://ark-sdk-cn-beijing/python_sdk/ark-{version}-py3-none-any.whl ./ark-{version}-py3-none-any.whl

下载后pip install

pip install ark-{version}-py3-none-any.whl
智能体高代码SDK

鉴权方式:SDK鉴权

联网检索相关

SearchIntention 类

识别用户 query 是否需要联网检索

方法名入参出参说明

__init__

endpoint_id (str): 模型 endpoint ID,用于标识搜索意图
messages (List[MaasChatMessage]): 消息列表,包含搜索意图的相关信息
options (Optional[Dict[str, Any]]): 选项字典,包含搜索意图的配置信息
parameters (Optional[Union[Parameters, Dict[str, Any]]]): 参数对象或字典,包含搜索意图的参数信息
client (Optional[ArkClient]): ArkClient 实例,用于与外部服务进行通信
**kwargs (Any): 其他可选参数

注:

  • options 中的 result_mapping 字段表示大模型返回结果与bool的映射关系, 如不需要 -> False , 需要 -> True ;
SearchIntention 对象

初始化 SearchIntention 类的实例

run

/

MaasChatResponse 对象

注:

  • response.choices[0].message.content 字段存储了意图判定结果, 即是否需要联网搜索

执行意图识别

联网检索意图识别示例

@task()
def intention_check(request: MaasChatRequest) -> Tuple[bool, MaasChatResponse]:
    """
    检查用户的意图

    参数:
        request (MaasChatRequest): 包含用户请求的信息

    返回:
        Tuple[bool, MaasChatResponse]: 一个元组,第一个元素表示用户是否需要进行搜索,第二个元素是搜索结果的响应
    """
    try:
        # 创建一个 SearchIntention 实例来检查用户的意图
        intention_check = SearchIntention(
            endpoint_id="",
            options={
                "keywords": request.messages,
                "result_mapping": {"需要": True, "不需要": False},
            },
            parameters={"temperature": 1, "top_k": 1, "top_p": 0.7},
            messages=format_maas_prompts(
                BrowsingIntentionChatPromptTemplate(), request.messages
            ),
        )
    except ValueError as e:
        # 如果发生值错误,抛出一个 InvalidParameter 异常
        raise InvalidParameter(str(e))
    except TypeError as e:
        # 如果发生类型错误,抛出一个 InvalidParameter 异常
        raise InvalidParameter(str(e))
    # 运行意图检查
    intention_resp = intention_check.run()
    # 如果意图检查的结果是不需要,返回 False 和意图检查的响应
    if (
        not intention_resp.choices
        or len(intention_resp.choices) == 0
        or intention_resp.choices[0].message.content == "不需要"
    ):
        return False, intention_resp
    # 如果意图检查的结果是需要,返回 True 和意图检查的响应
    else:
        return True, intention_resp

KeywordsGenerator 类

提取 query 的关键词

方法名入参出参说明

__init__

endpoint_id (str): 模型 endpoint ID,用于标识关键词生成器
messages (List[MaasChatMessage]): 消息列表,包含关键词生成器的相关信息
parameters (Optional[Union[Parameters, Dict[str, Any]]]): 参数对象或字典,包含关键词生成器的参数信息
options (Optional[Dict[str, Any]]): 选项字典,包含关键词生成器的配置信息
client (ArkClient): ArkClient 实例,用于与外部服务进行通信
template (BaseChatPromptTemplate): 提示模板,用于生成关键词
output_parser (BaseTransformOutputParser[List[str]]): 输出解析器,用于解析关键词的输出
KeywordsGenerator 对象

初始化 KeywordsGenerator 实例

run

/

MaasChatResponse 对象

注:

  • response.choices[0].message.content 存储了关键词结果

执行关键词生成

生成关键词示例

@task()
def generate_keywords(request: MaasChatRequest) -> List[str]:
    """
    生成关键词

    参数:
        request (MaasChatRequest): 包含用户请求的信息

    返回:
        List[str]: 关键词列表
    """
    keywords_generator = KeywordsGenerator(
        endpoint_id="", messages=request.messages
    )
    location_info = None
    if (
        request.tools
        and len(request.tools) > 0
        and request.tools[0].options
        and "user_info" in request.tools[0].options
    ):
        try:
            user_info = json.loads(
                request.tools[0].options.get("user_info", ""))
            location_info = (user_info.get("city", ""),
                             user_info.get("district", ""))
        except ValueError as e:
            raise InvalidParameter(f"Invalid user_info: {e}")
    try:
        keywords_resp = keywords_generator.run(location_info=location_info)
    except ValueError as e:
        raise InvalidParameter(str(e))
    return keywords_generator.parse_output(keywords_resp.choices[0].message.content)

SearchSummary 类

生成检索结果总结

方法名入参出参说明

__init__

endpoint_id (str): 模型 endpoint ID,用于标识搜索摘要
messages (List[MaasChatMessage]): 消息列表,包含搜索摘要的相关信息
options (Optional[Dict[str, Any]]): 选项字典,包含搜索摘要的配置信息
parameters (Optional[Union[Parameters, Dict[str, Any]]]): 参数对象或字典,包含搜索摘要的参数信息
client (Optional[ArkClient]): ArkClient 实例,用于与外部服务进行通信
**kwargs (Any): 其他可选参数
SearchSummary 示例

初始化 SearchSummary 类

run

/

MaasChatResponse 对象

检索结果生成 summary 示例

def gen_summary(request: MaasChatRequest) -> Iterable[MaasChatResponse]:
    """
    生成搜索摘要的函数

    参数:
    request (MaasChatRequest): 包含请求信息的对象

    返回:
    Iterable[MaasChatResponse]: 生成的搜索摘要的响应
    """
    # 创建 SearchSummary 实例
    search_summary = SearchSummary(
        endpoint_id="",
        # 配置选项
        options={
            "source_type": "text",
            "keywords": keywords,
        },
        # 配置参数
        parameters={"temperature": 0.7, "top_p": 0.9},
        # 复制请求中的消息
        messages=request.messages,
        # 复制请求中的额外信息
        extra=request.extra,
    )
    # 如果请求是流模式
    if request.stream:
        # 对 search_summary.stream() 进行迭代,生成响应
        for resp in search_summary.stream():
            yield resp
    else:
        # 运行 search_summary 并生成响应
        yield search_summary.run()

RAG 相关

VikingDB 类

一个基于 VikingDB 的知识库存储

方法名入参出参说明

get

sid (str): viking 数据库的标识符
schema (VikingDBSchema): KnowledgeBase 模式定义
index_name (str, optional): 索引的名称
client (VikingDBClient, optional): 数据库客户端
获取的指定的 VikingDB 实例

需要提供 sid

初始化 VikingDB 示例

def get_viking_db(sid: str, kn_schema: VikingDBSchema) -> VikingDB:
    """
    从知识库中获取特定架构的知识库实例

    参数:
    sid (str): 知识库的会话 ID
    kn_schema (VikingDBSchema): 知识库的架构

    返回:
    VikingDB: 特定架构的知识库实例

    异常:
    Exception: 当无法获取知识库时,抛出异常
    """
    try:
        kb = VikingDB.get(sid, kn_schema)
        return kb
    except Exception:
        error_string = traceback.format_exc()
        LOGGER.error("知识库获取失败, 错误信息: %s", error_string)
        return None
    LOGGER.info("知识库获取成功, id: %s", kb.sid)

VikingDBSchema 类

VikingDBSchema 向量定义

方法名入参出参说明

__init__

primary_key (Dict[str, str]): 主键定义
vector (Dict[str, str]): 向量定义
scalars (List[Dict[str, str]]): 向量中的标量定义
vector_text_len_limit (int) : 文本字段长度限制

primary_key 属性:
* name : 字段名
* type : 字段类型
* default_val : 默认值

vector 属性:
* name : 字段名
* type : 字段类型
* dim : 维度 (for vector)
* model : 生成 embedding 的 LLM
* embedding_type : 生成 embedding 的方法类型, 如"llm"

scalars 元素属性:
* name : 字段名
* type : 字段类型
* default_val : 默认值

type 字段类型 :
    "int64"
    "string"
    "text"
    "bool"
    "list<string>"
    "list<int64>"
    "vector"
VikingDBSchema 实例

初始化 VikingDBSchema 类

初始化 VikingDBSchema 示例

kn_schema = VikingDBSchema(
    primary_key={
        "name": "id",
        "type": "string",
        "default_val": "",
    },
    vector={
        "name": "encode_text",
        "type": "vector",
        "dim": 1024,
        "model": "mse-20231114152400-l7rb8",
        "embedding_type": "llm",
    },
    scalars=[
        {
            "name": "doc_id",
            "type": "string",
            "default_val": "",
        },
        {
            "name": "file_name",
            "type": "string",
            "default_val": "",
        },
        {
            "name": "text",
            "type": "text",
            "default_val": "",
        },
        {
            "name": "chunk_id",
            "type": "int64",
            "default_val": -1,
        },
        {
            "name": "chunk_type", 
            "type": "string", 
            "default_val": "raw_chunk"
        },
        {
            "name": "chunk_len",
            "type": "int64",
            "default_val": 0,
        },
        {
            "name": "full_text_len",
            "type": "int64",
            "default_val": 0,
        },
    ],
    vector_text_len_limit=600,
)

KnowledgeIntention 类

判断用户 query 是否需要进行知识库检索

方法名入参出参说明

__init__

name (Literal["KnowledgeIntention"]): 意图的名称,始终为 "KnowledgeIntention"
        template (BaseChatPromptTemplate): 用于生成对话提示的模板
KnowledgeIntention 对象

知识意图类,继承自 RagIntention 类, 判断用户 query 是否需要进入知识库检索

arun

/

bool , 是否需要进入知识库检索

执行知识意图识别

使用示例

async def knowledge_intention_check(request: MaasChatRequest) -> bool:
    """
    检查是否需要检索知识

    参数:
    request (MaasChatRequest): 包含请求信息的对象

    返回:
    bool: 如果需要检索知识,则为 True;否则为 False

    异常:
    Exception: 当意图检查失败时,抛出异常

    用法:
    >>> await knowledge_intention_check(request)
    """
    try:
        rag_intention = KnowledgeIntention(
            endpoint_id="mse-20240219180336-5dw6w",  # pro-4K 1.2
            parameters={"temperature": 0.3, "top_p": 0.3},
            messages=request.messages,
        )
        need_retrieve = await rag_intention.arun()
    except Exception as e:
        LOGGER.error("Intention Failed, fallback, exception %s", str(e))
        need_retrieve = True
    return need_retrieve

QueryRewriteGenerator 类

query 改写类, 继承自 RewriteGenerator 类; 在从vdb中 retrieve 之前, 先将用户的 query 改写, 比如将"指示代词"替换成清晰的主语, 将历史聊天记录中和query相关的关键词放入query中等;

方法名入参出参说明

__init__

name (Literal["QueryRewrite"]): 类的名称,始终为 "QueryRewrite"
template (BaseChatPromptTemplate): 用于生成对话提示的模板
QueryRewriteGenerator 对象

生成 query 改写类, 基于 prompt 进行 query 改写

使用示例

async def query_rewrite(request: MaasChatRequest) -> str:
    """
    改写query的异步函数

    参数:
    request (MaasChatRequest): 包含请求信息的对象

    返回:
    str: 重写后的查询语句

    异常:
    ValueError: 如果重写查询失败,将抛出此异常

    用法:
    >>> await query_rewrite(request)
    """
    template = QueryRewritePromptTemplate(template=CONDENSE_QUESTION_PROMPT_TEMPLATE)
    parser = RagRewriteMessageChunkOutputParser()
    query_rewrite_generator = QueryRewriteGenerator(
        endpoint_id="mse-20240219180336-5dw6w",  # pro-4K 1.2
        parameters={"temperature": 0.3, "top_p": 0.3},
        messages=request.messages,
        template=template,
        output_parser=parser,
    )
    try:
        rewrited_query = await query_rewrite_generator.arun()
    except ValueError as e:
        LOGGER.error("Query Rewrite Failed, fallback, exception %s", str(e))
        rewrited_query = request.messages[-1].content
    return rewrited_query

VikingDBRetriever 类

从 VikingDB 召回检索

方法名入参出参说明

__init__

config (VikingDBSchema): 包含配置信息的对象
db (VikingDB): 数据库连接对象
_embedding_cache (Dict[str, Any]): 用于缓存嵌入向量的字典
VikingDBRetriever 对象

VikingDBRetriever 类,继承自 BaseRetriever 和 ABC 类, 用于从 VikingDB 中检索数据

retrieve

query (Union[str, List[float]]): 要检索的查询,可以是字符串或浮点数列表
retrieve_count (int): 要检索的数量
dsl_filter (Optional[Any], optional): 用于过滤结果的 DSL 过滤器,默认为空
partition (str, optional): 要检索的分区,默认为 "default"
norm (str, optional): 归一化方法,默认为 "none"
vector_dim (int, optional): 向量维度,默认为 0
instruct (str, optional): 生成嵌入的指令,默认为 "为这个句子生成表示以用于检索相关文章:"
List[KnowledgeChunk]: 包含检索结果的知识块列表

从 vikingDB 中异步检索数据

chunk_diffusion

query (Union[str, List[Any]]): 要查询的字符串或列表
chunk (KnowledgeChunk): 要查询的起始块
partition (str, optional): 查询的分区,默认为 "default"
match_scalars (List[str], optional): 用于匹配的标量字段列表,默认为 ["chunk_type", "doc_id"]
forward_diffusion (int, optional): 向前扩散的数量,默认为 1
backward_diffusion (int, optional): 向后扩散的数量,默认为 1
List[KnowledgeChunk]: 包含查询结果的知识块列表

异步执行块扩散查询

使用示例

async def retrieve_knowledge(
    query: str, schema: VikingDBSchema, kb: VikingDB, cnt=3
) -> List[str]:
    """
    异步检索知识库中的知识

    参数:
    query (str): 查询语句
    schema (VikingDBSchema): 知识库的架构
    kb (VikingDB): 知识库实例
    cnt (int, optional): 每个查询的检索数量. Defaults to 3.

    返回:
    List[str]: 包含检索到的知识的字符串列表

    异常:
    ValueError: 如果检索知识失败,将抛出此异常
    """
    retriever = VikingDBRetriever(schema, kb)

    # 直接召回 Top K
    dsl_filter = {"op": "must", "field": "chunk_type", "conds": ["raw_chunk"]}
    topk_chunks = await retriever.retrieve(
        query=query, retrieve_count=cnt, dsl_filter=dsl_filter
    )

    dup_ids = set()
    dedup_chunks = []
    for chunk in topk_chunks:
        dup_id = "#".join(
            [str(chunk.scalars["doc_id"]), str(chunk.scalars["chunk_id"])]
        )
        if dup_id in dup_ids:
            continue
        dup_ids.add(dup_id)
        dedup_chunks.append(chunk)

    # 对 chunk 做上下文 diffusion
    async def chunk_diffusion(origin_chunk: KnowledgeChunk) -> KnowledgeChunk:
        text_tuple = []
        diffusion_chunks = await retriever.chunk_diffusion(
            query=query, chunk=origin_chunk, forward_diffusion=1, backward_diffusion=1
        )
        for chunk in diffusion_chunks:
            text = chunk.scalars["text"]
            chunk_id = chunk.scalars["chunk_id"]
            text_tuple.append((text, chunk_id))
        text_tuple.sort(key=lambda x: x[1])
        merged_text = "".join([t[0] for t in text_tuple])

        # inplace update
        origin_chunk.scalars.update({"text": merged_text})
        return origin_chunk

    tasks = [chunk_diffusion(chunk) for chunk in dedup_chunks]
    dedup_chunks_diffusion = await asyncio.gather(*tasks)

    # Format Reference
    refs = []
    for chunk in dedup_chunks_diffusion:
        text = chunk.scalars["text"]
        file_name = chunk.scalars["file_name"]
        chunk_id = chunk.scalars["chunk_id"]
        refs.append(f"文件名:{file_name}\n片段编号:{chunk_id}\n正文:\n{text}\n")

    return refs

RagSummary 类

Rag 检索后, 执行 summary 摘要生成

方法名入参出参说明

__init__

name (Literal["RagSummary"]): 模型的名称,始终为 "RagSummary"
template (CustomPromptTemplate): 用于生成对话提示的模板
RagSummary 实例

用于生成文本摘要的语言模型, 继承自 BaseChatLanguageModel 类

示例代码

async def gen_summary(request: MaasChatRequest, reference: str, query: str) -> AsyncIterable[MaasChatResponse]:
    """
    异步生成摘要

    参数:
    request (MaasChatRequest): 包含请求信息的对象
    reference (str): 引用的文本
    query (str): 要生成摘要的问题

    返回:
    AsyncIterable[MaasChatResponse]: 生成的摘要的异步迭代器

    用法:
    >>> async for resp in gen_summary(request, reference, query):
    >>>     yield resp
    """
    async for resp in summary_generation(
        request, reference=reference, question=query
    ):
        yield resp
最近更新时间:2024.09.27 15:32:48
这个页面对您有帮助吗?
有用
有用
无用
无用