创建知识库逻辑

1. 表单验证系统

文件位置:frontend/packages/data/knowledge/knowledge-modal-base/src/create-knowledge-modal-v2/features/add-type-content/coze-knowledge/index.tsx

知识库创建表单的验证规则:

// 知识库名称验证规则
const nameValidationRules = [{required: true,whitespace: true,message: I18n.t('dataset-name-empty-tooltip'),},{pattern: /^[^"'`\\]+$/,message: I18n.t('dataset-name-has-wrong-word-tooltip'),},
];// 知识库描述验证规则
const descriptionValidationRules = [{maxLength: 2000,message: I18n.t('dataset-description-too-long'),},
];// 格式类型枚举
enum FormatType {Text = 0,   // 文本类型Table = 1,  // 表格类型Image = 2,  // 图片类型
}// 数据导入类型枚举
enum UnitType {TEXT_DOC = 'text_doc',     // 文本文档TABLE_DOC = 'table_doc',   // 表格文档IMAGE_FILE = 'image_file', // 图片文件
}// 知识库创建表单数据接口
export interface CozeKnowledgeAddTypeContentFormData {name: string;                    // 知识库名称description: string;             // 知识库描述format_type: FormatType;         // 格式类型icon_uri?: Array<{              // 图标信息url: string;uri: string;uid: string;isDefault?: boolean;}>;
}// 图标获取逻辑
const fetchIcon = async (formatType: FormatType) => {const { icon } = await KnowledgeApi.GetIcon({format_type: formatType,});setCoverIcon(icon);const currentCover = formApi.getValue('icon_uri');if (!currentCover || currentCover[0]?.isDefault) {formApi.setValue('icon_uri', [{url: icon?.url ?? '',uri: icon?.uri ?? '',uid: icon?.uri ?? '',isDefault: true,},]);}
};

设计亮点

  • 字符限制验证:知识库名称不允许包含特殊字符如引号、反斜杠等
  • 长度限制:名称最大100字符,描述最大2000字符
  • 格式类型支持:支持文本、表格、图片三种主要格式
  • 智能图标获取:根据格式类型自动获取对应的默认图标
  • 数据导入类型:根据格式类型自动匹配对应的导入类型
  • 国际化错误信息:所有验证错误信息都支持多语言

2. 核心逻辑

知识库创建的核心逻辑主要在useCreateKnowledgeModalV2 Hook中:

// 知识库创建核心逻辑
const createDataset = async () => {await formRef.current?.formApi.validate();const { dataset_id: datasetId } = await KnowledgeApi.CreateDataset({project_id: projectID || undefined,name: formRef.current?.formApi.getValue('name'),format_type: currentFormatType,description: formRef.current?.formApi.getValue('description'),icon_uri: formRef.current?.formApi.getValue('icon_uri')?.[0].uid,space_id: spaceId || undefined,});return datasetId;
};// 弹窗配置
const { open, close, modal } = useDataModalWithCoze({title: (<div data-testid={KnowledgeE2e.CreateKnowledgeModalTitle}>{I18n.t('datasets_model_create_title')}</div>),centered: true,onCancel: () => {close();},footer: (<div className="flex w-full justify-end"><Buttoncolor="primary"onClick={() => {close();}}>{I18n.t('cancel')}</Button><LoadingButtoncolor="primary"onClick={async () => {beforeCreate?.(false);const datasetId = await createDataset();if (onFinish) {onFinish(datasetId || '', unitType, false);} else {resourceNavigate.toResource?.('knowledge', datasetId);}}}>{I18n.t('kl_write_108')} {/* 创建 */}</LoadingButton><LoadingButtondata-testid={KnowledgeE2e.CreateKnowledgeModalSubmitAndImportButton}color="primary"onClick={async () => {beforeCreate?.(true);const datasetId = await createDataset();if (onFinish) {onFinish(datasetId || '', unitType, true);} else {resourceNavigate.upload?.({ type: unitType });}}}>{I18n.t('kl_write_109')} {/* 创建并导入 */}</LoadingButton></div>),
});// 返回Hook接口
return {modal: modal(<Form<CozeKnowledgeAddTypeContentFormData>ref={formRef}showValidateIcon={false}><CozeKnowledgeAddTypeContentonImportKnowledgeTypeChange={setUnitType}onSelectFormatTypeChange={setCurrentFormatType}/></Form>,),open: () => {setCurrentFormatType(FormatType.Text);open();},close,
};

设计亮点

  • 双模式支持:支持"仅创建"和"创建并导入"两种模式
  • 表单验证:创建前进行完整的表单验证
  • 状态管理:通过Hook统一管理弹窗状态和数据流
  • 错误处理:完善的错误处理和用户反馈机制
  • 导航控制:创建成功后智能导航到对应页面

API层设计与实现

IDL基础类型定义(knowledge.thrift)

文件位置:idl/data/knowledge/knowledge.thrift
核心代码:

include "../../base.thrift"
include "common.thrift"namespace go data.knowledgestruct CreateDatasetRequest  {1: string name                   // 知识库名称,长度不超过100个字符2: string description            // 知识库描述3: i64 space_id (agw.js_conv="str", api.js_conv="true")  // 空间ID4: string icon_uri                // 知识库头像URI5: common.FormatType format_type  // 格式类型6: i64 biz_id (agw.js_conv="str", api.js_conv="true") // 开放给第三方业务标识,coze传0或不传7: i64 project_id (agw.js_conv="str", api.js_conv="true") // 项目ID255: optional base.Base Base
}struct CreateDatasetResponse {1: i64    code2: string msg3: i64    dataset_id (agw.js_conv="str", api.js_conv="true")255: optional base.BaseResp BaseResp
}enum DatasetStatus {DatasetProcessing = 0  // 处理中DatasetReady      = 1  // 可用DatasetDeleted    = 2  // 软删除DatasetForbid     = 3  // 禁用DatasetFailed     = 9  // 失败
}struct Dataset {1: i64                dataset_id (agw.js_conv="str", api.js_conv="true")2: string             name3: string             description4: string             icon_uri5: common.FormatType  format_type6: DatasetStatus      status7: i64                create_time8: i64                update_time9: i64                space_id (agw.js_conv="str", api.js_conv="true")10: i64               project_id (agw.js_conv="str", api.js_conv="true")
}

文件作用:
定义了知识库相关的数据结构,包括创建请求、响应和知识库实体定义。

创建知识库-IDL接口定义(knowledge_svc.thrift)

文件路径:idl/data/knowledge/knowledge_svc.thrift
核心代码:

include "slice.thrift"
include "knowledge.thrift"
include "document.thrift"
include "common.thrift"
include "review.thrift"namespace go data.knowledgeservice DatasetService {// 知识库相关knowledge.GetIconResponse GetIconForDataset(1:knowledge.GetIconRequest req) (api.post='/api/knowledge/icon/get', api.category="knowledge",agw.preserve_base="true")knowledge.CreateDatasetResponse CreateDataset(1:knowledge.CreateDatasetRequest req) (api.post='/api/knowledge/create', api.category="knowledge",agw.preserve_base="true")knowledge.DatasetDetailResponse DatasetDetail(1:knowledge.DatasetDetailRequest req) (api.post='/api/knowledge/detail', api.category="knowledge",agw.preserve_base="true")knowledge.ListDatasetResponse ListDataset(1:knowledge.ListDatasetRequest req) (api.post='/api/knowledge/list', api.category="knowledge",agw.preserve_base="true")knowledge.DeleteDatasetResponse DeleteDataset(1:knowledge.DeleteDatasetRequest req) (api.post='/api/knowledge/delete', api.category="knowledge",agw.preserve_base="true")knowledge.UpdateDatasetResponse UpdateDataset(1:knowledge.UpdateDatasetRequest req) (api.post='/api/knowledge/update', api.category="knowledge",agw.preserve_base="true")knowledge.GetModeConfigResponse GetModeConfig(1:knowledge.GetModeConfigRequest req)(api.get='/api/memory/table_mode_config', api.category="memory", agw.preserve_base="true")// 文档相关document.CreateDocumentResponse CreateDocument(1:document.CreateDocumentRequest req) (api.post='/api/knowledge/document/create', api.category="knowledge",agw.preserve_base="true")document.ListDocumentResponse ListDocument(1:document.ListDocumentRequest req) (api.post='/api/knowledge/document/list', api.category="knowledge",agw.preserve_base="true")document.DeleteDocumentResponse DeleteDocument(1:document.DeleteDocumentRequest req) (api.post='/api/knowledge/document/delete', api.category="knowledge",agw.preserve_base="true")document.UpdateDocumentResponse UpdateDocument(1:document.UpdateDocumentRequest req) (api.post='/api/knowledge/document/update', api.category="knowledge",agw.preserve_base="true")
}

源码作用:定义知识库创建、更新、删除和获取相关的接口

知识库格式类型定义(common.thrift)

文件路径:idl/data/knowledge/common.thrift
核心代码:

enum FormatType {Text  = 0  // 文本格式Table = 1  // 表格格式Image = 2  // 图片格式Database = 3 // 数据库格式
}struct Icon {1: string uri  // 图标URI2: string url  // 图标URL
}struct GetIconRequest {1: FormatType format_type  // 格式类型255: optional base.Base Base
}struct GetIconResponse {1: i64  code2: string msg3: Icon icon255: optional base.BaseResp BaseResp
}

源码作用:定义知识库相关的枚举类型和通用结构体

创建知识库-API接口实现(knowledge-api.ts)

文件位置:frontend/packages/arch/bot-api/src/knowledge-api.ts

核心代码:

import KnowledgeService from './idl/knowledge';
import { axiosInstance, type BotAPIRequestConfig } from './axios';// eslint-disable-next-line @typescript-eslint/naming-convention
export const KnowledgeApi = new KnowledgeService<BotAPIRequestConfig>({request: (params, config = {}) => {const { headers } = config;const reqHeaders = {...headers,'Agw-Js-Conv': 'str',};return axiosInstance.request({ ...params, ...config, headers: reqHeaders });},
});

知识库服务类实现

文件位置:frontend/packages/arch/idl/src/auto-generated/knowledge/index.ts

核心代码:

export default class KnowledgeService<T> {private request: any = () => {throw new Error('KnowledgeService.request is undefined');};private baseURL: string | ((path: string) => string) = '';constructor(options?: {baseURL?: string | ((path: string) => string);request?<R>(params: {url: string;method: 'GET' | 'DELETE' | 'POST' | 'PUT' | 'PATCH';data?: any;params?: any;headers?: any;},options?: T,): Promise<R>;}) {this.request = options?.request || this.request;this.baseURL = options?.baseURL || '';}/** POST /api/knowledge/create */CreateDataset(req?: dataset.CreateDatasetRequest,options?: T,): Promise<dataset.CreateDatasetResponse> {const _req = req || {};const url = this.genBaseURL('/api/knowledge/create');const method = 'POST';const data = {name: _req['name'],description: _req['description'],space_id: _req['space_id'],icon_uri: _req['icon_uri'],format_type: _req['format_type'],biz_id: _req['biz_id'],project_id: _req['project_id'],storage_location: _req['storage_location'],Base: _req['Base'],};return this.request({ url, method, data }, options);}/** POST /api/knowledge/icon/get */GetIcon(req?: dataset.GetIconRequest,options?: T,): Promise<dataset.GetIconResponse> {const _req = req || {};const url = this.genBaseURL('/api/knowledge/icon/get');const method = 'POST';const data = { format_type: _req['format_type'] };return this.request({ url, method, data }, options);}/** POST /api/knowledge/delete */DeleteDataset(req?: dataset.DeleteDatasetRequest,options?: T,): Promise<dataset.DeleteDatasetResponse> {const _req = req || {};const url = this.genBaseURL('/api/knowledge/delete');const method = 'POST';const data = { dataset_id: _req['dataset_id'], Base: _req['Base'] };return this.request({ url, method, data }, options);}// ... 其他API方法
}

代码作用:KnowledgeService 类包含知识库相关的API方法:

  • CreateDataset:用于创建知识库,调用 /api/knowledge/create 接口
  • GetIcon:用于获取知识库图标,调用 /api/knowledge/icon/get 接口
  • DeleteDataset:用于删除知识库,调用 /api/knowledge/delete 接口

此文件是基于knowledge.thrift自动生成的,开发者无需手动修改。

创建知识库–结构体实现(knowledge.ts)

文件路径:frontend\packages\arch\idl\src\auto-generated\knowledge\namespaces\knowledge.ts

export interface CreateDatasetRequest {name: string;                    // 知识库名称description: string;             // 知识库描述space_id: string;                // 空间IDicon_uri?: string;               // 知识库头像URIformat_type: FormatType;         // 格式类型biz_id?: string;                 // 业务IDproject_id?: string;             // 项目ID
}export interface CreateDatasetResponse {code: Int64;msg: string;dataset_id: string;              // 知识库ID
}export interface GetIconRequest {format_type: FormatType;         // 格式类型
}export interface GetIconResponse {code: Int64;msg: string;icon: Icon;                      // 图标信息
}export interface DeleteDatasetRequest {dataset_id: string;              // 知识库ID
}export interface DeleteDatasetResponse {code: Int64;msg: string;
}export enum FormatType {Text = 0,                        // 文本格式Table = 1,                       // 表格格式Image = 2,                       // 图片格式Database = 3,                    // 数据库格式
}export enum DatasetStatus {DatasetProcessing = 0,           // 处理中DatasetReady = 1,                // 可用DatasetDeleted = 2,              // 软删除DatasetForbid = 3,               // 禁用DatasetFailed = 9,               // 失败
}export interface Icon {uri: string;                     // 图标URIurl: string;                     // 图标URL
}

idl2ts-cli 工具

工具名称

@coze-arch/idl2ts-cli

详细地址

项目路径frontend/infra/idl/idl2ts-cli/

工具详细信息

版本:0.1.7

描述:IDL(Interface Definition Language)到TypeScript的转换工具

主要功能

  1. gen命令:从Thrift或Protocol Buffer文件生成API代码
  2. filter命令:生成过滤后的API类型定义

可执行文件idl2ts(位于 ./src/cli.js
最终调用的是frontend/infra/idl/idl2ts-cli/src/cli.ts 这个文件

核心依赖

  • @coze-arch/idl2ts-generator:代码生成器
  • @coze-arch/idl2ts-helper:辅助工具
  • @coze-arch/idl2ts-plugin:插件系统
  • commander:命令行界面
  • prettier:代码格式化

使用方式

# 生成API代码
idl2ts gen <projectRoot> [-f --format-config <formatConfig>]# 生成过滤类型
idl2ts filter <projectRoot> [-f --format-config <formatConfig>]

许可证:Apache-2.0

作者:fanwenjie.fe@bytedance.com

这个工具是Coze Studio项目中统一处理所有IDL文件(包括knowledge.thrift和相关知识库IDL文件)的核心工具,确保了整个项目中知识库API代码生成的一致性。

知识库相关IDL文件处理

该工具主要处理以下知识库相关的IDL文件:

  1. knowledge.thrift - 知识库核心数据结构定义
  2. knowledge_svc.thrift - 知识库服务接口定义
  3. common.thrift - 知识库通用类型定义
  4. document.thrift - 知识库文档相关定义

生成的知识库相关代码

在知识库开发过程中,该工具能够:

  • 自动生成知识库API类型:包括CreateDatasetRequest、CreateDatasetResponse等接口类型
  • 生成知识库服务类:KnowledgeService类及其所有方法
  • 确保类型安全:所有知识库API调用都有完整的TypeScript类型支持
  • 统一代码风格:通过Prettier确保生成代码的格式一致性
  • 支持多种格式:处理文本、表格、图片等不同格式的知识库类型定义

知识库开发工作流

# 1. 修改知识库相关IDL文件
vi idl/data/knowledge/knowledge.thrift# 2. 生成TypeScript代码
idl2ts gen frontend/# 3. 自动更新前端API接口
# 生成路径:frontend/packages/arch/idl/src/auto-generated/knowledge/

这确保了知识库功能的前后端接口定义始终保持同步,大大提高了开发效率和代码质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922304.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922304.shtml
英文地址,请注明出处:http://en.pswp.cn/news/922304.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧拉函数 | 定义 / 性质 / 应用

注&#xff1a;本文为 “欧拉函数” 相关合辑。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 欧拉函数最全总结 jiet07 已于 2024-10-22 10:00:54 修改 一、欧拉函数的引入 首先引入互质关系&#xff1a; 如果两个正整数&#xff0c;除了 111 以…

ubuntu git push每次都要输入密码怎么解决只输入一次密码

在 Ubuntu 下使用 Git 时&#xff0c;如果每次 push 都需要重复输入密码&#xff0c;可以通过配置 Git 凭证存储来解决。以下是几种常用方法&#xff1a; &#x1f511; 方法一&#xff1a;使用 Git 凭证缓存&#xff08;推荐&#xff09; 设置凭证缓存&#xff08;默认 15 分钟…

【机械故障】使用fir滤波器实现数据拟合

使用fir滤波器实现数据拟合 提示&#xff1a;学习笔记 使用fir滤波器实现数据拟合使用fir滤波器实现数据拟合一、问题建模二、 构建矩阵方程&#xff08;关键步骤&#xff09;三、最小二乘解四、重要注意事项4.1 滤波器长度 M4.2 数据的预处理4.3 延迟问题4.4 性能评估一、问题…

STC8H系列-高级PWM-两相步进电机-细分驱动

两相步进电机, STC8H系列 用高级PWM实现SPWM细分驱动 /************* 功能说明 ************** 用B组高级PWM细分驱动2相4线小型步进电机, 支持1、2、4、8、16、32、64细分, 比如1.8度的电机4细分到0.45度. 本程序用于演示SPWM多细分直接驱动2相4线小型步进电机…

内网环境下ubuntu 20.04搭建深度学习环境总结

2025年9月更新&#xff0c;随着人工智能的发展&#xff0c;现在深度学习环境配置越来越简单了&#xff0c;常用的pytorch、paddle&#xff08;3.x&#xff09;等深度学习库安装的时候自带了cuda和cudnn的python包&#xff0c;不需要在操作系统层面自己安装&#xff0c;配置环境…

深入 Linux 文件系统:从数据存储到万物皆文件

深入 Linux 文件系统&#xff1a;从数据存储到万物皆文件 Linux 文件系统是一个精妙而复杂的工程&#xff0c;它像一座图书馆&#xff0c;不仅存放着书籍&#xff08;数据&#xff09;&#xff0c;还有一套高效的卡片索引系统&#xff08;元数据&#xff09;来管理它们。本文将…

C++, ffmpeg, libavcodec-RTSP拉流,opencv实时预览

文章目录RTSPStreamPlayer.cppRTSPStreamPlayer.hmain.cpp编译运行在ffmpeg_rtsp原有的rtsp拉流项目基础上加入了udp连接rtsp&#xff0c;日志模块&#xff0c;opencv实施预览等功能。RTSPStreamPlayer.cpp #include "RTSPStreamPlayer.h" #include <iostream>…

MySQL在Ubuntu 20.04 环境下的卸载与安装

目录 前言&#xff1a;学习引入 1、安装注意事项 2、学习建议 3、MySQL 和 MariaDB 核心概念一&#xff1a;它们是什么&#xff1f; 核心概念二&#xff1a;它们如何工作&#xff1f;&#xff08;“仓库”比喻&#xff09; 核心概念三&#xff1a;为什么它们如此流行&…

BizDevOps 是什么?如何建设企业 BizDevOps 体系

在数字经济加速渗透的今天&#xff0c;企业数字化转型已从 “技术升级” 转向 “价值重构”&#xff0c;单纯的 IT 研发或业务优化已难以适应市场快速变化。业务研发运营一体化&#xff08;BizDevOps&#xff09;作为打通 “业务 - 技术 - 运维” 协同壁垒的核心模式&#xff0…

Mac菜单栏综合工具FancyTool更新啦

本次更新聚焦「轻量体验」深度优化&#xff1a;不仅重构了 CPU 占用逻辑与系统唤醒机制&#xff0c;让后台运行更高效&#xff1b;更让动画交互全程保持丝滑流畅&#xff0c;资源消耗却低到近乎无感 —— 哪怕它常驻菜单栏&#xff0c;你也几乎察觉不到它的存在&#xff0c;既不…

ARM汇编 led

1.相关介绍本次用的开发板是IMX6ULLCPU&#xff1a;NXP i.MX 6ULL Cortex-A7单核处理器&#xff0c;主频 528MHz&#xff08;工业级&#xff09; 或 800MHz&#xff08;商业级&#xff09;467, GBA封装内存&#xff1a;512MB DDR3L RAM&#xff0c;支持高速数据存取。存储&…

弹窗分页保留其他页面勾选的数据(vue)

如图所示&#xff0c;这是个常见的多选todolist不过这里多了个要求&#xff0c;弹窗上下页面切换的时候需要保留勾选结果这其实也不难&#xff0c;但是如果每次都手动写一遍却有点恼人&#xff0c;这次捋一下思路&#xff0c;并把核心代码记录一下&#xff0c;方便下次翻找核心…

分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案

随着智能电视、流媒体设备的普及&#xff0c;用户对高质量音频输出的需求激增。为解决多设备协同、无线化传输及ARC高保真音频传输的痛点&#xff0c;纳祥科技推出HDMI ARC音频转换方案&#xff1a;HDMI ARC音频转光纤/同轴/I2S/左右声道&#xff0c;桥接无线音频发射设备&…

在WPF项目中使用阿里图标库iconfont

使用阿里图标库的步骤&#xff1a; 1。从阿里图标库官方网站上下载图标。 2。把阿里图标库&#xff08;WPF中支持.ttf字体文件&#xff09;引入 3。在App.xaml中添加图标的全局样式。推荐在此处添加全局样式&#xff0c;为了保证图标可以在所有窗体中使用。 代码如下&#x…

vue3项目启动流程讲解

Vue 3 项目启动流程详解Vue 3 项目的启动流程相比 Vue 2 有了显著变化&#xff0c;采用了新的应用实例创建方式和组合式 API。下面我将详细讲解 Vue 3 项目的启动过程&#xff0c;并提供一个可视化演示。实现思路创建 Vue 3 应用实例配置根组件和必要的插件挂载应用到 DOM展示启…

【C++】LLVM-mingw + VSCode:Windows 开发攻略

LLVM-mingw 是一个基于 LLVM 项目的开源工具链&#xff0c;用于在类 Unix 系统&#xff08;如 Linux 或 macOS&#xff09;上为 Windows 平台交叉编译应用程序&#xff0c;它结合了 LLVM 编译器基础设施&#xff08;包括 Clang C/C/Objective-C 编译器和 LLD 链接器&#xff0c…

AI内容标识新规实施后,大厂AI用户协议有何变化?(六)科大讯飞

科大讯飞也是国产老将&#xff0c;当年OpenAI横空出世&#xff0c;国内唯有文心和星火能与之一战&#xff0c;早期效果感觉甚至是优于文心的&#xff0c;只是后面再也没有什么大动静出来。讯飞也算大厂了&#xff0c;但跟百度阿里这些老牌互联网门阀相比&#xff0c;还是不够持…

Error: MiniProgramError{“errMsg“:“navigateTo:fail webview count limit exceed“}

这个错误 "navigateTo:fail webview count limit exceed" 是微信小程序中常见的页面栈溢出问题&#xff0c;原因是微信小程序对页面栈深度有默认限制&#xff08;通常为10层&#xff09;&#xff0c;当使用 navigateTo 连续跳转页面导致页面栈超过限制时就会触发。解…

少即是多:从 MPTCP 看优化干预的边界

“对待端到端传输&#xff0c;信息不足就要少干预&#xff0c;越干预越糟糕”&#xff0c;这是我的信条&#xff0c;这次再来说说 MPTCP。 Linux 内核 MPTCP 最好的调度算法就是 default 算法&#xff0c;没有之一&#xff0c;因为它以代价最小&#xff0c;最自然的方式做到了保…

“开源AI智能名片链动2+1模式S2B2C商城小程序”在直播公屏引流中的应用与效果

摘要&#xff1a;本文聚焦于直播公屏引流场景&#xff0c;探讨“开源AI智能名片链动21模式S2B2C商城小程序”如何通过技术赋能与模式创新&#xff0c;重构直播电商的流量获取与转化路径。研究结合案例分析与实证数据&#xff0c;揭示该方案在提升用户互动、优化供应链管理、降低…