安装与运维

本文档提供在客户基础设施中安装和运行 Parsewise 所需的信息:交付清单、环境要求、配置、安装步骤与运维。

1. 交付清单

组成部分内容
服务器镜像编程接口服务器、队列处理器和任务调度器:同一个镜像,以三个独立部署、不同启动命令运行
管理面板镜像项目员工和管理员使用的 Web 界面
向量化服务镜像推理服务器,内置向量化模型 deepvk/USER-bge-m3(向量维度 1024);由该镜像运行两个资源池——分别用于索引和搜索查询
小部件静态包 widget.iife.js 和 widget.css,用于放置在网站或个人账户中
Kubernetes 清单k8s 仓库中的文件:manifests/00-namespace.yaml、02-backend.yaml、02a-embedder-index.yaml、02b-embedder-query.yaml、03-celery.yaml、03a-backend-domains-rbac.yaml、04-admin-frontend.yaml、06-ingress.yaml、06a-ingress-shops.yaml,密钥模板 docs/delivery-secrets-template.yaml 和存储桶访问策略示例 storage/media-bucket-policy.json,以及服务器仓库文件 k8s/custom-domains.yaml——项目自有域名的路由:部署、服务、路由、自动扩缩;队列处理器用于接入项目自有域名的账号和权限
文档本文档、功能特性、用户与管理员手册

交付清单是权利人云端实例所用的清单,其中写有该实例的地址和服务。应用之前,客户需将其调整为自己的部署:

  • 镜像地址——改为交付仓库中的版本;
  • 服务器和队列处理器清单中直接写入的值:FRONTEND_URL、SHOPS_DOMAIN、R2_ENDPOINT、R2_PUBLIC_URL、SMTP_HOST、SMTP_PORT、SMTP_USE_TLS、SMTP_START_TLS——改为自己的值(清单中的值优先于密钥中的值);LLM_MODEL_QUERY——改为自己的模型名称或删除;
  • 对密钥项 yandex-gpt-api-key、yandex-gpt-folder-id、yandex-maps-api-key 以及密钥 metrika-credentials 的引用——删除:它们只在云端实例中需要,缺少它们时集群中的 Pod 无法启动;
  • 管理面板清单中——删除 NEXT_PUBLIC_API_URL 和 NEXT_PUBLIC_YM_COUNTER_ID,并设置第 3 节中的 PARSEWISE_* 参数;
  • 密钥模板——填入自己的值并应用;其中包含交付清单读取的全部密钥,包括带有 SECRET_KEY、DOCS_USERNAME、DOCS_PASSWORD、EMAIL_FROM、INGRESS_LB_IP、LLM_BASE_URL 参数的 app-config-full;
  • 客户不使用的服务的参数——删除:Robokassa 收款、Yandex Metrica;
  • 存储桶访问策略示例——填入自己的存储桶名称和服务器账号;该示例针对 Yandex Object Storage 编写,在其他存储中用其自身工具设置相同的访问规则(第 2 节);
  • 对于 项目.域名 形式的项目地址——通过 cert-manager 在自己的 DNS 服务商处以 DNS01 验证签发 *.域名 证书,并在 06a-ingress-shops.yaml 中引用。

营销网站、文档和监控的清单不在交付范围内。

镜像以 OCI 归档形式交付,用于导入客户的镜像仓库,或通过权利人的镜像仓库获取。

镜像基于权利人的镜像源构建:构建时不从公共仓库下载基础镜像、Python 包和 npm 包。为处理音频和视频,服务器镜像包含 Debian 发行版中的 ffmpeg。安装和启动时不下载向量化模型。服务器和管理面板容器中的进程以非特权用户运行。

2. 环境要求

