KamoCRM 中的 SI 助理在回复之前会读取租户自己的文档。 要完成这项工作,我们需要自己运行整个链条:一个模型服务器、一个嵌入式模型、一个矢量数据库、语音识别、语音合成和机器翻译,所有这些都在我们的集群内,所有数据都从不离开集群。
| 措施 | 价值 | 资料来源 | 已计量 |
|---|---|---|---|
| 自托管推理和语音服务 | 6 (model server, embedding model, vector database, speech recognition, speech synthesis, machine translation) | kubectl get deployments,statefulsets --all-namespaces | |
| 平台中的专用检索和矢量服务 | 3 (RAG service, vector service, embedding model) | kubectl get deployments -n kamo | |
| 自托管翻译管道支持的语言 | 22 | messages/*.json in the marketing site repository | |
| 光学字符识别误差率 | 0.180 CER | ocrservice evaluation run |
它教会了我们什么建筑
调用托管模型 API 需要一个下午的时间,我们也会在正确的答案出现时进行调用。 自己运行推理是另一个学科,客户在数据敏感时会问我们这一问题 — — 医疗、财务、法律、任何数据驻留义务。 到那时,"我们将其发送给第三方"就会结束对话,只有实际运行了替代方案的团队才能继续对话。
检索是这些系统的胜负之所在,而且大多数时候并不引人注目。 将文档分块,使得检索的段落是自我包含的;当用户输入了四个字时,决定查询的含义;使检索尊重权限,这样助手就不能从提问者不允许阅读的文档中回答 — — 这很容易出错,而这种错误最终会被写进监管者的信而不是bug跟踪器。 我们的知识库具有可见性层,检索层必须与面向人类的读取一样尊重这些层,在两个必须一致的独立位置。
我们还在二十二种语言中运行语音识别和合成,以及机器翻译。 翻译管道教会了我们最多的东西,主要是通过无声的失败:运行的批量更新没有事务成功,在纸上并没有为二十一种语言写入任何内容,因为没有发生任何事件,所以很长一段时间没有人注意到。
建于
- Ollama
- Qdrant
- Whisper
- Coqui TTS
- LibreTranslate
- Python
- Java
- Spring Boot
