degree-guru
Upstash 出品的 RAG 问答机器人教学项目,从爬虫到 Agent 完整链路,支持任意网站快速切换数据源
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Upstash 出品的 RAG 问答机器人教学项目,从爬虫到 Agent 完整链路,支持任意网站快速切换数据源
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
图1:DegreeGuru 工作界面演示
想象一下这样的场景:你在申请斯坦福大学的学位项目,面对几百个专业方向眼花缭乱——计算机科学与生物工程的交叉项目听起来很酷,但具体学什么?毕业后的就业路径如何?官网的 PDF 文件晦涩难懂,打电话给招生办又排不上队。
这就是 DegreeGuru 诞生的背景。它是一个基于 RAG(检索增强生成)技术构建的 AI 聊天机器人,专门用来回答关于大学学位项目的各类问题。该项目以斯坦福大学的学位数据作为演示数据,展示了如何将任意网站内容转化为一整套可对话的知识库系统。用户在界面上输入自然语言问题(如「创意写作专业有哪些资源?」),AI 便会结合向量数据库中检索到的真实内容,给出准确、结构化的回答,并支持流式输出——答案一个字一个字地涌现,像真人在打字。
DegreeGuru 由 Upstash 团队推出。Upstash 是一家专注于 Serverless 数据存储的云服务商,以 Redis 和 Vector 等即用即付数据库产品著称。该项目并非 Upstash 的商业产品,而是一个社区驱动的教学项目(Community Project),旨在通过一个完整、可运行的案例,帮助开发者快速掌握 AI RAG 应用的全链路开发方法。
Upstash 在 GitHub 上维护了丰富的开源示例仓库,覆盖向量检索、Rate Limiting、实时数据等多个场景。DegreeGuru 是其中将多个 Upstash 服务串联起来的集大成者:它用 Upstash Vector 存储文档向量、用 Upstash Redis 处理限速逻辑、用 Vercel AI SDK 实现流式对话。2024 年 1 月正式开源后,该项目获得了 220+ Stars 和 62 Forks,成为 RAG 教学领域的标杆参考项目。
项目默认使用斯坦福大学的学位信息作为数据源,但整个系统设计与数据完全解耦——只需修改爬虫配置文件中的目标网站 URL,重新运行爬虫,系统立刻就能变成另一个领域的问答机器人。
传统的大语言模型(LLM)有一个显著局限:知识截止日期。模型知道的内容取决于训练时喂入的数据,而最新的信息、特定的私有数据(如某所大学 2024 年的课程安排),模型很可能一无所知。强行让模型「幻觉」一个答案,后果往往比不知道更糟。
RAG(Retrieval-Augmented Generation,检索增强生成)正是为解决这一问题而生。它的核心思想非常直观:先检索,再生成。
想象你要回答「这所大学的哲学专业有什么特色」这个问题,但没有互联网,也没有 AI。传统的做法是:雇一个人,让他把所有相关文档背下来(这相当于 Fine-tuning 微调),成本极高,而且换一个问题就得重新训练。RAG 的做法则相当于:为你配备一个聪明的图书管理员。当你提问时,图书管理员先去书架上精准找到最相关的几页内容(向量检索),然后把这些内容和你的问题一起交给一个博学的教授(LLM),教授基于真实材料给出答案。
这样有两个关键好处:一是答案始终「有据可查」,不会凭空捏造;二是更新知识库不需要重新训练模型,只要重新爬取并向量化最新内容即可。DegreeGuru 正是这一理念的最佳实践范本。
从代码结构来看,DegreeGuru 由两个相对独立子系统组成,通过 Upstash Vector 数据库解耦:
子系统一:爬虫(Python/Scrapy)
爬虫位于 degreegurucrawler/ 目录,基于 Scrapy 框架开发。配置文件 configurable.py 中定义了起始 URL 列表和链接提取规则(允许爬取哪些链接)。当爬虫访问每个页面时,通过 XPath 提取所有 <p> 标签内的文本内容,然后使用 RecursiveCharacterTextSplitter 按语义分块(chunk)。每块文本通过 OpenAI 的 text-embedding-ada-002 模型转换为 1536 维向量,附带原始文本和来源 URL 作为元数据,一起 Upsert 到 Upstash Vector 数据库。
值得注意的是,爬虫使用了 Docker Compose 进行容器化编排。官方提供了 docker-compose.yml,一行命令即可启动爬虫容器,自动完成数据抓取和向量入库。这种设计让整个爬取过程与本地环境完全隔离,也便于在服务器上长期定时运行。
子系统二:Next.js 对话应用(TypeScript/LangChain.js)
主应用位于根目录,基于 Next.js 14(App Router 架构)构建,UI 使用 Tailwind CSS。核心对话逻辑在 src/app/api/guru/route.tsx 中实现,这是一个标准的 Next.js Route Handler(边缘函数),完整链路如下:
图2:Upstash Vector 数据库创建,需设置向量维度为 1536
消息转换:用户通过 ai/react 的 useChat Hook 发送消息,消息经 convertVercelMessageToLangChainMessage 转换为 LangChain 内部的消息对象格式,保留历史上下文。
向量检索:使用 UpstashVectorStore(继承 LangChain 的 VectorStore 基类)连接向量数据库,通过 MMR(最大边际相关性)算法检索 Top 6 条最相关内容。MMR 的核心作用是在相关性和多样性之间取得平衡——避免返回的内容高度重复,提升回答的丰富度。
Agent 推理:构建一个 OpenAI Functions Agent(createOpenAIFunctionsAgent),将向量检索工具注册为 Tool。Agent 根据用户问题决定是否调用检索工具,并将检索结果注入 prompt 上下文,让 GPT-3.5-turbo-1106 在真实材料基础上生成答案。
流式输出:设置 streaming: true,AI 的每个 token 生成后立即通过 Vercel 的 StreamingTextResponse 推送至前端,前端实时渲染,实现「逐字出现」的打字效果。
速率限制:通过 @upstash/ratelimit 在 Redis 上实现滑动窗口限速(10 秒内最多 1 次请求),有效防止 API 滥用。
路径一:爱好者快速体验(推荐)
DegreeGuru 提供了 Vercel 一键部署按钮。点击后,Vercel 会自动 fork 仓库、配置构建环境,你只需要在 Vercel 的环境变量面板中填入四个 Key:
UPSTASH_REDIS_REST_URL / UPSTASH_REDIS_REST_TOKEN(Upstash Redis,免费层即可)UPSTASH_VECTOR_REST_URL / UPSTASH_VECTOR_REST_TOKEN(Upstash Vector,免费层,1536 维度)OPENAI_API_KEY(OpenAI 平台,自付用量费)这条路径不需要安装任何本地工具,5 分钟内可以拥有自己的在线问答机器人。部署完成后,爬虫部分需要额外单独运行(用 Docker Compose),否则向量库为空,机器人只能回答「不知道」。
路径二:开发者深度定制
如果你希望将 DegreeGuru 改造成自己领域(医疗、法律、产品文档等)的问答系统,需要修改 degreegurucrawler/degreegurucrawler/spiders/configurable.py 中的 crawler_config:将 start_urls 改为你目标网站的 URL 列表,调整 link_extractor 规则以控制爬取范围。
爬取完成后,Next.js 应用会自动连接同一个 Upstash Vector 数据库,零代码修改即可切换数据源。这种「数据即插即用」的设计,是 DegreeGuru 作为教学项目最有价值的地方之一。
DegreeGuru 的 README 专门开设了「Shortcomings」章节,坦诚列出项目的主要不足,这种透明态度在开源项目中并不多见。
对外部 API 的强依赖是首要问题。项目依赖 OpenAI 的 GPT-3.5-turbo-1106 和 text-embedding-ada-002,每条问答都需要付费调用。生产环境中,随着用户量增长,OpenAI API 费用可能快速攀升。虽然理论上可以用本地模型(如 Ollama)替代,但当前代码与 OpenAI 深度绑定,切换成本不低。
数据更新延迟是 RAG 类项目的通病。爬虫定期抓取网站内容,但无法做到实时同步。如果斯坦福大学的课程信息在爬虫运行后才更新,AI 给出的答案可能滞后。解决方向包括:增量爬取、Webhook 触发爬取、或接入持续更新的 API。
向量检索精度受限于分块策略。当前爬虫使用 RecursiveCharacterTextSplitter 按固定大小分块(chunk_size),如果一块文本跨越了两个语义不相关的段落,分块边界恰好在关键信息中间,向量检索就可能丢失上下文。这是一个在生产环境中需要反复调优的参数。
仅支持英文。由于 GPT-3.5-turbo-1106 的训练语料以英文为主,对其他语言的语义理解能力较弱。如果目标用户群体使用中文或其他语言,需要考虑切换到支持多语言的 LLM(如 GPT-4o、Claude 3 或国产模型)。
DegreeGuru 的意义不仅是一个斯坦福学位问答机器人,更是一份 RAG 应用开发的完整参考答案。从数据抓取、向量化存储、检索增强、Agent 推理到流式对话,每个环节都有可独立抽离的代码模块,可直接移植到其他项目中。
220 Stars 的社区认可,说明这类「即学即用」的 RAG 教程在开发者中有着广泛需求。随着大模型能力持续提升和推理成本不断下降,基于私有数据的 AI 问答系统正在从大厂专属走向中小企业和个人开发者。DegreeGuru 正是这一趋势的缩影——它用最小的工程成本,展示了如何将一个普通网站,变成一个会思考、会回答的智能助手。
如果你正在学习 AI 应用开发,DegreeGuru 是一个值得花半天时间完整复现的项目:从 fork 代码、注册 Upstash 账号、配置环境变量、启动爬虫、到与自己的 AI 问答机器人对话——整个流程走一遍,你对 RAG 的理解会比任何文章都更深刻。