一个研究组的论文、笔记与内部文档,被做成了一个能带出处回答问题的聊天机器人,并用一个 script 标签嵌进组里自己的网页。OuRAGboros 是后端服务,Chatbot-Widget 是那个 12 KB 的前端小组件。两者都在 SLAC-ML 名下开源,服务跑在 SLAC 的 S3DF Kubernetes 集群上,置于单点登录(SSO)之后。
- 13REST 与 SSE 端点
- 4 · 3LLM 提供方 · 向量库
- 12 KB即插即用的小组件,MIT 许可
研究组的入门问题
每个研究组都面临同样的入门问题:新生要掌握的东西散落在十几年的 PDF 里,而能回答这些问题的人又都很忙。最自然的办法是用大语言模型(LLM)做一个检索增强生成(RAG)聊天机器人;但多数做出来只服务作者自己。一个研究组要的是即插即用:指给它一个装文档的文件夹,嵌一个 script 标签,还要能判断回答到底好不好。这个项目从斯坦福 ICME 的一次研究轮转(research rotation)原型起步,我的工作就是把它变成这样一个服务。
服务的架构
服务是一个 FastAPI 应用,它的 /ask/stream 端点用服务器推送事件(Server-Sent Events,SSE)把状态、检索到的文档与回答的 token 流式送出。知识库按研究组和嵌入模型(embedding)隔离,可放在三种向量库之一:开发时用内存版,另外两种是带 HNSW 索引的 OpenSearch 与 Qdrant。生成这一步由 provider:model 标识路由到 Ollama,OpenAI,Gemini 或 Stanford AI API,支持异步流式输出与模型提供方之间的自动回退。
我最在意的是评估回路。每次回答的流结束之后,这次问答先进入异步队列,再按批写进按月轮转的 OpenSearch 索引;之后由一个伴生服务(sidecar)用 RAGAS 评两个指标:忠实度与答案相关性。这些都不在用户请求的路径上,不会拖慢回答。配套的日志查看器可以按知识库、模型与分数筛选回答,于是哪一周答得差可以直接看出,不必靠零星的反馈。
生产部署与前端小组件
- 生产运行。 S3DF Kubernetes 集群上的 4 个服务,约占一个 384 核集群的 15%,要经过 SLAC 单点登录(SSO)才能访问。走到这一步,先修好了因内存不足被杀(OOM)的嵌入任务,以及 ReadWriteOnce 卷与单个纵向扩容副本的冲突,之后 6 周里发布了 13 个按日期打标签的镜像,用一条命令完成部署。
- 可嵌入。 一个 script 标签加一个配置对象,就能让任何静态页面拥有流式输出的 Markdown 与 LaTeX 回答、可折叠的来源面板、RAG 开关、深色主题与本地历史。
我做的事。 我是 OuRAGboros 的主要贡献者(54% 的提交):REST 与流式 API、多知识库隔离、模型提供方路由、评估回路,以及 Kubernetes 部署与单点登录(SSO)这一层。Chatbot-Widget 由我一人写成。嵌入模型的微调由合作者完成,我负责把微调出来的模型部署上线并做热替换。
生产实例:mli-llm-rag.slac.stanford.edu,需经 SLAC 单点登录。提交占比取自 GitHub 的贡献者统计,2026 年 8 月。