配置文件

配置文件修改指南 #

中控不从命令行参数中获取任何信息,它的配置信息均来自于配置文件和环境变量。此文档将详细描述如何撰写正确的中控配置文件。

配置文件加载:文件放哪儿,用什么格式写? #

中控的启动时,会从本地磁盘加载配置文件,如果无法找到配置文件或者文件结构不正确,那么中控将无法启动。配置文件加载遵循以下规则:

  • 文件名主体为 setting,如果需要指定其他,可以在环境变量中设置 CONFIG 变量;
  • 文件扩展名按照优先级顺序支持 json、toml、yaml、hcl;
  • 加载时依次查询:
    • 当前目录下的 config 目录,即 ./config
    • 当前目录,即 ./
    • 当前目录的上一级,即 ../
    • 用户目录下的 .config 目录下的 ctrlsys 目录,例如 ~/.config/ctrlsys

举例说明:假设当前中控运行的目录为 /home/dev/cs,那么中控会依次查找以下文件,直到找到为止尝试加载或无一存在后报错退出:

  1. /home/dev/cs/config 目录
    1. /home/dev/cs/config/setting.json
    2. /home/dev/cs/config/setting.toml
    3. /home/dev/cs/config/setting.yaml
    4. /home/dev/cs/config/setting.hcl
  2. /home/dev/cs 目录
    1. /home/dev/cs/setting.json
    2. /home/dev/cs/setting.toml
    3. /home/dev/cs/setting.yaml
    4. /home/dev/cs/setting.hcl
  3. /home/dev 目录
    1. /home/dev/setting.json
    2. /home/dev/setting.toml
    3. /home/dev/setting.yaml
    4. /home/dev/setting.hcl
  4. /home/dev/.config/ctrlsys 目录
    1. /home/dev/.config/ctrlsys/setting.json
    2. /home/dev/.config/ctrlsys/setting.toml
    3. /home/dev/.config/ctrlsys/setting.yaml
    4. /home/dev/.config/ctrlsys/setting.hcl

使用场景:

  • 对于 Kubernetes 部署,可以将配置文件放在执行目录下的 config 目录中,这样的单独目录便于挂载;
  • 对于本地开发调试,可以在当前目录下防止配置文件,这样可以方便地修改配置文件;
  • 对于调试中控本身,考虑到 IDE 会在临时目录中运行,可以将配置文件放在用户目录下的 .config/ctrlsys 目录中,这样可以保证配置文件的全局一致性。
  • YAML 是最常见的配置格式,但是 YAML 有缩进要求,如果眼神不好且头铁的话,可以用 JSON 或者 TOML 格式凑合。

整体结构:第一层级配置参数 #

第一层级有以下配置参数,按功能分类依次介绍。

基础功能 #

配置项类型默认值举例参考值配置项说明
debugbooleanfalsetrue是否开启调试模式,调试模式会输出更多信息
dump_responsebooleanfalsetrue是否将 NLP 相关的引擎响应和中控响应的回复报文保存到当前路径下的 dump_http 目录中
dump_pcmbooleanfalsetrue是否将 ASR 输入引擎的 PCM 音频请求的数据保存到当前路径下的 dump_pcm 目录中
dump_statbooleanfalsetrue是否将 ASR 引擎输出的统计信息保存到当前路径下的 dump_stat 目录中
allow_errorbooleanfalsetrue是否允许引擎出错后重试链接,目前主要针对 ASR 相关失败
network_monitorbooleanfalsetrue是否通过 Ping/Pong 报文监测和 ASR 服务器链接延时和网络可用性(仅针对公有云部署启用),并将结果写入日志,以 event 类包的方式告知客户端
hide_consolebooleanfalsetrue是否隐藏中控程序的控制台窗口,仅在 Windows 桌面环境中使用的场景有效
portinteger80808070WebSocket 服务端口,当默认端口被占用时,可以用此调整
endpointstring/v1/ctrlsysWebSocket 服务端点,可用于 Ingress 等多中控同时挂载的场景
grpcinteger08010gRPC 服务端口号,0或不填表示不启用 gRPC 服务
expire_datestring空字符串2023-12-31过期日期,设置后中控会检查每一个客户端连接建立时的时间,如果时间大于过期时间,则拒绝连接
auth_requiredbooleanfalsetrue是否需要认证,设置后客户端连接后的 Starter 报文中的 auth 字段需要填写有效的 token
auth_tokenlist空数组["2WJO7SV2GVAPPBDR5HBZME3YFQ"]认证令牌列表,如果 auth_required 设置了,则必须设置,token 长度要求为26个字符,客户端连接的 Starter 报文中的 token 只需匹配其一即可
text_chinese_convertstring空字符串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_hotwordslist空字符串["商汤科技"]ASR 动态热词,会随请求发送给具体 ASR 引擎,需要 ASR 引擎支持此功能
asr_result_replacedictionary空词典["张三": "章叁"]ASR 结果的文本改写的文本对,key 为原始匹配的内容,value 为改写后内容,作为 ASR 热词的补充