组件要求
编排器Kubernetes;软件在 1.32 版本上运行。清单使用 apps/v1、autoscaling/v2、networking.k8s.io/v1、rbac.authorization.k8s.io/v1 API
节点x86-64 架构(linux/amd64);组件以容器形式交付,不需要节点特权:不使用特权模式,不访问节点的文件系统和网络。节点操作系统为带有 Kubernetes 支持的容器运行时的 Linux,包括 Astra Linux Special Edition 1.8、RED OS 8 和 ALT Linux
指标服务器Kubernetes 指标服务器——自动扩缩依据 Pod 的 CPU 和内存负载
镜像仓库兼容 OCI,可从集群访问
入口控制器ingress-nginx 或同类产品:TLS、按域名路由、请求体上限不低于 100 MB、连接/发送/读取超时不低于 300 秒——助手的回答以流式传输
TLS 证书由 cert-manager 为入口控制器签发,使用客户选择的 ClusterIssuer,包括客户内部的证书颁发机构;在云端实例中权利人使用公共证书颁发机构
PostgreSQL两个数据库:主库和向量库;软件在 PostgreSQL 15 上运行
pgvector向量库中的扩展:必须提供 vector 类型;软件会创建 IVFFlat 索引
Redis队列代理和缓存;软件在与 Redis 兼容的 Valkey 7.2 上运行
对象存储兼容 S3,一个存储桶。管理面板通过签名链接直接从浏览器向存储上传文件;管理面板和小部件也通过签名链接获取知识库文件和对话附件。因此存储必须能通过 HTTPS 从用户浏览器访问,且存储桶的 CORS 规则须允许来自管理面板地址的 GET 和 PUT 请求。仅公开对象允许免授权读取——头像、封面、商品和人员档案的媒体、评价照片、技能资源:前缀 system/、users/、skills/、tmp/、shops/*/avatar/、shops/*/cover/、shops/*/bot_avatar/、shops/*/products/、shops/*/temp/、shops/*/reviews/。知识库文件(shops/*/files/)和对话附件(shops/*/chats/)不允许免授权获取,存储桶对象列表同样不允许。提供给服务器的密钥所属账号需要读取、写入、删除和列出对象的权限
语言模型由客户托管,兼容 OpenAI 的编程接口——例如 vLLM
互联网访问在客户环境内托管语言模型时不需要,以下功能开启时除外:音频和视频语音识别(Yandex SpeechKit)、通过 Yandex ID 和 VK ID 登录。无法访问 Yandex SpeechKit 时文件仍会保存,但不会从中提取语音

每个服务器和队列处理器 Pod 最多打开 40 个 PostgreSQL 连接。副本数较多时建议使用连接池,例如 PgBouncer 或 Odyssey。

计算资源

组件副本数CPU / 内存请求CPU / 内存上限自动扩缩
编程接口服务器1–10500m / 512Mi2000m / 2GiCPU 70%,内存 80%
队列处理器4–10500m / 1Gi2000m / 4GiCPU 70%,内存 80%
任务调度器恰好 1 个50m / 128Mi200m / 256Mi无
向量化(索引)2–61000m / 2.5Gi4000m / 4GiCPU 70%
向量化(查询)2–6500m / 2.5Gi2000m / 4GiCPU 70%
管理面板1–10200m / 256Mi1000m / 1GiCPU 70%

不含 Kubernetes 系统组件的资源请求总量:最小副本数时约 5.8 vCPU 和 14.9 GiB 内存,最大副本数时约 21.1 vCPU 和 47.6 GiB。节点必须能容纳内存请求为 2.5 GiB 的向量化 Pod。

权利人运行软件所用的配置:4–10 个节点,每个 4 vCPU、8 GiB,可自动添加节点;主库和向量库为独立的 PostgreSQL 15 集群,每个 2 vCPU、8 GiB,磁盘 20 GiB 并可自动扩展至 64 GiB;Valkey 7.2——2 vCPU、4 GiB。

3. 配置

服务器、队列处理器和调度器的参数通过环境变量设置——来自 Kubernetes 密钥或清单中的值(第 1 节)。三个部署获得相同的数据库、Redis 和对象存储连接参数。

必填

