配置文件修改指南 #
中控不从命令行参数中获取任何信息,它的配置信息均来自于配置文件和环境变量。此文档将详细描述如何撰写正确的中控配置文件。
配置文件加载:文件放哪儿,用什么格式写? #
中控的启动时,会从本地磁盘加载配置文件,如果无法找到配置文件或者文件结构不正确,那么中控将无法启动。配置文件加载遵循以下规则:
- 文件名主体为
setting,如果需要指定其他,可以在环境变量中设置CONFIG变量; - 文件扩展名按照优先级顺序支持
json、toml、yaml、hcl; - 加载时依次查询:
- 当前目录下的
config目录,即./config - 当前目录,即
./ - 当前目录的上一级,即
../ - 用户目录下的
.config目录下的ctrlsys目录,例如~/.config/ctrlsys
- 当前目录下的
举例说明:假设当前中控运行的目录为 /home/dev/cs,那么中控会依次查找以下文件,直到找到为止尝试加载或无一存在后报错退出:
- /home/dev/cs/config 目录
- /home/dev/cs/config/setting.json
- /home/dev/cs/config/setting.toml
- /home/dev/cs/config/setting.yaml
- /home/dev/cs/config/setting.hcl
- /home/dev/cs 目录
- /home/dev/cs/setting.json
- /home/dev/cs/setting.toml
- /home/dev/cs/setting.yaml
- /home/dev/cs/setting.hcl
- /home/dev 目录
- /home/dev/setting.json
- /home/dev/setting.toml
- /home/dev/setting.yaml
- /home/dev/setting.hcl
- /home/dev/.config/ctrlsys 目录
- /home/dev/.config/ctrlsys/setting.json
- /home/dev/.config/ctrlsys/setting.toml
- /home/dev/.config/ctrlsys/setting.yaml
- /home/dev/.config/ctrlsys/setting.hcl
使用场景:
- 对于 Kubernetes 部署,可以将配置文件放在执行目录下的 config 目录中,这样的单独目录便于挂载;
- 对于本地开发调试,可以在当前目录下防止配置文件,这样可以方便地修改配置文件;
- 对于调试中控本身,考虑到 IDE 会在临时目录中运行,可以将配置文件放在用户目录下的
.config/ctrlsys目录中,这样可以保证配置文件的全局一致性。 - YAML 是最常见的配置格式,但是 YAML 有缩进要求,如果眼神不好且头铁的话,可以用 JSON 或者 TOML 格式凑合。
整体结构:第一层级配置参数 #
第一层级有以下配置参数,按功能分类依次介绍。
基础功能 #
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| debug | boolean | false | true | 是否开启调试模式,调试模式会输出更多信息 |
| dump_response | boolean | false | true | 是否将 NLP 相关的引擎响应和中控响应的回复报文保存到当前路径下的 dump_http 目录中 |
| dump_pcm | boolean | false | true | 是否将 ASR 输入引擎的 PCM 音频请求的数据保存到当前路径下的 dump_pcm 目录中 |
| dump_stat | boolean | false | true | 是否将 ASR 引擎输出的统计信息保存到当前路径下的 dump_stat 目录中 |
| allow_error | boolean | false | true | 是否允许引擎出错后重试链接,目前主要针对 ASR 相关失败 |
| network_monitor | boolean | false | true | 是否通过 Ping/Pong 报文监测和 ASR 服务器链接延时和网络可用性(仅针对公有云部署启用),并将结果写入日志,以 event 类包的方式告知客户端 |
| hide_console | boolean | false | true | 是否隐藏中控程序的控制台窗口,仅在 Windows 桌面环境中使用的场景有效 |
| port | integer | 8080 | 8070 | WebSocket 服务端口,当默认端口被占用时,可以用此调整 |
| endpoint | string | /v1 | /ctrlsys | WebSocket 服务端点,可用于 Ingress 等多中控同时挂载的场景 |
| grpc | integer | 0 | 8010 | gRPC 服务端口号,0或不填表示不启用 gRPC 服务 |
| expire_date | string | 空字符串 | 2023-12-31 | 过期日期,设置后中控会检查每一个客户端连接建立时的时间,如果时间大于过期时间,则拒绝连接 |
| auth_required | boolean | false | true | 是否需要认证,设置后客户端连接后的 Starter 报文中的 auth 字段需要填写有效的 token |
| auth_token | list | 空数组 | ["2WJO7SV2GVAPPBDR5HBZME3YFQ"] | 认证令牌列表,如果 auth_required 设置了,则必须设置,token 长度要求为26个字符,客户端连接的 Starter 报文中的 token 只需匹配其一即可 |
| text_chinese_convert | string | 空字符串 | s2hk | 是否进行中文简体和繁体的转换,如果设置了非空的模式,则 ASR 和 NLP 的返回结果会按此模式调用 OpenCC 进行转换,如果转换模式不存在,则中控会拒绝启动 |
注意:
debug开启调试模式后,会导致——- 配置文件解析后的配置信息会输出到控制台;
- Web Server 的 Gin 以 Debug 模式运行;
- 在 /debug/pprof 端点启动 pprof 服务;
- 在 /debug/statsviz 端点启动 Statsviz 服务;
dump_response可以通过环境变量DH_CS_HTTP进行覆盖,1表示true,0表示false,其他值无效;dump_pcm可以通过环境变量DH_CS_PCM进行覆盖,1表示true,0表示false,其他值无效;text_chinese_convert支持的转换模式为——- “hk2s”: 繁体中文 (中国香港) → 简体中文
- “s2hk”:简体中文 → 繁体中文 (中国香港)
- “s2t”:简体中文 → 繁体中文
- “s2tw”:简体中文 → 繁体中文 (中国台湾)
- “s2twp”:简体中文 → 繁体中文 (中国台湾, 包括习用词转换)
- “t2hk”:繁体中文 → 繁体中文 (中国香港)
- “t2s”:繁体中文 → 简体中文
- “t2tw”:繁体中文 → 繁体中文 (中国台湾)
- “tw2s”:繁体中文 (中国台湾) → 简体中文
- “tw2sp”:繁体中文 (中国台湾) → 简体中文 (包括习用词转换)
增强功能 #
按具体算法能力分类,有以下配置参数可以进行简单的开关。
ASR #
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| asr_hotwords | list | 空字符串 | ["商汤科技"] | ASR 动态热词,会随请求发送给具体 ASR 引擎,需要 ASR 引擎支持此功能 |
| asr_result_replace | dictionary | 空词典 | ["张三": "章叁"] | ASR 结果的文本改写的文本对,key 为原始匹配的内容,value 为改写后内容,作为 ASR 热词的补充 |
NLP #
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| cache_nlp | integer | 0 | 3600 | NLP 缓存时间,单位为秒,0表示不启用 |
| heuristic_extra_first | boolean | false | true | NLP 启发式开场白忽略,即当前回合首句收到"我是开场白"的回复后自动重试一次 |
| nlp_answer_replace | dictionary | 空词典 | ["以上信息由墨迹天气为您播报。": ""] | NLP 答案的文本改写的文本对,key 为原始匹配的内容,value 为改写后内容 |
| geolocation_service_url | string | 空字符串 | http://localhost/ipgeo/query?ip=%s | IP转地理位置服务的 URL |
| fallback_geolocation | string | 空字符串 | 北京市 | 默认缺省地理位置,当客户端未指定、IP推断失败时,填入的缺省位置 |
TTS #
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| cache_tts | integer | 0 | 3600 | TTS 缓存时间,单位为秒,0表示不启用 |
| facefeature_service_url | string | 空字符串 | ws://localhost:58090/ff | 人脸特征服务 Face Feature 的 URL |
| tts_silence_padding_msec | integer | 0 | 500 | TTS 请求前后静音填充时间,单位为毫秒,0表示不启用。当使用完整的微软原生SSML语法时,不会进行静音填充。 |
扩展字段 #
| 配置项 | 配置项说明 |
|---|---|
| logger | 各模块日志配置 |
| webhook | 返回消息转发的配置 |
| object_storage | 对象存储配置 |
| script | 插件脚本配置 |
| asr, asr2, asr3, … | ASR1 / ASR2 / ASR3 / … 等 ASR 供应商引擎的连接配置信息 |
| nlp, nlp2, nlp3, … | NLP1 / NLP2 / NLP3 / … 等 NLP 供应商引擎的连接配置信息 |
| tts, tts2, tts3, … | TTS1 / TTS2 / TTS3 / … 等 TTS 供应商引擎的连接配置信息 |
具体的内嵌的扩展字段的结构和说明,以下章节会逐一介绍——
Logger 配置:日志的显示和保存 #
日志配置填入 logger 字段中,具体日志配置的结构如下:
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| path | string | 空字符串 | runtime.log | 日志文件的路径,为空则不保存日志文件到本地 |
| one | string | debug | info | 设置统一的日志级别,会覆盖所有的模块指定 |
| client | string | debug | info | 设置 client 包的日志级别 |
| server | string | debug | info | 设置 server 包的日志级别 |
| mock | string | debug | info | 设置 mock 包的日志级别 |
| auth | string | debug | info | 设置独立鉴权包的日志级别 |
| utility | string | debug | info | 设置 utility 包的日志级别 |
| driver_asr | string | debug | info | 设置各 ASR 引擎 Driver 的日志级别 |
| driver_nlp | string | debug | info | 设置各 NLP 引擎 Driver 的日志级别 |
| driver_tts | string | debug | info | 设置各 TTS 引擎 Driver 的日志级别 |
| worker_asr | string | debug | info | 设置 ASR 工作流的日志级别 |
| worker_asr_nlp | string | debug | info | 设置 ASR+NLP 工作流的日志级别 |
| worker_nlp | string | debug | info | 设置 NLP 工作流的日志级别 |
| worker_echo | string | debug | info | 设置 ECHO 工作流的日志级别 |
| worker_event | string | debug | info | 设置 EVENT 工作流的日志级别 |
| worker_tts | string | debug | info | 设置 TTS 工作流的日志级别 |
日志等级的可选字符串有以下几种:
- debug
- info
- warn
- error
- panic
- fatal
Webhook 配置:转发返回客户端的消息 #
当 Webhook 配置启用后,中控所有下发给客户端的消息都会同时转发给 Webhook 配置的 URL,Webhook 配置的 URL 必须是一个有效的 HTTP 或者 HTTPS URL,中控会将消息以 POST 的方式发送给 Webhook 配置的 URL,消息的格式为 JSON,内容与 WebSocket 会话中下发给客户端的消息一致。
发送超时为10秒,消息仅发送一次不会重试,如果返回码非 2XX,则认为发送失败,中控日志进行记录。支持接收端 HTTP Basic Auth 认证,如果需要认证,请设置 username 和 password 字段。
配置填入 webhook 字段中,具体 Webhook 配置的结构如下:
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| endpoint | string | 空字符串 | http://localhost:8888/print | Webhook 服务端点的 URL,为空则不启用 |
| username | string | 空字符串 | YOUR_USERNAME | 服务端点的用户名 |
| password | string | 空字符串 | YOUR_PASSWORD | 服务端点的密码 |
对象存储配置:返回的结果 URL 的存储位置 #
配置填入 object_storage 字段中,具体配置的结构如下——
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| type | string | 空字符串 | local 或 azure | 对象存储的类型,为空则不启用 |
| local_path | string | 空字符串 | /tmp/ctrlsys-storage/ | 本地存储路径 |
| endpoint | string | 空字符串 | http://localhost:8070/object | 对象存储服务的端点 URL |
| bucket | string | 空字符串 | audio | 存储桶名称 |
| connection_string | string | 空字符串 | DefaultEndpointsProtocol=https... | 连接字符串 |
在使用不同的存储类型时,某些字段可能不会使用,例如使用本地存储时,不会使用 bucket 和 connection_string 字段。具体按 type 区分的字段意义如下:
| type | 存储服务类型 | local_path | endpoint | bucket | connection_string | 说明 |
|---|---|---|---|---|---|---|
| local | 本地存储 | 本地文件夹路径 | 返回 URL 前缀 | 无 | 无 | 使用本地目录进行存储,如文件夹不存在则会新建,并提供简单的 Web Server 供用户下载文件 |
| azure | Azure Blob | 无 | 无 | Container 名称 | 连接字符串 | 使用 Azure Blob 进行存储,Container 需要预先创建并设置公共访问级别 |
插件脚本配置:脚本的执行参数和内容 #
作为列表的方式填入配置文件的 script 字段中,具体配置的结构和内容参见
插件脚本 内容。
引擎供应商配置:具体供应商的连接参数 #
所有的引擎供应商的连接参数信息都使用统一的配置结构,但具体的配置项的意义和取舍会根据具体的引擎供应商进行调整,以下是通用的配置项的说明——
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| max_connect | integer | 0 | 5 | 允许客户端的最大并发连接数,0则表示不限制 |
| daily_quota | integer | 0 | 200 | 每日最大调用次数的配额限制,0则表示不限制 |
| on_premises | bool | 无 | false 或 true | 对应供应商引擎是否是私有化部署方案 |
| service_url | string | 无 | ws://api.love.ai/ba/v1 | 供应商引擎服务端点的 URL |
| auth_url | string | 无 | https://api.love.ai/api/auth | 供应商引擎鉴权认证的 URL |
| product_id | string | 无 | 918018996 | 产品 ID |
| public_key | string | 无 | 01f19df131b395ade5aade83021 | 公钥 |
| secret_key | string | 无 | C9921CEABF390C41F64635FBA78 | 私钥 |
| extra_config | string | 无 | {"max_token":900} | 补充配置信息字符串,通常为 JSON |
| proxy_url | string | 无 | 无参考值 | 代理 URL |
按各类引擎具体供应商的配置项说明如下——
ASR 引擎配置 #
| ID | on_premises | service_url | auth_url | product_id | public_key | secret_key | 说明 |
|---|---|---|---|---|---|---|---|
| 1 | 支持 | WS 接入地址 | Token 获取接口地址 | PID | Public Key | Secret Key | 私有化部署 Token 获取地址不填,即无需获取 Token |
| 2 | 不支持 | WS 接入地址 | 无 | AppID | APIKey | APISecret | 仅支持公有云的版本,其他私有化版本可能无法兼容 |
| 3 | 支持 | WS 接入地址 | Token 获取接口地址 | APPID | APIKey | APISecret | 私有化和公有云部署,私有化版本无需获取 Token |
| 5 | 不填 | WS 接入地址 | 无 | app_id | 无 | 无 | 私有化和公有云部署都无需鉴权,app_id 用于热词表判断 |
| 6 | 不填 | WS 接入地址 | 无 | app_id | 无 | 无 | 与 ASR5 部署相同但引擎启动参数不同 |
| 7 | 不支持 | Region | MSA 接入地址 | Key | 无 | 无 | 中控通过 Azure Post-Adapter 与 Azure 建立连接 |
注意:
max_connect字段对所有 ASR 引擎均有效;daily_quota字段对所有 ASR 引擎均无效(未实现);- 如需支持 URL 结果返回,即请求中的
cache_url字段,需要在顶层配置中填写有效的object_storage配置; - ASR1 公有云部署当前已经停止服务,不再提供服务;
- ASR4 为中间版本,已经停止开发,未进行任何对外部署;
- ASR7 不提供私有化部署方案,需要事先部署 Azure Post-Adapter 服务,中控通过其进行连接。
NLP 引擎配置 #
| ID | on_premises | service_url | auth_url | product_id | public_key | secret_key | extra_config | 说明 |
|---|---|---|---|---|---|---|---|---|
| 1 | 支持 | WS 接入地址 | Token 获取接口地址 | PID | Public Key | Secret Key | 无 | 私有化部署 Token 获取地址不填,即无需获取 Token |
| 2 | 支持 | HTTP 接入地址 | 无 | AppID | Username | Password | 支持 | 具体配置填写按部署架构灵活调整 |
| 3 | 不填 | HTTP 接入地址 | 无 | 无 | publicKey | privateKey | 无 | 私有化和公有云部署均支持,无特别变化 |
| 4 | 不支持 | HTTP 接入地址 | 无 | AppID | 无 | 无 | 无 | 仅适用于客户自研的实验场景 |
| 5 | 不支持 | HTTP 接入地址 | 无 | 无 | 无 | API Key | 支持 | 国内部署需配置 Proxy |
| 6 | 不支持 | HTTP 接入地址 | 无 | 无 | 无 | API Key | 支持 | 国内部署需配置 Proxy,使用 Azure OpenAI Service 需填入对应 service_url |
注意:
max_connect和daily_quota字段对所有 TTS 引擎均有效;extra_config对于不同的 NLP 引擎有不同的配置,具体参见以下详细说明;proxy_url仅对 NLP5 和 NLP6 有效,其他国内部署的引擎不支持也不需要代理;- NLP2 通过选配的 NLP2 Post-Adapter 可以实现任意临时引擎的接入,具体配置也会不尽相同;
NLP2 的 extra_config 的 JSON 字段说明:
主要面向 Post-Adapter,具体参数需要与 Adapter 约定。当 Starter 报文中 NLP 对应大模型参数未填时,使用此配置文件的中的预设配置,且仅当 adapter_target 字段为非空时,才会其他配置才会生效。
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| adapter_target | string | 无 | sensechat | Adapter 的转换平台示意 |
| prompt_header | string | 无 | 你是我的AI助理 | 大语言模型的 System Prompt |
| max_completion_token | integer | 0 | 200 | 回复内容的最大令牌数,0表示不限制 |
NLP5 的 extra_config 的 JSON 字段说明:
主要是使用 OpenAI 的 GPT-3 模型进行 Completion 任务,所以配置项也主要是针对 Completion 完成对话补全任务的参数。仅以此配置文件为准,Starter 报文中 NLP 对应的大模型参数直接忽略。
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| prompt_header | string | 以下是与AI助手的对话。助理乐于助人、富有创意、聪明而且非常友好。 | 以下是与女友的对话。 | GPT-3 模型的 Prompt 的首部 |
| role_bot | string | AI | 小美 | 机器人的角色名,如果为空,则默认跳过 |
| role_human | string | 人类 | 小帅 | 人类的角色名,如果为空,则默认跳过 |
| max_lookback | integer | 5 | 6 | 最大上下文轮数,0表示跳过,即单轮 |
| max_completion_token | integer | 500 | 1000 | 回复内容的最大令牌数,非0表示设定,取值范围是50到4097之间,无效值会被重置为默认值 |
NLP6 的 extra_config 的 JSON 字段说明:
主要是使用 OpenAI 的 GPT-3.5/4 模型进行 Chat Completion 任务,所以配置项也有相应变化。当 Starter 报文中 NLP 对应大模型参数未填时,使用此配置文件的中的预设配置。
| 配置项 | 类型 | 默认值 | 举例参考值 | 配置项说明 |
|---|---|---|---|---|
| engine_model | string | gpt-3.5-turbo | QQTool | 默认的引擎模型名,如果为空,则默认使用 GPT 3.5 Turbo |
| prompt_header | string | 以下是与AI助手的对话。助理乐于助人、富有创意、聪明而且非常友好。 | 你是我的AI助理,助理乐于助人、富有创意、聪明而且非常友好。 | 对话补全上下文的 System Prompt 部分 |
| max_lookback | integer | 5 | 10 | 最大上下文轮数,0表示跳过,即单轮 |
| max_completion_token | integer | 500 | 600 | 回复内容的最大令牌数,非0表示设定,取值范围是50到4097之间,无效值会被重置为默认值 |
TTS 引擎配置 #
| ID | on_premises | service_url | auth_url | product_id | public_key | secret_key | 说明 |
|---|---|---|---|---|---|---|---|
| 1 | 支持 | WS 接入地址 | Token 获取接口地址 | PID | Public Key | Secret Key | 私有化部署 Token 获取地址不填,即无需获取 Token |
| 2 | 支持 | WS 接入地址 | Token 获取接口地址 | PID | Public Key | Secret Key | 私有化部署 Token 获取地址不填,即无需获取 Token |
| 3 | 不填 | WS 接入地址 | 无 | 无 | 无 | 无 | 私有化和公有云部署都无需鉴权 |
| 4 | 不支持 | HTTP 接入地址 | 无 | Key | 无 | 无 | 注意不要填错成 Auth 地址 |
| 5 | 不支持 | Region | MSA 接入地址 | Key | 无 | 无 | 中控通过 Azure Post-Adapter 与 Azure 建立连接 |
注意:
- TTS5 不提供私有化部署方案,需要事先部署 Azure Post-Adapter 服务,中控通过其进行连接;
- 如需 TTS 支持 Face Feature 需要在顶层配置中填写有效的
facefeature_service_url地址; - 如需支持 URL 结果返回,即请求中的
cache_url字段,需要在顶层配置中填写有效的object_storage配置;
配置文件举例 #
以下内容仅用作格式参考,不代表配置秘钥真实有效——
debug: true
dump_response: true
dump_pcm: true
dump_stat: true
cache_nlp: 0
cache_tts: 3600
network_monitor: true
allow_error: true
heuristic_extra_first: true
hide_console: false
port: 8070
grpc: 8010
endpoint: /v1
nlp_answer_replace:
- "以上信息由墨迹天气为您播报。": ""
- "商汤": ""
asr_result_replace:
- "张平": "张屏"
- "裕隐": "郁衍"
- "欲演": "郁衍"
- "裕演": "郁衍"
expire_date: 2023-12-31
auth_required: true
auth_token:
- 2WJO7SV2GVAPPBDR5HBZME3YFQ
fallback_geolocation: 北京市
geolocation_service_url: https://dhc.softsugar.com/ipgeo/query?ip=%s
facefeature_service_url: ws://103.177.28.202:58090/ff
tts_silence_padding_msec: 100
object_storage:
type: local
local_path: /tmp/ctrlsys-storage/
endpoint: http://localhost:8070/object
webhook:
endpoint: http://localhost:8888/print
username: Hello
password: World
logger:
path: runtime.log
one: debug
client: debug
server: info
mock: warn
auth: info
utility: debug
driver_asr: info
driver_nlp: debug
driver_tts: debug
worker_asr: debug
worker_asr_nlp: debug
worker_asr_nlp2: debug
worker_nlp: debug
worker_echo: debug
worker_event: debug
worker_tts: debug
asr5:
service_url: ws://14.215.130.140:10088/
max_connect: 1
nlp2:
service_url: http://14.215.130.140:10080/model/reply
product_id: UQ3XJEID
extra_config: '{"adapter_target":"sensechat"}'
tts3:
service_url: ws://103.177.28.202:58086
script:
- name: "set_port"
weight: 1
timeout: 1s
entrypoint: server_start
repl: false
async: false
code: |
server_config.port = 8060
- entrypoint: session_start
repl: false
enabled: true
code: |
print("Got old lang_model:", starter_request.nlp.model)
if starter_request.nlp.model == "sensechat_waic_boc":
starter_request.nlp.model = "minimax"
print("Update lang_model:", starter_request.nlp.model)