NLP #

配置项类型默认值举例参考值配置项说明
cache_nlpinteger03600NLP 缓存时间,单位为秒,0表示不启用
heuristic_extra_firstbooleanfalsetrueNLP 启发式开场白忽略,即当前回合首句收到"我是开场白"的回复后自动重试一次
nlp_answer_replacedictionary空词典["以上信息由墨迹天气为您播报。": ""]NLP 答案的文本改写的文本对,key 为原始匹配的内容,value 为改写后内容
geolocation_service_urlstring空字符串http://localhost/ipgeo/query?ip=%sIP转地理位置服务的 URL
fallback_geolocationstring空字符串北京市默认缺省地理位置,当客户端未指定、IP推断失败时,填入的缺省位置

TTS #

配置项类型默认值举例参考值配置项说明
cache_ttsinteger03600TTS 缓存时间,单位为秒,0表示不启用
facefeature_service_urlstring空字符串ws://localhost:58090/ff人脸特征服务 Face Feature 的 URL
tts_silence_padding_msecinteger0500TTS 请求前后静音填充时间,单位为毫秒,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 字段中,具体日志配置的结构如下:

配置项类型默认值举例参考值配置项说明
pathstring空字符串runtime.log日志文件的路径,为空则不保存日志文件到本地
onestringdebuginfo设置统一的日志级别,会覆盖所有的模块指定
clientstringdebuginfo设置 client 包的日志级别
serverstringdebuginfo设置 server 包的日志级别
mockstringdebuginfo设置 mock 包的日志级别
authstringdebuginfo设置独立鉴权包的日志级别
utilitystringdebuginfo设置 utility 包的日志级别
driver_asrstringdebuginfo设置各 ASR 引擎 Driver 的日志级别
driver_nlpstringdebuginfo设置各 NLP 引擎 Driver 的日志级别
driver_ttsstringdebuginfo设置各 TTS 引擎 Driver 的日志级别
worker_asrstringdebuginfo设置 ASR 工作流的日志级别
worker_asr_nlpstringdebuginfo设置 ASR+NLP 工作流的日志级别
worker_nlpstringdebuginfo设置 NLP 工作流的日志级别
worker_echostringdebuginfo设置 ECHO 工作流的日志级别
worker_eventstringdebuginfo设置 EVENT 工作流的日志级别
worker_ttsstringdebuginfo设置 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 配置的结构如下:

配置项类型默认值举例参考值配置项说明
endpointstring空字符串http://localhost:8888/printWebhook 服务端点的 URL,为空则不启用
usernamestring空字符串YOUR_USERNAME服务端点的用户名
passwordstring空字符串YOUR_PASSWORD服务端点的密码

对象存储配置:返回的结果 URL 的存储位置 #

配置填入 object_storage 字段中,具体配置的结构如下——

配置项类型默认值举例参考值配置项说明
typestring空字符串local 或 azure对象存储的类型,为空则不启用
local_pathstring空字符串/tmp/ctrlsys-storage/本地存储路径
endpointstring空字符串http://localhost:8070/object对象存储服务的端点 URL
bucketstring空字符串audio存储桶名称
connection_stringstring空字符串DefaultEndpointsProtocol=https...连接字符串

