配置文件

配置文件修改指南 #

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

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

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

  • 文件名主体为 setting,如果需要指定其他,可以在环境变量中设置 CONFIG 变量;
  • 文件扩展名按照优先级顺序支持 jsontomlyamlhcl
  • 加载时依次查询:
    • 当前目录下的 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 表示 true0 表示 false,其他值无效;
  • dump_pcm 可以通过环境变量 DH_CS_PCM 进行覆盖,1 表示 true0 表示 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 认证,如果需要认证,请设置 usernamepassword 字段。

配置填入 webhook 字段中,具体 Webhook 配置的结构如下:

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

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

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

配置项类型默认值举例参考值配置项说明
typestring空字符串localazure对象存储的类型,为空则不启用
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 BlobContainer 名称连接字符串使用 Azure Blob 进行存储,Container 需要预先创建并设置公共访问级别

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

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

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

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

配置项类型默认值举例参考值配置项说明
max_connectinteger05允许客户端的最大并发连接数,0则表示不限制
daily_quotainteger0200每日最大调用次数的配额限制,0则表示不限制
on_premisesboolfalsetrue对应供应商引擎是否是私有化部署方案
service_urlstringws://api.love.ai/ba/v1供应商引擎服务端点的 URL
auth_urlstringhttps://api.love.ai/api/auth供应商引擎鉴权认证的 URL
product_idstring918018996产品 ID
public_keystring01f19df131b395ade5aade83021公钥
secret_keystringC9921CEABF390C41F64635FBA78私钥
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_connectdaily_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_targetstringsensechatAdapter 的转换平台示意
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)