EN

给研究组用的 RAG 聊天机器人

即插即用的科研助手,每一条回答都自动评分。

一个研究组的论文、笔记与内部文档,被做成了一个能带出处回答问题的聊天机器人,并用一个 script 标签嵌进组里自己的网页。OuRAGboros 是后端服务,Chatbot-Widget 是那个 12 KB 的前端小组件。两者都在 SLAC-ML 名下开源,服务跑在 SLAC 的 S3DF Kubernetes 集群上,置于单点登录(SSO)之后。

研究组的入门问题

每个研究组都面临同样的入门问题:新生要掌握的东西散落在十几年的 PDF 里,而能回答这些问题的人又都很忙。最自然的办法是用大语言模型(LLM)做一个检索增强生成(RAG)聊天机器人;但多数做出来只服务作者自己。一个研究组要的是即插即用:指给它一个装文档的文件夹,嵌一个 script 标签,还要能判断回答到底好不好。这个项目从斯坦福 ICME 的一次研究轮转(research rotation)原型起步,我的工作就是把它变成这样一个服务。

服务的架构

架构:小组件与一个 FastAPI 流式服务通信,服务从三种向量库之一检索,经四家 LLM 提供方之一生成回答;异步的日志记录器和 RAGAS 评估器给每一条回答打分;全部跑在 S3DF Kubernetes 上,在 SSO 之后 SLAC S3DF Kubernetes · 4 个服务 · SLAC 单点登录之后 Chatbot-WidgetFastAPI检索器LLM 路由 问答日志OpenSearch 日志索引RAGAS 评估器 12 KB,任何静态页面Markdown · LaTeX · 来源面板 REST + 服务器推送事件13 个端点 按知识库 × 嵌入模型隔离内存 · OpenSearch · Qdrant provider:model 标识 · 异步 · 自动回退Ollama · OpenAI · Gemini · Stanford AI API 异步队列,批量写入按月轮转忠实度 · 答案相关性 SSE查询来源 + 提示词回答逐 token 流回 流结束之后评分
上方一行是请求经过的路径,下方用强调色画的评估回路不在这条路径上。

服务是一个 FastAPI 应用,它的 /ask/stream 端点用服务器推送事件(Server-Sent Events,SSE)把状态、检索到的文档与回答的 token 流式送出。知识库按研究组和嵌入模型(embedding)隔离,可放在三种向量库之一:开发时用内存版,另外两种是带 HNSW 索引的 OpenSearch 与 Qdrant。生成这一步由 provider:model 标识路由到 Ollama,OpenAI,Gemini 或 Stanford AI API,支持异步流式输出与模型提供方之间的自动回退。

我最在意的是评估回路。每次回答的流结束之后,这次问答先进入异步队列,再按批写进按月轮转的 OpenSearch 索引;之后由一个伴生服务(sidecar)用 RAGAS 评两个指标:忠实度与答案相关性。这些都不在用户请求的路径上,不会拖慢回答。配套的日志查看器可以按知识库、模型与分数筛选回答,于是哪一周答得差可以直接看出,不必靠零星的反馈。

生产部署与前端小组件

我做的事。 我是 OuRAGboros 的主要贡献者(54% 的提交):REST 与流式 API、多知识库隔离、模型提供方路由、评估回路,以及 Kubernetes 部署与单点登录(SSO)这一层。Chatbot-Widget 由我一人写成。嵌入模型的微调由合作者完成,我负责把微调出来的模型部署上线并做热替换。

生产实例:mli-llm-rag.slac.stanford.edu,需经 SLAC 单点登录。提交占比取自 GitHub 的贡献者统计,2026 年 8 月。