在使用不同的存储类型时,某些字段可能不会使用,例如使用本地存储时,不会使用 bucket 和 connection_string 字段。具体按 type 区分的字段意义如下:

type存储服务类型local_pathendpointbucketconnection_string说明
local本地存储本地文件夹路径返回 URL 前缀无无使用本地目录进行存储,如文件夹不存在则会新建,并提供简单的 Web Server 供用户下载文件
azureAzure Blob无无Container 名称连接字符串使用 Azure Blob 进行存储,Container 需要预先创建并设置公共访问级别

插件脚本配置:脚本的执行参数和内容 #

作为列表的方式填入配置文件的 script 字段中,具体配置的结构和内容参见 插件脚本 内容。

引擎供应商配置:具体供应商的连接参数 #

所有的引擎供应商的连接参数信息都使用统一的配置结构,但具体的配置项的意义和取舍会根据具体的引擎供应商进行调整,以下是通用的配置项的说明——

配置项类型默认值举例参考值配置项说明
max_connectinteger05允许客户端的最大并发连接数,0则表示不限制
daily_quotainteger0200每日最大调用次数的配额限制,0则表示不限制
on_premisesbool无false 或 true对应供应商引擎是否是私有化部署方案
service_urlstring无ws://api.love.ai/ba/v1供应商引擎服务端点的 URL
auth_urlstring无https://api.love.ai/api/auth供应商引擎鉴权认证的 URL
product_idstring无918018996产品 ID
public_keystring无01f19df131b395ade5aade83021公钥
secret_keystring无C9921CEABF390C41F64635FBA78私钥
extra_configstring无{"max_token":900}补充配置信息字符串,通常为 JSON
proxy_urlstring无无参考值代理 URL

按各类引擎具体供应商的配置项说明如下——

ASR 引擎配置 #

IDon_premisesservice_urlauth_urlproduct_idpublic_keysecret_key说明
1支持WS 接入地址Token 获取接口地址PIDPublic KeySecret Key私有化部署 Token 获取地址不填,即无需获取 Token
2不支持WS 接入地址无AppIDAPIKeyAPISecret仅支持公有云的版本,其他私有化版本可能无法兼容
3支持WS 接入地址Token 获取接口地址APPIDAPIKeyAPISecret私有化和公有云部署,私有化版本无需获取 Token
5不填WS 接入地址无app_id无无私有化和公有云部署都无需鉴权,app_id 用于热词表判断
6不填WS 接入地址无app_id无无与 ASR5 部署相同但引擎启动参数不同
7不支持RegionMSA 接入地址Key无无中控通过 Azure Post-Adapter 与 Azure 建立连接

注意:

  1. max_connect 字段对所有 ASR 引擎均有效;
  2. daily_quota 字段对所有 ASR 引擎均无效(未实现);
  3. 如需支持 URL 结果返回,即请求中的 cache_url 字段,需要在顶层配置中填写有效的 object_storage 配置;
  4. ASR1 公有云部署当前已经停止服务,不再提供服务;
  5. ASR4 为中间版本,已经停止开发,未进行任何对外部署;
  6. ASR7 不提供私有化部署方案,需要事先部署 Azure Post-Adapter 服务,中控通过其进行连接。

NLP 引擎配置 #

IDon_premisesservice_urlauth_urlproduct_idpublic_keysecret_keyextra_config说明
1支持WS 接入地址Token 获取接口地址PIDPublic KeySecret Key无私有化部署 Token 获取地址不填,即无需获取 Token
2支持HTTP 接入地址无AppIDUsernamePassword支持具体配置填写按部署架构灵活调整
3不填HTTP 接入地址无无publicKeyprivateKey无私有化和公有云部署均支持,无特别变化
4不支持HTTP 接入地址无AppID无无无仅适用于客户自研的实验场景
5不支持HTTP 接入地址无无无API Key支持国内部署需配置 Proxy
6不支持HTTP 接入地址无无无API Key支持国内部署需配置 Proxy,使用 Azure OpenAI Service 需填入对应 service_url