参数用途
DATABASE_URLPostgreSQL 主数据库
VECTOR_DATABASE_URL带 pgvector 的向量数据库。缺少该参数时向量存储不会启动:系统有意禁止以主库代替
REDIS_URL队列代理和缓存
SECRET_KEY会话令牌签名密钥
R2_ENDPOINT、R2_ACCESS_KEY_ID、R2_SECRET_ACCESS_KEY、R2_BUCKET、R2_PUBLIC_URL对象存储:地址、访问密钥、存储桶,以及浏览器获取存储桶公开对象所用的地址。软件基于 R2_ENDPOINT 地址生成知识库文件和对话附件的签名链接。参数名称沿用历史命名,任何兼容 S3 的存储均可使用
DOCS_USERNAME、DOCS_PASSWORD访问 /v1/docs 编程接口文档的用户名和密码
FRONTEND_URL客户管理面板的地址;用于邮件中的链接
EMAIL_FROM邮件发件人地址
SHOPS_DOMAIN项目.域名 形式项目地址的域名;用于项目地址以及企业登录(SSO)主机校验
INGRESS_LB_IP入口控制器的外部地址;在接入项目自有域名时显示于 DNS 配置提示中
SMTP_HOST、SMTP_PORT、SMTP_USER、SMTP_PASSWORD、SMTP_USE_TLS、SMTP_START_TLS邮件服务器。必填:密码登录需要用邮件中的验证码确认地址,找回密码和项目邀请也通过邮件发送

参数 FRONTEND_URL、EMAIL_FROM、SHOPS_DOMAIN 和 INGRESS_LB_IP 的默认值指向权利人的云端实例,因此在客户的部署中必须设置。

语言模型

参数值
LLM_SERVICEopenai——任何具有兼容 OpenAI 接口的模型。需显式设置:默认值 yandex 会将请求发送至 Yandex Cloud
LLM_BASE_URL客户模型的地址,例如 http://llm.internal:8000/v1
LLM_MODEL模型名称。缺少 LLM_BASE_URL 和 LLM_MODEL 时不会初始化模型连接
OPENAI_API_KEY模型访问密钥(若模型服务器需要);可选
LLM_MODEL_QUERY用于改写搜索查询的独立模型;可选,未设置时使用 LLM_MODEL。在云端实例的清单中直接设置(第 1 节)

软件不使用 OpenAI 公司的服务:“兼容 OpenAI”仅指 vLLM 及其他模型服务器所支持的编程接口格式。名称 openai 和 OPENAI_API_KEY 沿用该格式。

向量化

参数用途
LOCAL_EMBEDDING_URL用于索引的向量化服务地址
QUERY_EMBEDDING_URL用于搜索查询的向量化资源池地址;未设置时使用 LOCAL_EMBEDDING_URL

可选

参数用途
MAX_UPLOAD_SIZE通过链接从来源下载的文件大小上限(字节);默认 100 MiB
FILE_URL_TTL_SECONDS知识库文件或对话附件签名链接的有效期(秒);默认 3600。已签发的链接有效时间不少于该期限的一半,不超过该期限
YANDEX_SPEECHKIT_API_KEY、YANDEX_SPEECHKIT_FOLDER_ID、SPEECH_LANGUAGES通过 Yandex SpeechKit 识别音频和视频中的语音及识别语言

管理面板与小部件

管理面板在启动时从容器环境变量读取部署参数。未设置的变量保留镜像构建时的值;值为空的变量会关闭相应功能。镜像以权利人云端实例的值构建——Yandex Metrica 计数器、Yandex ID 和 VK ID 应用、位于 releases.parsewise.ru 的小部件地址——因此在客户的部署中,PARSEWISE_YM_COUNTER_ID、PARSEWISE_YANDEX_CLIENT_ID 和 PARSEWISE_VK_CLIENT_ID 需显式设置为自己的值或空值,PARSEWISE_WIDGET_SCRIPT_URL 设置为小部件在客户基础设施中的地址。

