Srinihalreddyr/vitatwin
GitHub: Srinihalreddyr/vitatwin
VitaTwin 是一个结合本地 LLM、FAISS RAG 和临床规则引擎的心理健康智能原型系统,通过对纵向用户数据的多信号分析实现倦怠、焦虑与抑郁的早期检测与可解释风险预警。
Stars: 0 | Forks: 0
# 🧠 VitaTwin — 心理健康智能助手
VitaTwin 是一个临床智能原型,它结合了**本地 LLM (Ollama/llama3)**、**FAISS RAG pipeline**、**多信号临床规则引擎**和**实时 Streamlit dashboard**,旨在将心理健康护理从被动治疗转向**早期危机检测**。
## 🚀 快速开始
### 步骤 0 — 导航至项目文件夹
```
cd vitatwin
```
### 步骤 1 — 安装 Ollama(用于 LLM 支持)
从 **https://ollama.com/download** 下载并安装,然后运行:
```
ollama pull llama3
```
### 步骤 2 — 安装 Python 依赖
```
pip install faiss-cpu numpy pandas flask streamlit plotly ollama
```
### 步骤 3 — 生成数据集 + 构建 FAISS 索引
```
python main.py setup
```
### 步骤 4a — 启动 dashboard
```
python -m streamlit run ui/dashboard.py
```
### 步骤 4b — 或者启动 REST API
```
python main.py api
```
### 步骤 5 — 运行系统测试
```
python main.py test
```
## 🏗️ 架构
```
vitatwin/
├── data/
│ ├── generate_dataset.py # Synthetic dataset generator (50 users, 14 days)
│ ├── users.json # 50 user profiles
│ ├── users.csv # Flat CSV export
│ ├── vitatwin.db # SQLite database
│ ├── faiss.index # FAISS vector index
│ └── faiss_meta.pkl # TF-IDF vectorizer + document store
│
├── rag/
│ └── rag_pipeline.py # FAISS + TF-IDF RAG engine
│
├── models/
│ ├── clinical_engine.py # Rule-based early detection engine
│ └── assistant.py # Ollama LLM assistant (with template fallback)
│
├── api/
│ └── server.py # Flask REST API (6 endpoints)
│
├── ui/
│ └── dashboard.py # Streamlit dashboard (4 pages)
│
└── main.py # Entry point (setup / api / test)
```
### 系统流程
```
User Query
│
▼
[RAG Pipeline]
TF-IDF Vectorizer → FAISS Index → Top-K User Profiles retrieved
│
▼
[Clinical Rule Engine]
Multi-signal Rule Evaluation → Findings + Signals + Confidence
│
▼
[Ollama LLM — llama3]
System prompt + structured patient context → Natural language response
│
▼
[API / Dashboard]
JSON response with risk_score, explanation, suggested_actions, explainability block
```
## 📦 第 1 部分 — 数据集
**50 个合成用户配置**,每个包含 14 天的纵向数据。
| 字段 | 描述 |
|-------|-------------|
| `user_id` | 唯一标识符 (VT001–VT050) |
| `mood_history` | 每日情绪得分 (1–10) 及其真实趋势 |
| `stress_scores` | 每日压力得分 (1–10) |
| `sleep_hours` | 每日睡眠时长 |
| `energy_levels` | 每日精力得分 (1–10) |
| `journal_entries` | 每日文字日记条目 |
| `social_indicators` | 社交互动、运动、工作时长、屏幕时间 |
| `aggregates` | 所有指标的 14 天平均值 |
**状态标签**(在 50 个用户中的分布情况):
- `healthy` (8), `mild_stress` (8), `moderate_stress` (8)
- `severe_stress` (6), `burnout_risk` (7), `anxiety_trend` (6)
- `depression_indicators` (4), `resilient` (3)
存储于:`data/users.json`, `data/users.csv`, `data/vitatwin.db`
## 🔍 第 2 部分 — RAG Pipeline
**文件:** `rag/rag_pipeline.py`
```
User Profiles
│
▼
Document Builder → Clinically-engineered text chunks
│
▼
TF-IDF Vectorizer (512 features, IDF-weighted, L2-normalized)
│
▼
FAISS IndexFlatIP (inner-product = cosine similarity on unit vectors)
│
▼
Top-K profiles → injected as context into Ollama LLM prompt
```
**支持的查询:**
- `"What mental health risks are visible?"` → 检索高风险配置
- `"Has stress increased recently?"` → 检索压力呈上升趋势的用户
- `"Summarize this user's emotional state"` → 返回完整的纵向上下文
## 🤖 第 3 部分 — LLM 心理健康助手 (Ollama)
**文件:** `models/assistant.py`
该助手使用 **Ollama**(默认为本地 LLM — llama3)并结合 FAISS 检索到的上下文:
```
# RAG 检索患者上下文
context = _build_user_context(user, result) # 14-day data + clinical findings
# Ollama 生成临床响应
response = ollama.chat(
model="llama3",
messages=[
{"role": "system", "content": SYSTEM_PROMPT}, # clinical analyst persona
{"role": "user", "content": f"{context}\n\nQuestion: {question}"}
]
)
```
**功能:**
- 由 LLM 根据用户的风险配置生成自适应的日常问候问题
- 基于实际 14 天数据的支持性临床叙述
- 跨主题推理(例如,“压力如何影响睡眠?”)
- 如果 Ollama 未运行,可平滑降级至模板引擎
**LLM 状态**会实时显示在 dashboard 侧边栏和 AI 助手页面顶部。
## ⚠️ 第 4 部分 — 早期检测逻辑
**文件:** `models/clinical_engine.py`
四个规则评估器并行运行:
### 倦怠检测器
| 信号 | 阈值 | 权重 |
|--------|-----------|--------|
| 平均压力 (14天) | ≥ 7.0 | +15–25 分 |
| 压力趋势斜率 | > 0.15/天 | +15 分 |
| 睡眠下降 (7天) | ≤ −20% | +20 分 |
| 平均精力 | ≤ 4.0 | +10–20 分 |
| 工作时长 | ≥ 10小时/天 | +10 分 |
| 负面日记比例 | ≥ 50% | +10–20 分 |
### 焦虑检测器
信号:压力升高、压力波动大 (σ)、睡眠不佳、负面日记、社交退缩
### 抑郁检测器
信号:情绪低落 (平均值 ≤ 4.0)、情绪呈下降趋势、无运动、孤立 (每周社交 ≤ 1 次)、精力极低、持续负面认知
### 韧性检测器
识别具有持续良好健康特征的用户。
### 风险等级
| 得分 | 等级 |
|-------|-------|
| 0–30 | 低 |
| 31–55 | 中等 |
| 56–75 | 高 |
| 76–100 | 临界 |
## 💡 第 5 部分 — 可解释性
每项发现都具有完整的来源信息:
```
Finding(
category="burnout_risk",
label="Potential Burnout Risk",
risk_score=75.0,
confidence=0.8, # 80% — 4 of 5 signals fired
signals=[
Signal("avg_stress", value=9.6, threshold=7.0, severity="severe"),
Signal("low_energy", value=3.7, threshold=4.0, severity="moderate"),
Signal("overwork", value=13.0, threshold=10.0, severity="mild"),
Signal("negative_journals", value=0.71, threshold=0.5, severity="severe"),
],
triggered_data={
"avg_stress_14d": 9.6,
"stress_trend_slope": 0.039,
"sleep_pct_change_7d": -18.2,
"avg_energy_14d": 3.7,
"work_hours_daily": 13.0,
"negative_journal_ratio": 0.71,
}
)
```
## 🌐 第 6 部分 — 临床智能 API
**文件:** `api/server.py` · 启动:`python main.py api` → `http://localhost:5000`
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| GET | `/mental/health` | 服务健康检查 |
| GET | `/mental/users` | 列出所有 50 位用户 |
| POST | `/mental/screen` | 完整的心理健康筛查 |
| POST | `/mental/ask` | 基于 LLM 的临床问答 |
| POST | `/mental/risk-score` | 风险得分 + 完整的可解释性信息块 |
| GET | `/mental/summary/` | 情绪总结 + 自适应问题 |
| GET | `/mental/search?q=...` | 基于 FAISS 的语义用户搜索 |
## 📊 第 7 部分 — Dashboard
**文件:** `ui/dashboard.py` · 启动:`streamlit run ui/dashboard.py`
| 页面 | 内容 |
|------|----------|
| **人群概览** | KPI 卡片、风险饼图、状态柱状图、压力与情绪散点图、高风险表 |
| **个人配置** | 14 天趋势图、健康雷达图、临床发现 + 信号、日记条目、社交背景 |
| **AI 助手** | 基于 Ollama 的聊天、快速提问、自适应日常问候 |
| **语义搜索** | 对所有 50 个配置进行 FAISS 搜索并显示相似度得分 |
## 🔧 技术栈
| 组件 | 技术 |
|-----------|-----------|
| LLM | Ollama (llama3 / mistral / gemma2 — 自动检测) |
| Vector DB | FAISS IndexFlatIP |
| Embeddings | 自定义 TF-IDF (512维, L2归一化) |
| Vector Memory | 基于 FAISS 的会话记忆 (TF-IDF + 余弦相似度) |
| 临床引擎 | 基于规则的多信号检测器 |
| API | Flask |
| Dashboard | Streamlit + Plotly |
| 存储 | JSON + CSV + SQLite |
## ⭐ 附加功能 — Vector Memory
**文件:** `models/vector_memory.py`
VitaTwin 实现了**基于 FAISS 的 vector memory** —— 每一轮对话(问题 + 回答)都通过 TF-IDF 进行 embedding 并存储在 FAISS 索引中。对于每个新问题,系统会在记忆中搜索语义相似的历史对话,并将最相关的部分作为附加上下文注入到 LLM prompt 中。
这赋予了助手真正的会话记忆能力 —— 如果你询问了关于压力的问题,然后提出一个后续问题,助手会记得之前的对话并自然地对其进行引用。
```
New question
│
▼
VectorMemory.retrieve() — FAISS search over past turns
│
▼
Top-K relevant past turns → injected into LLM context block
│
▼
Ollama LLM — answers with awareness of conversation history
│
▼
VectorMemory.store() — new turn added to memory index
```
**实时状态**显示在 dashboard 侧边栏和 AI 助手标题处:
```
🧠 Vector Memory · 4 turns · vocab 128
```
## 📋 环境要求
```
faiss-cpu>=1.7.4
numpy>=1.24.0
pandas>=2.0.0
flask>=3.0.0
streamlit>=1.32.0
plotly>=5.18.0
ollama>=0.2.0
```
标签:Kubernetes, LLM, RAG, Streamlit, Unmanaged PE, 人工智能, 代码示例, 医疗健康, 心理健康, 数据分析, 用户模式Hook绕过, 访问控制, 逆向工具