注意:

  1. max_connect 和 daily_quota 字段对所有 TTS 引擎均有效;
  2. extra_config 对于不同的 NLP 引擎有不同的配置,具体参见以下详细说明;
  3. proxy_url 仅对 NLP5 和 NLP6 有效,其他国内部署的引擎不支持也不需要代理;
  4. NLP2 通过选配的 NLP2 Post-Adapter 可以实现任意临时引擎的接入,具体配置也会不尽相同;

NLP2 的 extra_config 的 JSON 字段说明:

主要面向 Post-Adapter,具体参数需要与 Adapter 约定。当 Starter 报文中 NLP 对应大模型参数未填时,使用此配置文件的中的预设配置,且仅当 adapter_target 字段为非空时,才会其他配置才会生效。

配置项类型默认值举例参考值配置项说明
adapter_targetstring无sensechatAdapter 的转换平台示意
prompt_headerstring无你是我的AI助理大语言模型的 System Prompt
max_completion_tokeninteger0200回复内容的最大令牌数,0表示不限制

NLP5 的 extra_config 的 JSON 字段说明:

主要是使用 OpenAI 的 GPT-3 模型进行 Completion 任务,所以配置项也主要是针对 Completion 完成对话补全任务的参数。仅以此配置文件为准,Starter 报文中 NLP 对应的大模型参数直接忽略。

配置项类型默认值举例参考值配置项说明
prompt_headerstring以下是与AI助手的对话。助理乐于助人、富有创意、聪明而且非常友好。以下是与女友的对话。GPT-3 模型的 Prompt 的首部
role_botstringAI小美机器人的角色名,如果为空,则默认跳过
role_humanstring人类小帅人类的角色名,如果为空,则默认跳过
max_lookbackinteger56最大上下文轮数,0表示跳过,即单轮
max_completion_tokeninteger5001000回复内容的最大令牌数,非0表示设定,取值范围是50到4097之间,无效值会被重置为默认值

NLP6 的 extra_config 的 JSON 字段说明:

主要是使用 OpenAI 的 GPT-3.5/4 模型进行 Chat Completion 任务,所以配置项也有相应变化。当 Starter 报文中 NLP 对应大模型参数未填时,使用此配置文件的中的预设配置。

配置项类型默认值举例参考值配置项说明
engine_modelstringgpt-3.5-turboQQTool默认的引擎模型名,如果为空,则默认使用 GPT 3.5 Turbo
prompt_headerstring以下是与AI助手的对话。助理乐于助人、富有创意、聪明而且非常友好。你是我的AI助理,助理乐于助人、富有创意、聪明而且非常友好。对话补全上下文的 System Prompt 部分
max_lookbackinteger510最大上下文轮数,0表示跳过,即单轮
max_completion_tokeninteger500600回复内容的最大令牌数,非0表示设定,取值范围是50到4097之间,无效值会被重置为默认值

TTS 引擎配置 #

IDon_premisesservice_urlauth_urlproduct_idpublic_keysecret_key说明
1支持WS 接入地址Token 获取接口地址PIDPublic KeySecret Key私有化部署 Token 获取地址不填,即无需获取 Token
2支持WS 接入地址Token 获取接口地址PIDPublic KeySecret Key私有化部署 Token 获取地址不填,即无需获取 Token
3不填WS 接入地址无无无无私有化和公有云部署都无需鉴权
4不支持HTTP 接入地址无Key无无注意不要填错成 Auth 地址
5不支持RegionMSA 接入地址Key无无中控通过 Azure Post-Adapter 与 Azure 建立连接

注意:

  1. TTS5 不提供私有化部署方案,需要事先部署 Azure Post-Adapter 服务,中控通过其进行连接;
  2. 如需 TTS 支持 Face Feature 需要在顶层配置中填写有效的 facefeature_service_url 地址;
  3. 如需支持 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)