serviette 0.1.8 配置参数详解
serviette 0.1.8 的 YAML 配置全字段详解:三种配置方式、八大配置段参数总览与默认值、生产配置模板与配置指纹机制,附实测校验报错排障。
serviette 0.1.8 配置参数详解
目标:逐项讲清 serviette 0.1.8 的 YAML 配置体系——参数查看与修改方式、全部配置段的字段/类型/默认值、一份可直接落地的生产配置模板,以及配置校验报错的真实排障。参数含义与默认值溯源自官方 docs/README.md 配置参考(查询日期 2026-10-22),配置示例与校验回显均在 Ubuntu 22.04.5 LTS 上用 serviette 0.1.8 实测通过。
一、环境信息
本文实测与溯源环境:
- 操作系统:Ubuntu 22.04.5 LTS(x86_64),root 用户;
- serviette:0.1.8(PyPI,2026-10-15 发布),底座 pathway 0.33.0,Python 3.10.12(venv
/opt/serviette-venv); - 实验工作目录:
/root/serviette-demo/(配置文件、语料目录docs/、DuckDB 库文件、serviette-workdir/工作目录均在此); - 参数来源:官方
docs/README.md第 4 节 Config reference(https://github.com/pathwaycom/serviette/blob/main/docs/README.md ,查询日期 2026-10-22)+ 实测向导生成的配置文件 + 实测启动校验回显; - 约定:下文「官方默认值」均指官方配置参考标注的默认;「实测」指在上述环境跑出的真实结果。
二、前置条件
- 已按《Ubuntu 22.04 安装 serviette 0.1.8 指南》完成安装,
serviette --version返回serviette 0.1.8; - 已领取免费 Pathway 许可证(indexer 运行必需;仅编辑/校验配置不需要);
- 会用到哪个向量库,就具备哪个库的连接条件(DuckDB 无需任何外部服务,本文实测用它)。
验证安装(实测回显):
serviette --version
serviette 0.1.8
三、参数查看与修改方式
3.1 配置文件:一份 YAML 管两进程
serviette 的全部参数集中在一个 YAML 文件里。可以一份「universal」配置同时喂给 indexer 和 server(本文采用),也可以拆成 indexer-only / server-only 两份。用哪个文件由命令行 --config 指定,没有隐式默认路径。
3.2 三种生成/修改方式
方式一:向导生成(推荐起步)。serviette wizard 交互式提问,DuckDB+本地嵌入的「快乐路径」只问 7 个问题,其余参数写文档化的静默默认值。完整实测流程见《serviette 0.1.8 常用 CLI 命令与工具详解》向导一节;实测生成的配置全文如下(原样照抄,本文后续章节以它为解剖样本):
# serviette config — generated by `serviette wizard`
pathway_license_key: ${PATHWAY_LICENSE_KEY}
sources:
- type: fs
path: /root/serviette-demo/docs
glob: '**/*'
vector_db:
type: duckdb
path: ./embeddings.duckdb
table: embeddings
embedder:
type: sentence_transformer
model: sentence-transformers/all-MiniLM-L6-v2
splitter:
type: token_count
chunk_size: 512
chunk_overlap: 50
server:
host: 127.0.0.1
port: 8989
llm:
type: mock
方式二:手写配置。从空文件按第四章参数总览逐段写(本文 5.x 各节的手写样本均实测通过预检)。
方式三:环境变量插值。任何字符串值都支持 ${ENV_VAR},凭据不落盘。实测确认两个行为:① 变量未导出时启动立即报错并精确点名(真实回显见第八章 Q1);② 向导检测到环境里已导出 PATHWAY_LICENSE_KEY 时,会主动在配置里写 ${PATHWAY_LICENSE_KEY} 引用而非让你粘贴明文(实测生成文件即如此)。
3.3 配置校验:启动即检错
indexer/server/up 启动前会做「常识级」预检:源目录是否存在、${VAR} 是否已导出、openai 型 embedder/llm 是否缺 key、后端能否被两进程共享,每项报错都是一段话而非 traceback(本文第八章收录全部实测报错原文)。改配置后无需专门校验命令——直接跑一次目标子命令,预检通过即会进入下一步。
四、参数总览
按配置段归类的全景表(字段、类型、默认值均溯源自官方配置参考,2026-10-22):
| 配置段 | 作用 | 关键字段(默认值) | 使用方 |
|---|---|---|---|
pathway_license_key | Pathway 免费许可证 | 字符串,或 ${PATHWAY_LICENSE_KEY} 引用 | indexer |
sources | 文档来源列表 | type(fs)、mode(streaming)、max_backlog_size(1000) | indexer |
parser | 解析路由规则 | 按 glob 匹配的规则列表,默认「无 key 优先」 | indexer |
vector_db | 向量库后端 | type(8 选 1,必填)+ 各后端连接字段 | indexer + server |
embedder | 嵌入模型 | type(openai)、model(各提供商默认)、api_key | indexer + server |
splitter | 分块策略 | type(token_count)、chunk_size(512)、chunk_overlap(50) | indexer |
indexer | 索引器行为 | fetch_retries(3)、workers(1)、monitoring_http_port、parse_cache_size_gb(8) | indexer |
workdir_path | 工作目录 | ./serviette-workdir | indexer |
persistence | 持久化 | enabled(true)、backend(filesystem) | indexer |
server | API 服务 | host(127.0.0.1)、port(8989)、serve_frontend(true)、cors_origins([]) | server |
up | up 监管器 | index_wait_timeout(120) | up |
llm | 回答生成 | type(openai)、model(gpt-4o-mini)、api_key、system_prompt | server |
rag | 检索增强策略 | adaptive(默认关)、documents(默认开) | server |
frontend | 独立前端层 | host(127.0.0.1)、port(3000)、api_url(http://localhost:8989)、`title`(serviette) | frontend |
💡 说明:官方配置参考中
embedder.type的「provider default」指跟随所选提供商的默认模型;实测向导为sentence_transformer家族写入的是sentence-transformers/all-MiniLM-L6-v2。
五、核心参数分类详解
5.1 pathway_license_key:许可证
类型 str,默认无。免费 Pathway 许可证,值可以是明文或 ${PATHWAY_LICENSE_KEY} 引用。官方明确:许可证在索引图初始化时校验。实测用哑值启动 indexer 的报错(原文):
RuntimeError: the feature(s) you used ["DUCKDB"] require a Pathway license key, which is free.
Get one in seconds (sign up with GitHub or LinkedIn) at https://pathway.com/framework/get-license, then set the PATHWAY_LICENSE_KEY environment variable.
报错里会列出用到的特性名(如 ["DUCKDB"]),便于确认是哪个能力触发了校验。推荐写法即向导生成的引用式:pathway_license_key: ${PATHWAY_LICENSE_KEY},密钥经环境变量注入。
5.2 sources:文档来源
列表类型,必填。每个元素是一个来源,type 可选 fs/gdrive/s3/sharepoint/pyfilesystem(默认 fs),多类型可混用。
通用字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
type | 枚举 | fs | 来源类型 |
mode | streaming|static | streaming | streaming 持续监视;static 索引一次即退出(serviette up 下 indexer 退出后 server 继续服务) |
max_backlog_size | int|null | 1000 | 每个连接器在途条目的背压上限(进阶项,向导不问,直接改 YAML;null 关闭) |
fs(本地目录,实测默认路径):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
path | str | 必填 | 监视目录,~ 会展开;启动时必须已存在,否则预检报错(实测回显见第八章 Q2) |
glob | str | **/* | 递归匹配的文件通配 |
实测样本(向导生成):
sources:
- type: fs
path: /root/serviette-demo/docs
glob: '**/*'
gdrive:object_id(必填,Drive 文件夹/文件 id)、service_user_credentials_file(必填,服务账号 JSON 路径)、file_name_pattern(可选 glob)、object_size_limit(可选字节上限)。装 serviette[gdrive]。
s3 / MinIO:bucket(必填)、path(键前缀,默认 "" 全桶)、access_key/secret_access_key(缺省走 AWS 凭据链)、region/endpoint(自定义端点接 MinIO 等)、with_path_style(bool,默认 false;MinIO 等自托管对象存储需设 true)。装 serviette[s3]。
sharepoint:url/tenant/client_id/cert_path/thumbprint/root_path(均必填,证书认证)、recursive(默认 true)、refresh_interval(秒,默认 30)。⚠️ 需要 Pathway Scale 许可,装 serviette[sharepoint]。
pyfilesystem:fs_url(必填,任意 PyFilesystem URL:ftp://…、ssh://…、webdav://…、zip://…)、path(默认 "" 递归)、refresh_interval(秒,默认 30.0)。装 serviette[pyfilesystem],部分协议需额外驱动包(fs.sshfs、fs.webdavfs)。
5.3 parser:解析路由
规则列表,默认「无 API key 的解析器优先」。每条规则形如 {match: ["*.pdf"], type: docling, options: {...}},glob 同时对文件名与其路径匹配(* 能匹配 /,可用 */scans/*.png 选中目录),首条命中生效,未命中的走内置默认路由:
| 格式 | 默认解析器 | 前置 |
|---|---|---|
| 文本/Markdown | 原样读入 | 无 |
Docling(装 serviette[docling]),否则 pypdf | 本地免费 | |
| Office(DOCX/PPTX/XLSX/HTML/EML…) | Unstructured(内置) | 本地免费 |
| 扫描件(PNG/JPG/TIFF…) | PaddleOCR(装 serviette[ocr]) | 本地免费 |
| 音频 | Whisper | OPENAI_API_KEY |
| 视频 | TwelveLabs Pegasus | TWELVELABS_API_KEY |
可用 type:utf8、pypdf、docling、unstructured、paddle_ocr、vision_image、vision_slide、whisper、twelvelabs_video、skip。缺 key 的模态跳过并告警,不崩溃。⚠️ 解析路由变更受「配置指纹」保护(见 5.6 节),改动会触发重建索引确认。
5.4 vector_db:向量库后端(8 选 1)
type 必填,可选 duckdb/pgvector/milvus/qdrant/chroma/weaviate/pinecone/mongodb。启动时 indexer 自动建库建表建索引(prepare_backend),向量维度取 vector_db.embedding_dimension(设置了的话)或内省 embedder。
各后端连接字段与默认值:
| 后端 | 字段(默认值) | 备注 |
|---|---|---|
| duckdb | path(必填)、table(serviette_embeddings) | 嵌入式单文件,零部署;实测向导写入 table: embeddings |
| pgvector | connection_string(必填,postgresql://user:pass@host/db)、table(serviette_embeddings) | 自动建扩展/表/HNSW 索引 |
| milvus | uri,或 host(localhost)+port(19530)、collection(serviette_embeddings) | |
| qdrant | host(localhost)、rest_port(6333,server 用)/grpc_port(6334,indexer 用)、api_key(Qdrant Cloud)、collection(serviette_embeddings,缺则自动建 cosine) | |
| chroma | host/port(localhost/8000)、tenant/database(Chroma 默认)、collection(serviette_embeddings) | |
| weaviate | http_host/http_port(localhost/8080)、grpc_host/grpc_port(取 http_host/50051)、api_key、collection(ServietteEmbeddings,首字母大写) | |
| pinecone | index_name(必填,自动建 serverless 索引)、api_key(默认引用 ${PINECONE_API_KEY})、namespace("") | ⚠️ 无法枚举文档:/api/v1/documents 返回 501、进程内混合检索启动即失败、rag.documents 不可用 |
| mongodb | connection_string(必填,Atlas 用 mongodb+srv://)、database(必填)/collection(serviette_embeddings)、vector_index(vector_index) |
DuckDB 并发语义(官方文档明示):单文件单写者;indexer 借 detach_between_batches 在批间释放文件锁,server 以短连接只读查询并发工作。请求撞上批提交时等待锁(最长 30 秒;大语料首轮提交可持锁约 10 秒),超时返回 503「索引更新中,请稍后再试」。实测确认空库时 server 正常应答:
curl -s http://127.0.0.1:8989/api/v1/stats
{"backend":"duckdb","stats_available":false}
💡 技术拓展:
vector_db还有一个进阶键embedding_dimension(int,未在向导中出现)——DBA 手工建 schema 时用它显式指定向量维度;不设则由 embedder 内省得出。若想启用混合检索,在此段加hybrid: true(BM25+向量倒数秩融合,进程内关键词索引,默认每 30 秒随库刷新,hybrid_max_chunks以上自动跳过关键词路)——Pinecone 除外。
5.5 embedder 与 splitter
embedder(indexer 与 server 共用一节):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
type | str | openai | 可选 openai/litellm(约 100 家提供商)/sentence_transformer(本地免费,需 serviette[local])/gemini(serviette[gemini])/bedrock(serviette[bedrock]) |
model | str | 各提供商默认 | 实测向导为 sentence_transformer 写 sentence-transformers/all-MiniLM-L6-v2 |
api_key | str | — | 或 ${ENV} 引用 |
⚠️ indexer 与 server 必须用同一模型,否则向量不可比。换嵌入模型 = 全量重建索引(指纹校验拦截)。
本地模型怎么选(官方指引原文义):默认 all-MiniLM-L6-v2 是纯英文模型——中文/法语/德语等语料会检索退化成「上下文不含信息」。非英文或混合语料改用 intfloat/multilingual-e5-small(约 100 种语言,同速同尺寸,需配训练前缀 query_prefix: "query: "、document_prefix: "passage: ");要最高质量与长分块用 BAAI/bge-m3(1024 维,约 2.3 GB 下载,CPU 上慢数倍)。向导把这一步作为「Embedding model」问题呈现(实测界面见《serviette 0.1.8 常用 CLI 命令与工具详解》)。
splitter(仅 indexer):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
type | token_count|recursive|null | token_count | null 关闭分块——整文档一块(FAQ 卡、商品卡类短文档),写 type: null 即可 |
chunk_size | int | 512 | 每块最大 token 数(官方基准即用 512) |
chunk_overlap | int | 50 | 重叠(供 recursive 使用) |
5.6 indexer、workdir_path、persistence
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
indexer.fetch_retries | int | 3 | 文档字节拉取失败重试次数(1 秒起指数退避);重试用尽按「空文档」入库并 ERROR 记日志 |
indexer.workers | int | 1 | worker 进程数(pathway spawn 分片)。大回填时调大;每个 worker 自带本地嵌入栈,内存随模型走;官方基准用 8 |
indexer.monitoring_http_port | int | — | 设了就开 Prometheus 端口:每个 worker 在 127.0.0.1:(端口+worker序号) 暴露 GET /metrics 与 GET /status;仅回环,无法直接对外 |
indexer.parse_cache_size_gb | 数字 | 8 | 解析缓存(diskcache)LRU 上限,GB |
workdir_path | str | ./serviette-workdir | 工作目录:顶层存配置指纹,persistence/ 存引擎持久化与解析缓存(runtime_calls/)。相对启动时工作目录 |
persistence.enabled | bool | true | 开启后重启只重放差异:未变文档不重嵌入;indexer 停机期间被删的文档在下次运行被正确撤下。关闭则连解析缓存一起关 |
persistence.backend | 枚举 | filesystem | 目前唯一后端 |
配置指纹(<workdir_path>/serviette-fingerprint.json)记录分块相关设置(splitter、parser 路由、embedder 身份、库版本、chunk-id 方案)。启动时发现变更会打印 diff 并拒绝运行,需交互确认或设 SERVIETTE_ACCEPT_FINGERPRINT_CHANGES=1——因为库里旧行保留旧 chunk id,不确认会留孤儿向量。该检查持久化开关与否都生效。另注意:拉取/解析失败的文档按「空文档」入库且本次版本内不再自动重试,修复原因后 touch 文件(或重新上传对象)触发重发。
实测确认工作目录在首次 indexer 启动时创建(哑许可证触发校验失败前,库文件已建立——回显见第八章 Q4,文件实测存在):
ls /root/serviette-demo
bad.yaml config.yaml docs embeddings.duckdb serviette-workdir server-openai.yaml
5.7 server、up、llm、rag
server(API 服务):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
host / port | str / int | 127.0.0.1 / 8989 | 默认仅回环——对外暴露是显式决策:设 0.0.0.0 并前置认证反代 |
serve_frontend | bool | true | 在 / 同端口服务聊天页;关掉只留 /api/v1 |
cors_origins | list[str] | [](禁用) | 第三方浏览器前端跨源直连 API 时的显式白名单;自家用不到。别用 * |
up(监管器):index_wait_timeout(秒,默认 120)——indexer 多久无动静后不再拦着 server 开门;计时按「日志里最后一次工作迹象」算,解析大 PDF 的几分钟不会误触发;全空转的语料(如无 ocr extra 的扫描件)会在超时后让 server 带着空索引上线并告警。设 null 无限等。
llm(/rag 回答生成,省略整段即禁用 /rag):
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
type | str | openai | 实测向导可选 mock(无 LLM,原样引用检索片段,用于检查检索质量) |
model | str | gpt-4o-mini | |
api_key | str | — | 或 ${ENV} |
system_prompt | str | 内置 grounded 提示词 | 默认只许从上下文作答;可覆盖为允许模型自有知识(公共语料场景) |
rag(检索增强策略):
rag.adaptive:{factor, max_iterations, no_answer_string},默认关。自适应 RAG:先按k块作答,答不上(回复含no_answer_string,默认No information found)就按factor扩上下文重问,最多max_iterations轮。注意:system_prompt 若允许模型自由发挥,则几乎不会触发「答不上」标记;rag.documents:默认开。文档级问答(数文档、点名读整份文件、跨文件 diff 对比)。子字段:enabled、corpus_card、source_labels、max_context_chars(默认24000)、max_request_chars(默认100000)、max_listed_documents。单请求对 LLM 的总发送量受max_request_chars硬顶(含 adaptive 循环);响应带mode(search/catalog/document/compare/unresolved)、documents、notice。Pinecone 上忽略。
实测确认:llm.type: mock + embedder.type: openai 的组合可以让 server 无 OpenAI 真实调用地跑起来(启动日志与 / 页面 <title>serviette</title> 实测回显见《Ubuntu 22.04 安装 serviette 0.1.8 指南》4.6 节)。
5.8 frontend(拆分部署专用)
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
host / port | str / int | 127.0.0.1 / 3000 | 独立聊天 UI 层监听地址 |
api_url | str | http://localhost:8989 | 服务端代理的 API 地址(拆分部署指向后端主机) |
title | str | serviette | 聊天页标题(内嵌与独立前端共用此键) |
六、生产配置模板
场景约定:16GB 内存 / NVMe SSD / 中文为主的团队文档库(数万文件级),后端选 pgvector(复用既有 PostgreSQL 运维),嵌入用本地多语模型(数据不出门),/rag 用 OpenAI 生成回答。模板逐段给出(字段含义见第五章):
pathway_license_key: ${PATHWAY_LICENSE_KEY}
sources:
- type: fs
path: /srv/teamdocs
glob: '**/*'
- type: s3
bucket: archive-docs
endpoint: http://minio.internal:9000
with_path_style: true
access_key: ${MINIO_ACCESS_KEY}
secret_access_key: ${MINIO_SECRET_KEY}
vector_db:
type: pgvector
connection_string: postgresql://serviette:q1w2e3r4@127.0.0.1:5432/serviette
table: serviette_embeddings
hybrid: true
embedder:
type: sentence_transformer
model: intfloat/multilingual-e5-small
query_prefix: "query: "
document_prefix: "passage: "
splitter:
type: token_count
chunk_size: 512
chunk_overlap: 50
indexer:
workers: 4
monitoring_http_port: 20000
workdir_path: /var/lib/serviette/workdir
persistence:
enabled: true
backend: filesystem
server:
host: 0.0.0.0
port: 8989
cors_origins: []
llm:
type: openai
model: gpt-4o-mini
api_key: ${OPENAI_API_KEY}
rag:
adaptive:
factor: 3
max_iterations: 2
模板要点解读:
- 中文语料必须换
multilingual-e5-small并带query:/passage:前缀(默认英文模型会检索退化,官方明示); - MinIO 走 S3 协议:
endpoint+with_path_style: true是自托管对象存储的标配两行; server.host: 0.0.0.0前必须先架好认证反代(Caddy basic_auth / nginx auth_basic / oauth2-proxy 等,官方文档给了 Caddy 五行示例)——serviette 本身无内置认证;indexer.workers: 4适配 16GB 内存机器(每个 worker 携带一份本地嵌入栈;官方 50 GB 基准用 8 worker 在 96 核主机上跑到 14.65 GiB 峰值,4 worker + e5-small 在 16GB 内是稳妥档);- Prometheus 抓
127.0.0.1:20000~20003(/metrics)获得输入/输出延迟与每算子行数。
单机轻量档(笔记本/演示,8GB 内存):删掉 s3 来源与 hybrid,vector_db 改 duckdb(path: ./embeddings.duckdb),indexer.workers 去掉(默认 1),server.host 保持 127.0.0.1——即向导生成的形态。
七、配置与运行行为的关系速查
改哪些键会触发什么行为(编辑配置前先看这张表):
| 改动 | 后果 |
|---|---|
splitter.*、parser 路由、embedder 模型、库版本升级 | 配置指纹变更 → indexer 拒跑并打印 diff,需确认(或 SERVIETTE_ACCEPT_FINGERPRINT_CHANGES=1),确认后全量重建索引 |
sources 增删来源、server.*、llm、rag、连接信息 | 无指纹影响,重启进程即生效 |
persistence.enabled: false | 关闭跨重启差异重放与解析缓存;向量结果不变 |
${VAR} 引用的变量未导出 | 启动立即报错并点名变量与配置键(实测见 Q1) |
| DuckDB 后端 + server/indexer 同机 | 支持同文件并发(批间释放锁);请求撞上批提交最多等 30 秒,超时 503 |
八、常见问题(FAQ)
Q1:启动报 Invalid configuration ... environment variable(s) that are not set
实测回显:
Invalid configuration in config.yaml:
The config references environment variable(s) that are not set:
- ${PATHWAY_LICENSE_KEY} (used in pathway_license_key)
Export them before starting (e.g. `export OPENAI_API_KEY=sk-...`) or replace the reference in the config.
- 原因:配置里的
${VAR}引用没有对应的已导出变量。serviette 不会把缺变量静默替换为空串(那会把问题拖到 provider 401 才暴露)。 - 解决:导出变量,或把值直接写进配置(不推荐,凭据落盘)。
Q2:indexer 报 Source directory not found
实测回显:
Source directory not found:
- /root/serviette-demo/nodir
Check the 'path' of the fs source(s) in your config (relative paths resolve against the current working directory; '~' is expanded), or create the directory first — documents dropped into an existing folder are indexed live.
- 原因:fs 来源的
path不存在;相对路径按启动时的工作目录解析。 - 解决:
mkdir -p建目录或修正路径;systemd 部署时与单元的WorkingDirectory对齐。
Q3:报 OpenAI API key missing for: embedder
实测回显:
OpenAI API key missing for: embedder (type: openai).
Export it before starting (`export OPENAI_API_KEY=sk-...`) or set `api_key` in those config sections. To run without OpenAI, switch the embedder to `sentence_transformer` (free, local) and drop or change the `llm` section.
- 解决:导出 key / 在段内写
api_key: ${OPENAI_API_KEY}/ 换本地嵌入。
Q4:许可证哑值触发 RuntimeError: ... require a Pathway license key
实测回显:
RuntimeError: the feature(s) you used ["DUCKDB"] require a Pathway license key, which is free.
Get one in seconds (sign up with GitHub or LinkedIn) at https://pathway.com/framework/get-license, then set the PATHWAY_LICENSE_KEY environment variable.
- 解决:领真实免费许可证替换环境变量。报错中的特性名(如
["DUCKDB"])指示触发校验的能力。
Q5:改了分块/模型后 indexer 拒绝启动
- 现象:启动打印「配置指纹」diff 并停止。
- 原因:分块相关设置变更会让库里旧行带着旧 chunk id 成为孤儿,serviette 用指纹机制拦截。
- 解决:确认废弃旧索引后,交互确认或
export SERVIETTE_ACCEPT_FINGERPRINT_CHANGES=1再启动;随后全量重建(持久化开启时启动即自动完成重嵌与旧向量清理)。
Q6:检索/stats 显示 stats_available: false 或 503
stats_available: false:索引为空,先跑 indexer(实测回显见 5.4 节);- 503「索引更新中」:DuckDB 批提交持锁期间到达的请求等待超 30 秒所致,稍后重试即可;频繁出现说明批过大,可减小
chunk_size或改用客户端-服务型后端(pgvector/Qdrant)。