DidemKurtErsoy1/babyq

GitHub: DidemKurtErsoy1/babyq

一款面向父母的 AI 儿科问答助手,通过规则检测、FAQ匹配与Gemini大模型三级机制,快速提供安全易懂的育儿健康建议。

Stars: 0 | Forks: 0

# BabyQ 👶 **面向父母的 AI 儿科问答助手** —— 输入关于宝宝症状的问题,即可在几秒钟内获得简短、安全、通俗易懂的回答。该功能由基于规则的紧急情况检测、精选的 FAQ 知识库以及作为备选推理层的 Google Gemini 提供支持。 **在线演示:** https://babyq.app/ · **产品策略:** [docs/PRODUCT_STRATEGY.md](docs/PRODUCT_STRATEGY.md)

BabyQ landing page BabyQ Ask flow with an AI-generated answer

BabyQ articles library

## 为什么做这个项目 父母经常在凌晨两点焦急地使用搜索引擎,询问关于发烧或皮疹的模糊问题。BabyQ 探索了一种轻量级、安全优先的分诊层设计:确定性规则会优先捕捉危险信号症状,小型 FAQ 数据集以低成本处理常见问题,而 LLM 仅用于填补其他所有空白 —— 配备多模型备选链路,确保单一服务商宕机不会导致功能瘫痪。 ## 功能 - **提问流程** —— 输入宝宝的年龄、性别和自由文本问题;获取结构化回答(摘要、可操作建议、“何时就医”)。 - **三级回答解析机制**:依次为 `RULES → FAQ → AI`,优先级从左到右: 1. **紧急规则**优先执行(包含 TR/EN 双语的年龄 + 体温 + 危险关键词检测),并直接短路至紧急护理警告 —— 无需 LLM 往返,没有延迟。 2. **FAQ 匹配**根据年龄段和关键词重叠度,对由 Supabase 支持的 FAQ 表进行评分。 3. **Gemini 备选链**(`gemini-flash-lite-latest` → `gemini-flash-latest` → `gemini-pro-latest`,Google 自动更新的模型别名)利用最匹配的 FAQ 结果作为上下文生成有据可查的回答,如果首次调用失败,则使用更短的重试 prompt。 - **双语支持 (TR/EN)** —— 根据输入文本自动检测语言(支持通过 `?lang=` 覆盖),涵盖 UI 文案、prompt 和免责声明。 - **身份验证与多宝宝档案** —— Supabase 邮箱/密码身份验证;已登录用户可以保存多个孩子,在提问页面选择针对哪个孩子提问,并保存持久化的历史提问记录(访客回退使用 `localStorage`)。 - **文章库** —— 涵盖 7 个类别(发烧、喂养、睡眠、呼吸、新生儿护理、安全、皮肤与洗澡)的 20 篇编辑撰写的参考文章,并附带来源。 - **产品分析** —— 通过 PostHog 埋点的激活漏斗(`$pageview` → `ask_started` → `answer_received` → `signup_completed`)。 - **PWA** —— 可通过 `manifest.json` + service worker 安装并支持离线使用。 - **反馈闭环** —— 支持对 AI 回答进行点赞/点踩,数据将被保存以供后续质量审查。 ## 架构 ``` ┌─────────────┐ ┌──────────────────────┐ ┌───────────────┐ │ app/page.tsx │ ───▶ │ POST /api/ask │ ───▶ │ Supabase │ │ (Ask form) │ │ │ │ (faqs, │ └─────────────┘ │ 1. emergency rules │ │ questions, │ │ 2. FAQ scoring │◀─────│ profiles, │ │ 3. Gemini fallback │ │ feedback) │ └──────┬───────────────┘ └───────────────┘ │ ▼ Google Gemini API (flash-lite-latest → flash-latest → pro-latest) ``` - **`app/api/ask/route.ts`** —— 核心决策逻辑:语言检测、紧急程度/体温解析、FAQ 评分、带有弹性多模型 + 重试链路的 Gemini 调用,以及尽力将每一次问答持久化到 Supabase。 - **`app/api/feedback/route.ts`** —— 记录每条回答的有效/无效反馈信号。 - **`lib/supabaseServer.ts`** / **`lib/supabaseBrowser.ts`** —— 分离的 service-role(仅限服务器端)和 anon-key(浏览器端)Supabase 客户端;如果缺少环境变量,浏览器客户端会优雅地降级为 `null`,而不是导致应用崩溃。 - **`lib/useAuth.ts`** —— Supabase 身份验证(session、登录/注册/退出)的轻量级 hook。 - **`lib/useI18n.ts`** —— 跨页面共享的 TR/EN 文案字典 + 语言 hook。 ## 技术栈 | 层级 | 选择 | |---|---| | 框架 | Next.js 15 (App Router, Turbopack) | | UI | React 19, TypeScript, Tailwind CSS v4 | | 身份验证与数据库 | Supabase (Postgres, 邮箱/密码身份验证) | | AI | Google Gemini (`flash-lite-latest` / `flash-latest` / `pro-latest`) | | 分析 | PostHog (激活漏斗, autocapture) | | 部署 | Vercel | | PWA | Web App Manifest + 自定义 service worker | ## 快速开始 ### 前置条件 - Node.js 20+ - 一个 [Supabase](https://supabase.com) 项目 - 用于 Gemini 的 [Google AI Studio](https://aistudio.google.com/) API key ### 设置 ``` git clone https://github.com/DidemKurtErsoy1/babyq.git cd babyq npm install ``` 创建一个 `.env.local` 文件: ``` # 服务端 (Supabase service role — 永远不要暴露给浏览器) SUPABASE_URL=https://your-project.supabase.co SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # 客户端 (Supabase anon key — 可以安全暴露) NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key # AI GEMINI_API_KEY=your-gemini-api-key # Analytics (可选 — 省略以在没有 PostHog 的情况下运行) NEXT_PUBLIC_POSTHOG_KEY=your-posthog-project-key NEXT_PUBLIC_POSTHOG_HOST=https://eu.i.posthog.com ``` 通过 Supabase SQL Editor(按顺序)运行 [`supabase/migrations`](supabase/migrations) 中的 SQL,以创建带有行级安全策略的 `faqs`、`questions`、`feedback`、`profiles` 和 `babies` 表,以及一小部分种子 FAQ 数据。 ``` npm run dev ``` 打开 [http://localhost:3000](http://localhost:3000)。访问 `/api/health` 以确认检测到了哪些环境变量。 ## 项目结构 ``` app/ ├── page.tsx # Ask page (main form + AI/FAQ/fallback response) ├── login/ # Email/password auth ├── history/ # Per-user Q&A history (auth-gated) ├── profile/ # Baby profile (Supabase or localStorage) ├── articles/ # Static article library ├── legal/ # Medical disclaimer └── api/ ├── ask/ # Core AI consultation endpoint ├── feedback/ # Answer feedback └── health/ # Env var diagnostics lib/ ├── supabaseServer.ts # Service-role client (server-only) ├── supabaseBrowser.ts # Anon-key client (browser, singleton) ├── useAuth.ts # Auth hook └── useI18n.ts # TR/EN copy + language hook ``` ## 路线图 / 已知局限性 有关完整的产品构思 —— 竞品分析、基于 RICE 优先级的待办事项列表以及 Now / Next / Later 路线图 —— 请参阅 **[docs/PRODUCT_STRATEGY.md](docs/PRODUCT_STRATEGY.md)**。 已知的技术局限性: - 尚无自动化测试套件(候选方案:使用 Vitest 测试 `app/api/ask` 的决策逻辑 —— 规则、紧急检测、语言检测属于纯函数,单元测试成本极低)。 - 无 CI pipeline(在 PR 时执行 lint/typecheck/build)。 - 文章为静态数据,非数据库支持。 - 安装了 `openai` 依赖但未使用(Gemini 是唯一活跃的提供商)。 - `/api/ask` 目前未经过身份验证且无速率限制(在策略文档中被标记为 P0)。 ## 免责声明 BabyQ 是一个作品集/演示项目。它**不是经过认证的医疗设备**,绝不能作为专业儿科护理的替代品。在紧急情况下,请务必联系您当地的急救电话或最近的医疗机构。
标签:Gemini, Supabase, 云计算, 人工智能, 儿科问答助手, 医疗信息, 用户模式Hook绕过, 自动化攻击, 规则引擎