参数用途
PARSEWISE_API_URL编程接口服务器地址;同时加入管理面板页面的内容安全策略
PARSEWISE_APP_URL管理面板地址;该主机提供管理面板,其他主机提供项目访客页面
PARSEWISE_ADMIN_HOSTS管理面板的其他主机,以逗号分隔
PARSEWISE_SHOPS_DOMAIN项目.域名 形式项目地址的域名
PARSEWISE_PRIVACY_URL、PARSEWISE_TERMS_URL、PARSEWISE_OFFER_URL个人数据处理政策、使用条款和要约的链接
PARSEWISE_SALES_EMAIL价格咨询地址
PARSEWISE_YM_COUNTER_IDYandex Metrica 计数器;空值关闭 Metrica
PARSEWISE_YANDEX_CLIENT_ID、PARSEWISE_VK_CLIENT_ID通过 Yandex ID 和 VK ID 登录所用的应用标识;空值关闭该登录方式
PARSEWISE_WIDGET_SCRIPT_URL管理面板写入接入代码中的小部件文件地址
PARSEWISE_STORAGE_URL对象存储地址,与服务器的 R2_ENDPOINT 相同;加入管理面板页面的内容安全策略以及管理面板显示文件所用的存储列表

小部件通过页面上 window.ParsewiseConfig 中的 apiUrl 参数获取编程接口服务器地址,同时获取项目标识 shopId;个人数据处理政策链接通过 privacyPolicyUrl 参数或项目设置获取。

同一份管理面板和小部件构建可在任何部署中使用:无需针对客户的地址和参数重新构建。

4. 安装

  1. 准备 PostgreSQL:主库和向量库。向量库中必须提供 vector 类型。若没有,软件会执行 CREATE EXTENSION IF NOT EXISTS vector;若应用角色没有该权限,由数据库管理员预先执行 CREATE EXTENSION vector。
  2. 准备 Redis 和兼容 S3 的对象存储存储桶;按第 2 节配置 CORS 规则和存储桶对象访问。
  3. 将镜像导入集群可访问的镜像仓库,并在清单中填写其地址。
  4. 创建命名空间以及包含第 3 节参数的密钥。
  5. 在路由清单中填写编程接口和管理面板的域名,配置 TLS。
  6. 应用清单。服务器启动时会创建主库中缺失的表,并应用镜像中包含的迁移;向量存储会创建自己的表和索引。
  7. 将小部件文件放到客户的静态服务器或对象存储中。
  8. 检查安装:
    • 所有 Pod 均处于就绪状态;向量化 Pod 加载模型最多需要三分钟;
    • 向编程接口服务器发送 GET /v1/public/health 请求返回 {"status": "ok"};
    • 服务器日志中有 Alembic migrations applied (head reached) 一行,且没有 Alembic upgrade failed 消息和 pgvector 错误。

5. 开始使用

  1. 登录管理面板并创建项目。
  2. 设置助手人设:名称、头像和回答规则。
  3. 填充知识库:上传文件、从文件导入商品或人员档案,或按链接接入数据源。
  4. 邀请团队成员并分配角色。
  5. 在网站或个人账户页面接入小部件:
<script>
  window.ParsewiseConfig = {
    shopId: "项目标识",
    apiUrl: "https://API服务器地址",
  };
</script>
<script async src="https://静态资源地址/widget.iife.js"></script>

管理面板的详细操作步骤见用户与管理员手册。

6. 运维

任务做法
备份由客户执行:PostgreSQL 主库和向量库、对象存储
监控使用集群工具查看 Pod 状态和日志。健康检查:服务器——8000 端口 GET /,管理面板——3000 端口 GET /,向量化——8080 端口 GET /health,队列处理器——celery inspect ping 命令
扩缩自动,在资源表规定的范围内。任务调度器严格以单实例运行
更新客户自行决定部署新版本镜像;主库结构在服务器启动时通过迁移更新
支持《技术支持》文档
开始使用

用你自己的数据试一试

上传你的文档和商品目录,然后把别人问你的问题拿去问助手。 这是唯一有意义的检验。