华为云用户手册

  • History History缓存,用于存储历史对话信息,辅助模型理解上下文信息,历史消息对有固定窗口、消息摘要等策略。 初始化:消息记录支持不同的存储方式,如内存、D CS (Redis)、RDS(Sql)。 import com.huaweicloud.pangu.dev.sdk.api.memory.config.MessageHistoryConfig; import com.huaweicloud.pangu.dev.sdk.api.memory.config.ServerInfoRedis; import com.huaweicloud.pangu.dev.sdk.api.memory.config.ServerInfoSql; import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.ChatMessageHistory; import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.RedisChatMessageHistory; import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.SqlChatMessageHistory; String sessionTag = "session_tag_test"; // 内存型 ChatMessageHistory chatMessage = new ChatMessageHistory(); // Redis RedisChatMessageHistory redisChat = new RedisChatMessageHistory(MessageHistoryConfig.builder() .serverInfo(ServerInfoRedis.builder().build()) .sessionTag("test-memory-0624") .build()); // Sql SqlChatMessageHistory sqlChat = new SqlChatMessageHistory( MessageHistoryConfig.builder().serverInfo(ServerInfoSql.builder().build()).sessionTag(sessionTag).build()); 添加、查找、删除数据。 //更新数据 chatMessage.addAIMessage("i am ai."); chatMessage.addUserMessage("i am tester."); // 查找数据 chatMessage.getMessages().toString(); // 清理 chatMessage.clear(); 消息策略(windows-size):将固定轮次历史对话信息,作为历史上下文信息。 import com.huaweicloud.pangu.dev.sdk.api.memory.config.MemoryStoreConfig; import com.huaweicloud.pangu.dev.sdk.api.memory.config.MessageHistoryConfig; import com.huaweicloud.pangu.dev.sdk.llms.model.MessagePo; import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.RedisChatMessageHistory; import com.huaweicloud.pangu.dev.sdk.api.memory.config.ServerInfoRedis; import com.huaweicloud.pangu.dev.sdk.memory.ConversationBufferMemory; // 历史消息存储 RedisChatMessageHistory redisChat = new RedisChatMessageHistory(MessageHistoryConfig.builder() .serverInfo(ServerInfoRedis.builder().build()) .sessionTag("test-memory") .build()); // 固定窗口策略 ConversationBufferMemory memory = new ConversationBufferMemory(MemoryStoreConfig.builder().messageHistory(redisChat).build()); memory.getChatMessage().addUserMessage("This is me, the human"); memory.getChatMessage().addAIMessage("This is me, the AI"); System.out.print(MessagePo.toString(memory.getChatMessage().getMessages())); memory.getChatMessage().clear(); 消息策略(信息摘要):将历史消息进行摘要后,作为历史上下文信息。 import com.huaweicloud.pangu.dev.sdk.api.memory.config.MemoryStoreConfig; import com.huaweicloud.pangu.dev.sdk.api.memory.config.MessageHistoryConfig; import com.huaweicloud.pangu.dev.sdk.llms.model.MessagePo; import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.RedisChatMessageHistory; import com.huaweicloud.pangu.dev.sdk.api.memory.config.ServerInfoRedis; import com.huaweicloud.pangu.dev.sdk.memory.ConversationSummaryMemory; // 历史消息存储 RedisChatMessageHistory redisChat = new RedisChatMessageHistory(MessageHistoryConfig.builder() .serverInfo(ServerInfoRedis.builder().build()) .sessionTag("test-memory") .build()); // 摘要策略 ConversationSummaryMemory memory = new ConversationSummaryMemory(MemoryStoreConfig.builder().messageHistory(redisChat).llm(LLMs.of(LLMs.PANGU)).build()); memory.getChatMessage().addUserMessage("This is me, the human"); memory.getChatMessage().addAIMessage("This is me, the AI"); System.out.print(MessagePo.toString(memory.getChatMessage().getMessages())); memory.getChatMessage().clear(); 父主题: Memory(记忆)
  • Memory(记忆) Memory(记忆)模块结合外部存储为LLM应用提供长短期记忆能力,用于支持上下文记忆的对话、搜索增强等场景。 Memory(记忆)支持多种不同的存储方式和功能。 Cache缓存:是一种临时存储数据的方法,它可以提高数据的访问速度和效率。缓存可以根据不同的存储方式进行初始化、更新、查找和清理操作。缓存还可以支持语义匹配和查询,通过向量和相似度的计算,实现对数据的语义理解和检索。 Vector向量存储:是一种将数据转换为数学表示的方法,它可以度量数据之间的关系和相似度。向量存储可以根据不同的词向量模型进行初始化、更新、查找和清理操作。向量存储还可以支持多种相似算法,如余弦相似度、欧氏距离、曼哈顿距离等,实现对数据的相似度评分和排序。 History对话消息存储:是一种将对话消息保存在内存中的方法,它可以记录和管理对话历史。对话消息存储可以根据不同的会话标识进行初始化、更新、查找和清理操作。对话消息存储还可以支持多种过滤条件,如时间范围、用户标识、消息类型等,实现对话消息的筛选和分析。 Cache Vector History 父主题: Java SDK
  • 工程实现 获取并安装SDK包。 在配置文件(llm.properties)中配置模型信息。 # IAM 认证信息,根据实际填写 sdk.llm.pangu.iam.url= sdk.llm.pangu.iam.domail= sdk.llm.pangu.iam.user= sdk.llm.pangu.iam.password= sdk.llm.pangu.iam.project= ## 盘古模型信息,根据实际情况填写 sdk.llm.pangu.url= 工程实现。 import docx from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.skill.doc.summary import DocSummaryMapReduceSkill # 加载原始内容, 需根据文件源自行实现读取步骤 # 以word文件为例,需安装docx库 doc = docx.Document(r'报告.docx') documents = [d.text for d in doc.paragraphs] # 对文档进行摘要 skill = DocSummaryMapReduceSkill(LLMs.of("pangu")) summarize = skill.execute_with_texts(documents)
  • 工程实现 准备知识库。 获取并安装SDK包。 在配置文件(llm.properties)中配置模型信息。 # 盘古模型IAM 认证信息,根据实际填写 sdk.llm.pangu.iam.url= sdk.llm.pangu.iam.domain= sdk.llm.pangu.iam.user= sdk.llm.pangu.iam.password= sdk.llm.pangu.project= ## 盘古模型信息,根据实际情况填写 sdk.llm.pangu.url= ## CSS Embedding模型api sdk.embedding.css.url= sdk.embedding.css.iam.url= sdk.embedding.css.iam.domain= sdk.embedding.css.iam.user= sdk.embedding.css.iam.password= sdk.embedding.css.iam.project= ## CSS 向量库 sdk.memory.css.url= sdk.memory.css.user= sdk.memory.css.password= 工程实现。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.ask import DocAskStuffSkill query = "杜甫的诗代表了什么主义诗歌艺术的高峰?" # 初始化向量库 vector_store_config = VectorStoreConfig(store_name="css", index_name="test-vector-css", embedding=Embeddings.of("css"), server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索文档 docs = vector_api.similarity_search(query, 4) # 文档问答 doc_skill = DocAskStuffSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs, "question": query}))
  • 评估指标说明 模型训练完成后,可以通过一系列的评估方法来衡量模型的性能。当前支持基于规则打分,即基于相似度/准确率进行打分,对比模型预测结果与标注数据的差异,从而计算模型指标。支持的模型指标请参见下表。 表1 规则打分指标 指标名称 说明 BLEU-1 模型生成句子与实际句子在单字层面的匹配度,数值越高,表明模型性能越好。 BLEU-2 模型生成句子与实际句子在中词组层面的匹配度,数值越高,表明模型性能越好。 BLEU-4 模型生成结果和实际句子的加权平均精确率,数值越高,表明模型性能越好。 困惑度 用来衡量大语言模型预测一个语言样本的能力,数值越低,准确率也就越高,表明模型性能越好。 指标适用的任务场景 任务答案是相对比较确定的,例如固定答案的问答任务、NL2SQL、NL2JSON、文本分类等。 指标不适用的任务场景 文案创作、聊天等符合要求即可的场景,该类场景的创作型更强,不存在唯一答案。 指标与模型能力的关系 BLEU指标用于评估模型生成句子(candidate)与实际句子(reference)差异的指标。取值范围在0.0到1.0之间,值越高说明模型生成和实际答案匹配度越高。 可以作为模型能力的参考指标,当两个模型进行比较时,BLEU指标越大的模型效果一般更好。但是模型的能力还是需要通过人工评测来评判,BLEU指标只能作为参考。 指标的缺陷 BLEU指标只考虑n-gram词的重叠度,不考虑句子的结构和语义。
  • 指标看板介绍 指标看板使用BLEU指标评价模型,其核心思想是计算准确率。例如,给定一个标准译文(reference)和一个算法生成的句子(candidate),BLEU-1的计算公式为候选句中出现于标准译文中的单词数(m)与候选句总单词数(n)的比值,即m/n。指标看板通过BLEU-1、BLEU-2与BLEU-4评价模型性能。 BLEU-1: 机器翻译 、⽂本摘要等生成类任务常用的评价指标。用于评估模型生成句子与实际句子在单字层面的匹配度,数值越高,表明模型性能越好。 BLEU-2:机器翻译、⽂本摘要等生成类任务常用的评价指标。用于评估模型生成句子与实际句子在中词组层面的匹配度,数值越高,表明模型性能越好。 BLEU-4:机器翻译、⽂本摘要等生成类任务常用的评价指标。它通过将模型生成结果和标注结果分别按1-gram、2-gram、3-gram和4-gram拆分后,然后计算加权平均精确率。其中,n-gram指的是一个句子中连续的n个单词片段。BLEU-4 的数值越高,表明模型性能越好。
  • 训练损失值指标介绍 训练损失值(Training Loss)是一种衡量模型预测结果和真实结果差距的指标,通常情况下越小越好。 一般来说,一个正常的Loss曲线是单调递减的,即随着训练的进行,Loss值不断减小,直到收敛到一个较小的值。以下给出了几种正常的Loss曲线形式: 图2 正常的Loss曲线:平滑下降 图3 正常的Loss曲线:阶梯下降 如果您发现Loss曲线出现了以下几种情况,可能意味着模型训练状态不正常: Loss曲线上升:Loss曲线上升的原因可能是数据质量差,或学习率设置过大,使得模型在最优解附近震荡,甚至跳过最优解,导致无法收敛。您可以尝试提升数据质量或减小学习率来解决。 图4 异常的Loss曲线:上升 Loss曲线平缓,保持高位:Loss曲线平缓且保持高位不下降的原因可能是目标任务的难度较大,或模型的学习率设置过小,导致模型的收敛速度太慢,无法达到最优解。您可以尝试增大训练轮数或者增大学习率来解决。 图5 异常的Loss曲线:平缓且保持高位 Loss曲线异常抖动:Loss曲线异常抖动的原因可能是训练数据质量差,比如数据存在噪声或分布不均衡,导致训练不稳定。您可以尝试提升数据质量来解决。 图6 异常的Loss曲线:异常抖动
  • 基础问答 提供简单的对话实现。 初始化 from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.skill.base import SimpleSkill from langchain.prompts import PromptTemplate # 自定义模板 prompt_template = PromptTemplate.from_template("讲一个关于{{subject}}的笑话,字数{{count}}字以内", template_format="jinja2") skill = SimpleSkill(prompt_template=prompt_template, llm_api=LLMs.of("pangu")) 问答 from pangukitsappdev.api.llms.llm_config import LLMParamConfig # 不带参数的问答 skill.execute({"subject": "哈士奇", "count": 20}) # 带参数的问答 llm_param_config = LLMParamConfig(temperature=0.9) skill.execute({"subject": "哈士奇", "count": 20}, llm_param_config) 父主题: Skill(技能)
  • History History缓存,用于存储历史对话信息,辅助模型理解上下文信息,历史消息对有固定窗口、消息摘要等策略。 初始化:消息记录支持不同的存储方式, 如内存、DCS(Redis)和RDS(Sql)。 from pangukitsappdev.memory.sql_message_history import SQLMessageHistory from pangukitsappdev.api.memory.cache.cache_config import ServerInfoSql, ServerInfoRedis from pangukitsappdev.api.memory.message_history_config import MessageHistoryConfig from pangukitsappdev.memory.redis_message_history import RedisMessageHistory from langchain.memory import ChatMessageHistory # 内存型: chat_message = ChatMessageHistory() # Redis: redis_chat_message = RedisMessageHistory(msg_history_config=MessageHistoryConfig(store_name="redis", server_info=ServerInfoRedis(env_prefix="sdk.memory.dcs"), session_tag="test-memory-0624")) # Sql: sql_chat_message = SQLMessageHistory(msg_history_config=MessageHistoryConfig(store_name="sql", server_info=ServerInfoSql(env_prefix="sdk.memory.rds"), session_tag="test-memory-0624")) 添加、查找、删除数据。 # 更新数据 chat_message.add_ai_message("i am ai.") chat_message.add_user_message("i am tester.") # 查找数据 contents = [msg.content for msg in chat_message.messages] # 清理 chat_message.clear() 消息策略(windows-size):将固定轮次历史对话信息,作为历史上下文信息。 from langchain.memory import ChatMessageHistory, ConversationBufferWindowMemory from pangukitsappdev.api.memory.cache.cache_config import ServerInfoRedis # 历史消息存储 redis_chat_message = RedisMessageHistory(msg_history_config=MessageHistoryConfig(store_name="redis", server_info=ServerInfoRedis(env_prefix="sdk.memory.dcs"), session_tag="test-memory")) # 固定窗口策略: langchain.memory.buffer_window.ConversationBufferWindowMemory memory = ConversationBufferWindowMemory(k=3, chat_memory=redis_chat_message) memory.chat_memory.add_user_message("This is me, the human") memory.chat_memory.add_ai_message("This is me, the AI") print(memory.chat_memory.messages) memory.chat_memory.clear() 消息策略(信息摘要) 将历史消息进行摘要后,作为历史上下文信息。 from pangukitsappdev.memory.conversation_summory_memory import ConversationSummaryBufferMemory from pangukitsappdev.api.skill.base import SimpleSkill from pangukitsappdev.prompt.prompt_tmpl import PromptTemplates # 历史消息存储 redis_chat_message = RedisMessageHistory(msg_history_config=MessageHistoryConfig(store_name="redis", server_info=ServerInfoRedis(env_prefix="sdk.memory.dcs"), session_tag="test-memory")) # 摘要策略 memory = ConversationSummaryBufferMemory(summary_skill=SimpleSkill(PromptTemplates.get("memory_summary"), LLMs.of("pangu")), chat_memory=redis_chat_message) memory.chat_memory.add_user_message("This is me, the human") memory.chat_memory.add_ai_message("This is me, the AI") print(memory.chat_memory.messages) memory.chat_memory.clear() 父主题: Memory(记忆)
  • 训练数据集创建流程 数据是大模型训练的基础,提供了模型学习所需的知识和信息。大模型通过对大量数据的学习,能够理解并抽象出其中的复杂模式,从而进行精准的预测和决策。在训练过程中,数据的质量和多样性至关重要。高质量的数据能够提升模型对任务的理解,而多样化的数据则帮助模型更好地应对各种情况。因此,数据的收集和处理是大模型训练中的关键环节。 盘古大模型套件平台通过提供数据获取、清洗、配比与管理等功能,确保构建高质量的训练数据。 父主题: 准备盘古大模型训练数据集
  • 多轮对话 支持上下文记忆的多轮对话。 初始化。 import com.huaweicloud.pangu.dev.sdk.api.llms.LLMs; import com.huaweicloud.pangu.dev.sdk.api.skill.Skills; import com.huaweicloud.pangu.dev.sdk.skill.ConversationSkill; ConversationSkill skill = Skills.newConversationSkill(LLMs.of(LLMs.PANGU)); 问答。 import com.huaweicloud.pangu.dev.sdk.memory.messagehistory.ChatMessageHistory; import com.huaweicloud.pangu.dev.sdk.memory.ConversationBufferMemory; import com.huaweicloud.pangu.dev.sdk.api.memory.config.MemoryStoreConfig; import org.junit.jupiter.api.Assertions; // 定义存储策略 skill.setMemory(new ConversationBufferMemory(MemoryStoreConfig.builder().windowSize(3).messageHistory(new ChatMessageHistory()).build())); String answer = skill.execute("中国首都是哪个城市?"); System.out.println(answer); Assertions.assertTrue(answer.contains("北京")); answer = skill.execute("它有什么好玩的地方?"); System.out.println(answer); Assertions.assertTrue(answer.contains("故宫")); 父主题: Skill(技能)
  • 什么是提示词工程 提示工程是一个较新的学科,应用于开发和优化提示词(Prompt),帮助用户有效地将语言模型用于各种应用场景和研究领域。掌握提示词工程相关技能将有助于用户了解大型语言模型的能力和局限性。 提示工程不仅涉及设计和研发提示词,还包括与大型语言模型的交互和研发中的各种技能和技术。它在实现和对接大型语言模型、理解其能力方面扮演着关键角色。用户可以通过提示工程提高语言模型的安全性,也可以通过专业领域知识和外部工具赋能语言模型,增强其能力。
  • 提示词工程使用流程 盘古大模型套件平台可以辅助用户进行提示词设计、调优、比较和对提示词通用性进行自动评估等功能,并对调优得到的提示词进行保存和管理。 表1 功能说明 功能 说明 提示用例管理 提示用例集用于维护多组提示词变量的信息,可以用于提示词的调优、比较和评估。 支持对用例集的创建、查询、修改、删除。 提示词工程任务管理 提示词工程平台以提示词工程任务为管理维度,一个任务代表一个场景或一个调优需求,在提示词工程任务下可以进行提示词的调优、比较和评估。 提示词工程任务管理支持工程任务的创建、查询、修改、删除。 提示词调优 提示词调优支持对提示词文本的编辑、提示词变量设置、提示词结果生成和调优历史记录管理。 提示词候选 提示词候选支持用户对调优后初步筛选的提示词进行候选管理,每个工程任务下可以保存上限9个候选提示词,进一步基于候选提示词进行比较和评估。 提示词比较 提示词比较支持选择两个候选提示词对其文本和参数进行比较,支持对选择的候选提示词设置相同变量值查看效果。 提示词评估 提示词评估以任务维度管理,支持评估任务的创建、查询、修改、删除。支持创建评估任务,选择候选提示词和需要使用的变量数据集,设置评估算法,执行任务自动化对候选提示词生成结果和结果评估。 提示词管理 提示词管理支持用户对满意的候选提示词进行保存管理,同时支持提示词的查询、删除。 图1 提示词工程使用流程
  • Prompt基本要素 您可以通过简单的提示词获得大量结果,但结果的质量与您提供的信息数量和完善度有关。一个提示词可以包含您传递到模型的指令或问题等信息,也可以包含其他种类的信息,如上下文、输入或示例等。您可以通过这些元素来更好地指导模型,并因此获得更好的结果。提示词主要包含以下要素: 指令:想要模型执行的特定任务或指令。如总结、提取、生成等。 上下文:包含外部信息或额外的上下文信息,引导语言模型更好地响应。 输入数据:用户输入的内容或问题。 输出指示:指定输出的类型或格式。 提示词所需的格式取决于您想要语言模型完成的任务类型,以上要素并非都是必须的。
  • 查看提示词评估结果 评估任务创建完成后,会跳转至“评估”页面,在该页面可以查看评估状态。 图1 查看评估状态 单击评估名称,进入评估任务详情页,可以查看详细的评估进度。例如,在图2中有10条评估用例,当前已经评估了8条,剩余2条待评估。 图2 查看评估进展 评估完成后,进入“评估报告”页面,可以查看每条数据的评估结果。 在评估结果中,“预期结果”即为变量值(问题)所预设的期望回答,“生成结果”即模型回复的结果。通过比较“预期结果”与“生成结果”的差异可以判断提示词效果。 图3 查看评估报告 父主题: 批量评估提示词效果
  • 边缘服务部署流程 边缘部署是指将模型部署到用户的边缘设备上。这些设备通常是用户自行采购的服务器,通过ModelArts服务纳管为边缘资源池。然后利用盘古大模型服务将算法部署到这些边缘资源池中。 图1 边缘资源池创建步骤 当前仅支持预置模型(盘古-NLP-N2-基础功能模型)和基于N2的模型(盘古-NLP-N2-基模型、盘古-NLP-N2-基础功能模型、盘古-NLP-N2-SQL模型、盘古-NLP-N2-Agent模型、盘古-NLP-N2-Code模型)经有监督微调(SFT)训练后的用户模型进行边缘部署。 使用边缘部署功能需要在ModelArts服务中开通“边缘资源池”功能,该功能为白名单特性,需要联系ModelArts服务技术支持人员进行开通。 创建边缘资源池操作较为复杂,建议联系盘古服务技术支持人员进行协助。 父主题: 部署为边缘服务
  • 开发实现 创建配置文件llm.properties, 正确配置iam和pangu配置项。信息收集请参考准备工作。 # # Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. # ################################ GENERIC CONFIG ############################### ## If necessary, you can specify the http proxy configuration. # sdk.proxy.enabled=true # sdk.proxy.url= # sdk.proxy.user= # sdk.proxy.password= ## Generic IAM info. This config is used when the specified IAM is not configured. ## Either user password authentication or AK/SK authentication. # sdk.iam.url= sdk.iam.domain= sdk.iam.user= sdk.iam.password= sdk.iam.project= ## Pangu # Examples: https://{endPoint}/v1/{projectId}/deployments/{deploymentId} ; # sdk.llm.pangu.url=
  • 调用AI助手API 本示例中,通过使用Postman软件调用AI助手API,API的详细请求参数、响应参数介绍请参见AI助手API参数说明。 打开Postman,新建一个POST请求,在地址栏填写获取AI助手API调用地址获取的调用地址。 在Header中配置IAM Token信息。 请求Header参数名为X-Auth-Token,参数值为 获取Token 获取的token值。 请求Header参数名为Content-Type,参数值为application/json。 图7 构造请求 在Body中填写请求消息体。 { "messages": [ { "role": "user", "contents": [ { "type": "text", "content": "帮我定个今天下午3点到8点金桥2303会议室" } ] } ], "assistant_running_param": { "instructions": "你是一个会议室预定助手,可以帮助员工预定会议室", "additional_instructions": "当前的日期为2024-1-25" } } 图8 填写请求Body 查看请求调用结果。 单击“Send”发送请求,请求调用成功后,查看返回结果。 响应示例代码: { "assistant_session_id": "test_session_1", "assistant_id": "6c8eb381-2c34-4ebc-bcf4-3fccb703c977", "required_action": { # 给出了Assistant的思考 "action_id": "c7669ea3-1abd-4d17-aa67-5df19bf3aba5", "message_id": "07daf8d9-38a8-460c-8068-3ff420e76c8d", "thought": "好的,我需要先查询会议室的状态,然后才能帮您预定。现在开始查询会议室状态。", "tool_invoking": [ { "tool_invoking_id": "bdf4f51f-ee58-4a10-8b13-35d45c3ddbe4", "action_id": "c7669ea3-1abd-4d17-aa67-5df19bf3aba5", "tool_id": "meeting_room_status_query", "tool_input": "{\"start\": \"2024-01-25 15:00\", \"end\": \"2024-01-25 20:00\", \"meetingRoom\": \"金桥2303\"}", "metadata": "{\"url\":\"https://host/v1/api\",\"authType\":\"OAuth\"}", } ], "required": true, "usage": { "input_tokens": 589, "output_tokens": 85, "cost": 2941 } }, "assistant_messages": [ { "message_id": "07daf8d9-38a8-460c-8068-3ff420e76c8d", "assistant_session_id": "test_session_1", "role": "assistant", "contents": [ { "type": "text", "content": "" } ], "actions": [ { "action_id": "c7669ea3-1abd-4d17-aa67-5df19bf3aba5", "message_id": "07daf8d9-38a8-460c-8068-3ff420e76c8d", "thought": "好的,我需要先查询会议室的状态,然后才能帮您预定。现在开始查询会议室状态。", "tool_invoking": [ { "tool_invoking_id": "bdf4f51f-ee58-4a10-8b13-35d45c3ddbe4", "action_id": "c7669ea3-1abd-4d17-aa67-5df19bf3aba5", "tool_id": "meeting_room_status_query", "tool_input": "{\"start\": \"2024-01-25 15:00\", \"end\": \"2024-01-25 20:00\", \"meetingRoom\": \"金桥2303\"}", "metadata": "{\"url\":\"https://host/v1/api\",\"authType\":\"OAuth\"}" } ], "required": true, "usage": { "input_tokens": 589, "output_tokens": 85, "cost": 2941 } } ] } ], "status": "requires_action" # status为requires_action表示他需要对这个action进行反馈,required_action中给出了Assistant的思考 }
  • AI助手API参数说明 请求参数 表1 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token,通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Content-Type 是 String 发送的实体的MIME类型,参数值为“application/json”。 表2 请求Body参数 参数 是否必选 参数类型 描述 messages 是 Array of messages objects 对话信息,包含两个属性:role和content。 assistant_running_param 否 Json Schema 用于更改AI助手的指令。包含instructions和additional_instructions两个参数。 instructions:AI助手的描述信息。 additional_instructions:用于在当前会话中向AI助手中补充附加信息,例如与用户查询问题相关的上下文信息。 表3 messages 参数 是否必选 参数类型 描述 content 是 String 表示对话的内容,对话内容为文本(text)类型。 role 否 String 表示对话的角色,取值是user。 响应参数 表4 响应Body参数 参数 参数类型 描述 assistant_session_id String 运行AI助手时的会话id。 assistant_id String AI助手id。 required_action Object 表5 required_action AI助手的思考过程。 assistant_messages Json Schema 会话信息。 status String 会话状态。status为requires_action,表示需要对action进行反馈,required_action中给出了Assistant的思考。 表5 required_action 参数 参数类型 描述 action_id String 动作id。 message_id String 信息id。 thought String AI助手基于思考做出的反馈。 tool_invoking Array tool_invoking AI助手所调用的工具信息。 required String 请求状态。 usage Json Schema 大模型使用情况。 表6 tool_invoking 参数 参数类型 描述 tool_invoking_id String 工具调用id。 action_id String 动作id。 tool_id String 工具id。 tool_output String 调用工具产生的输出结果。 metadata String 调用接口信息。
  • Prompt(提示词模板) 提示词模板模块提供模板格式化、自定义配置管理功能。 模板格式化 from langchain import PromptTemplate from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.llms.llm_config import LLMConfig, LLMParamConfig # 初始化Prompt模板对象 prompt_template = PromptTemplate.from_template("Tell me a {{adjective}} joke about {{content}}", template_format="jinja2") # 支持dict格式匹配替换Prompt模板 format1 = prompt_template.format(**{"adjective": "funny", "content": "chickens"}) assert "Tell me a funny joke about chickens" == format1 # 支持**kwargs匹配替换Prompt模板 format2 = prompt_template.format(adjective="funny", content="chickens") assert "Tell me a funny joke about chickens" == format2 自定义prompt # 按约定的格式准备prompt文件; # 文档结构和文件名参考提供的系统预置prompts文件 文档结构示例: …… prompts -- default -- documents -- stuff.pt # 配置sdk配置项,指定prompt文件绝对路径,以 /home 路径为例 sdk.prompt.path=/home/prompts/default 父主题: Python SDK
  • Agent(智能代理) Agent(智能代理),用于对复杂任务的自动拆解与外部工具调用执行,一般包括任务规划、记忆系统和执行系统。 任务规划:将复杂目标任务分解为小的可执行子任务,通过评估、自我反思等方式提升规划成功率。 记忆系统:通过构建记忆模块去管理历史任务和策略,并让Agent结合记忆模块中相关的信息以获取最优化任务解决策略。 任务执行:能通过工具与外界发生联系并产生影响,工具可以自定义,包括查询信息、调用服务、网络搜索、文件管理、调用云服务等,通过Agent构建一个让LLM按照特定的规则迭代运行的Prompt,直到任务完成或者达到终止条件(如设置迭代次数)。 实例化Tool 实例化Agent 运行Agent 监听Agent Agent流式输出 Tool Retriever 父主题: Python SDK
  • 文档摘要 基于已有的知识库,进行摘要总结。有stuff、refine、map-reduce策略。 Stuff:将所有文档直接填充到prompt中,提给模型处理,适合文档较少的场景。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.summary import DocSummaryStuffSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫" docs = vector_api.similarity_search(query, 4) # 摘要 doc_skill = DocSummaryStuffSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs})) Refine:基于首个文档,并循环后续文档来迭代更新答案。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.summary import DocSummaryRefineSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫" docs = vector_api.similarity_search(query, 4) # 摘要 doc_skill = DocSummaryRefineSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs})) Map-Reduce:先将文档单独进行摘要, 将摘要后的文档再提交给模型。 必要时,会循环迭代摘要。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.summary import DocSummaryMapReduceSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫" docs = vector_api.similarity_search(query, 4) # 摘要 doc_skill = DocSummaryMapReduceSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs})) 父主题: Skill(技能)
  • 为Agent添加一个监听器 通多调用Agent的addListener接口添加一个监听器: from pangukitsappdev.agent.react_pangu_agent import ReactPanguAgent from pangukitsappdev.api.llms.factory import LLMs agent = ReactPanguAgent(LLMs.of("pangu")) agent.add_listener(TestListener())
  • 通过监听终止Agent的执行 当需要在Agent的执行过程中终止执行时,除了通过setMaxIterations设置Agent的最大迭代次数,也可以通过实现监听器的on_check_interrupt_requirement实现。 class InterruptListener(AgentListener): def on_check_interrupt_requirements(self, agent_session: AgentSession): if "capital" == agent_session.current_action.action: # 如果当前的action为captial,则返回capital工具调用的原始返回值 agent_session.final_answer = agent_session.current_action.observation return True return False agent.add_listener(InterruptListener()) 上面的例子中,当满足if判断条件时,就会直接终止agent的执行,并且agent的finalAnswer被设置为工具的原始返回值。
  • 文档问答 基于已有的知识库进行回答。有stuff、refine和map-reduce策略。 Stuff:将所有文档直接填充到prompt中,提给模型回答,适合文档较少的场景。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.ask import DocAskStuffSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫的诗代表了什么主义诗歌艺术的高峰?" docs = vector_api.similarity_search(query, 4) # 问答 doc_skill = DocAskStuffSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs, "question": query})) Refine:基于首个文档,并循环后续文档来迭代更新答案。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.ask import DocAskRefineSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫的诗代表了什么主义诗歌艺术的高峰?" docs = vector_api.similarity_search(query, 4) # 问答 doc_skill = DocAskRefineSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs, "question": query})) Map-Reduce:先将文档单独进行摘要, 将摘要后的文档再提交给模型。 必要时循环迭代摘要。 from pangukitsappdev.api.embeddings.factory import Embeddings from pangukitsappdev.api.llms.factory import LLMs from pangukitsappdev.api.memory.vector.factory import Vectors from pangukitsappdev.api.memory.vector.vector_config import VectorStoreConfig, ServerInfoCss from pangukitsappdev.skill.doc.ask import DocAskMapReduceSkill vector_store_config = VectorStoreConfig(store_name="css", index_name="your_index_name", embedding=Embeddings.of("css"), text_key="name", vector_fields=["description"], distance_strategy="inner_product", server_info=ServerInfoCss(env_prefix="sdk.memory.css")) vector_api = Vectors.of("css", vector_store_config) # 检索 query = "杜甫的诗代表了什么主义诗歌艺术的高峰?" docs = vector_api.similarity_search(query, 4) # 问答 doc_skill = DocAskMapReduceSkill(LLMs.of("pangu")) print(doc_skill.execute({"documents": docs, "question": query})) 父主题: Skill(技能)
  • 为Agent添加一个监听器 通多调用Agent的addListener接口添加一个监听器: import com.huaweicloud.pangu.dev.sdk.agent.ReactPanguAgent; import com.huaweicloud.pangu.dev.sdk.api.llms.LLMs; public static void initAgent() { ReactPanguAgent agent = new ReactPanguAgent(LLMs.of(LLMs.PANGU)); final TestAgentListener testAgentListener = new TestAgentListener(); agent.addListener(testAgentListener); }
  • 通过监听终止Agent的执行 当需要在Agent的执行过程中终止执行时,除了通过setMaxIterations设置Agent的最大迭代次数,也可以通过实现监听器的onCheckInterruptRequirement实现。 agent.addListener(new AgentListener() { @Override public boolean onCheckInterruptRequirement(AgentSession agentSession) { final AgentAction currentAction = agentSession.getCurrentAction(); // 如果当前的action为capital,则返回capital的工具调用原始返回值 if ("capital".equals(currentAction.getAction())) { agentSession.setFinalAnswer(currentAction.getObservation()); return true; } return false; } }); 上述例子中,当满足if判断条件时,会直接终止Agent的执行,且finalAnswer被设置为工具的原始返回值。
  • 配置文件敏感信息加密配置 配置项中的认证凭据等信息不建议明文配置在配置文件中,可以通过以下方式扩展自定义的加解密组件: 在一个module(yourmodule)中自定义一个解密方法decrypt_func(key_id, cipher),要求可以通过`from yourmodule import decrypt_func`这样的方式使用该方法。 在配置文件中配置`sdk.crypto.implementation.path=yourmodule.decrypt_func`指向自定义的解密方法的引用。程序加载时会通过import_lib加载该方法。 配置文件中配置密文的格式:`sdk.llm.iam.iamPwd={Crypto.key_id}cipher`,其中key_id和cipher会在配置项读取时被解析传递进decrypt_func方法中,进行解密。
  • 基础配置项 SDK依赖的配置项主要通过加载llm.properties配置文件。 在项目路径下,创建llm.properties文件,并根据实际需要配置相应的值。 在环境变量中配置“SDK_CONF_PATH”指向该配置文件: # 建议在业务项目入口处配置 import os os.environ["SDK_CONFIG_PATH"] = "./llm.properties" 完整配置项如下: 配置项中的密码等字段建议在配置文件或者环境变量中密文存放,使用时解密,确保安全,详见配置文件敏感信息加密配置。 ################################ GENERIC CONFIG ############################### ## User-defined Prompt. # sdk.prompt.path= ## Proxy. # Examples: http://127.0.0.1:8000 ; # # sdk.proxy.enabled= # sdk.proxy.url= # sdk.proxy.user= # sdk.proxy.password= ## Generic IAM info. This config is used when the specified IAM is not configured. ## Either user password authentication or AK/SK authentication. # sdk.iam.url= sdk.iam.domain= sdk.iam.user= sdk.iam.password= sdk.iam.project= sdk.iam.ak= sdk.iam.sk= sdk.iam.disabled= ################################ LLM ############################### ## Pangu # Examples: https://{endPoint}/v1/{projectId}/deployments/{deploymentId} ; # sdk.llm.pangu.url= ## If necessary, you can specify the IAM configuration. # sdk.llm.pangu.iam.url= # sdk.llm.pangu.iam.domain= # sdk.llm.pangu.iam.user= # sdk.llm.pangu.iam.password= # sdk.llm.pangu.iam.project= # sdk.llm.pangu.iam.disabled= ## If necessary, you can specify the proxy status. # sdk.llm.pangu.proxy.enabled= # sdk.llm.pangu.model-version= ## Gallery # Examples: https://{endPoint}/v1/infers/{deploymentId} ; # sdk.llm.gallery.url= ## If necessary, you can specify the IAM configuration. # sdk.llm.gallery.iam.url= # sdk.llm.gallery.iam.domain= # sdk.llm.gallery.iam.user= # sdk.llm.gallery.iam.password= # sdk.llm.gallery.iam.project= # sdk.llm.gallery.iam.disabled= ## If necessary, you can specify the proxy status. # sdk.llm.gallery.proxy.enabled= ################################ EMBEDDINGS ############################### ## CSS # Examples: https://{endPoint}/v1/{projectId}/applications/{appId}/{modelVersion} ; # sdk.embedding.css.url= ## If necessary, you can specify the IAM configuration. # sdk.embedding.css.iam.url= # sdk.embedding.css.iam.domain= # sdk.embedding.css.iam.user= # sdk.embedding.css.iam.password= # sdk.embedding.css.iam.project= # sdk.embedding.css.iam.disabled= ## If necessary, you can specify the proxy status. # sdk.embedding.css.proxy.enabled= ################################ MEMORY ############################### ## CSS or ES # Examples: http://127.0.0.1:9200,http://127.0.0.2:9200 ; # sdk.memory.css.url= sdk.memory.css.user= sdk.memory.css.password= ## DCS or Redis # Examples: 127.0.0.1:6379 ; # # sdk.memory.dcs.url= # sdk.memory.dcs.user= # sdk.memory.dcs.password= ## RDS or Mysql # Examples: jdbc:mariadb://127.0.0.1:3306/sdk?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai ; # # sdk.memory.rds.url= # sdk.memory.rds.user= # sdk.memory.rds.password= # sdk.memory.rds.poolSize= ################################ DOC SPLIT ############################### ## CSS # Examples: https://{endPoint}/v1/{projectId}/applications/{appId} ; # # sdk.doc.split.css.url= # sdk.doc.split.css.filepath= # sdk.doc.split.css.mode= ## If necessary, you can specify the IAM configuration. # sdk.doc.split.css.iam.url= # sdk.doc.split.css.iam.domain= # sdk.doc.split.css.iam.user= # sdk.doc.split.css.iam.password= # sdk.doc.split.css.iam.project= # sdk.doc.split.css.iam.disabled= ## If necessary, you can specify the proxy status. # sdk.doc.split.css.proxy.enabled=
  • 日志打印配置 SDK日志采用logging模块,参考以下代码开启相应日志打印信息: import logging # 打印在命令行(与打印在文件不同时生效) logging.basicConfig(level=logging.DEBUG) # 打印在日志文件(与打印在命令行不同时生效) logging.basicConfig(level=logging.DEBUG, # 控制台打印的日志级别 filename='new.log', filemode='a', format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')
共100000条