Spaces:
Sleeping
Sleeping
| # API 完整文档(中文) | |
| **最后更新**: 2026-02-12 | |
| **受众**: 开发者、面试官、技术评审 | |
| **版本**: v2.6.0 | |
| --- | |
| ## 📋 目录 | |
| 1. [API 概览](#api-概览) | |
| 2. [核心推荐 API](#核心推荐-api) | |
| 3. [聊天 API(RAG)](#聊天-apirag) | |
| 4. [用户收藏 API](#用户收藏-api) | |
| 5. [个性化推荐 API](#个性化推荐-api) | |
| 6. [书籍管理 API](#书籍管理-api) | |
| 7. [监控 API](#监控-api) | |
| 8. [完整数据流](#完整数据流) | |
| --- | |
| ## API 概览 | |
| ### 系统架构 | |
| 你的项目有 **两条核心路径**: | |
| ``` | |
| 用户请求 | |
| │ | |
| ├─ 有查询词? → RAG 路径(语义搜索) | |
| │ 示例:"帮我找悲伤的科幻小说" | |
| │ API: /recommend, /chat/completions | |
| │ | |
| └─ 无查询词? → RecSys 路径(个性化推荐) | |
| 示例:"给我推荐10本书" | |
| API: /api/recommend/personalized | |
| ``` | |
| ### API 端点总览 | |
| | 端点 | 方法 | 功能 | 路径 | | |
| |------|------|------|------| | |
| | **语义推荐** | POST | 根据自然语言查询推荐书籍(RAG) | RAG | | |
| | **个性化推荐** | GET | 基于用户历史的协同过滤推荐 | RecSys | | |
| | **相似书籍** | GET | 基于某本书找相似书籍 | 内容过滤 | | |
| | **流式聊天** | POST | 与书籍对话(RAG + LLM 生成) | RAG | | |
| | **添加收藏** | POST | 将书籍加入收藏夹 | 用户管理 | | |
| | **书籍推荐亮点** | GET | 为用户生成个性化书籍文案 | 营销 | | |
| --- | |
| ## 核心推荐 API | |
| ### 1. `/recommend` - 语义搜索推荐(RAG 路径) | |
| **用途**: 用户输入自然语言查询,系统返回最相关的书籍。 | |
| #### 请求 | |
| ```http | |
| POST /recommend | |
| Content-Type: application/json | |
| { | |
| "query": "一本关于人工智能的哲学小说", | |
| "category": "Fiction", | |
| "user_id": "local", | |
| "fast": false, | |
| "use_agentic": false, | |
| "async_rerank": false | |
| } | |
| ``` | |
| #### 参数详解 | |
| | 参数 | 类型 | 必填 | 说明 | 默认值 | | |
| |------|------|------|------|--------| | |
| | `query` | string | ✅ | 自然语言查询(如"悬疑小说") | - | | |
| | `category` | string | ❌ | 类别过滤(Fiction/Romance/All) | "All" | | |
| | `user_id` | string | ❌ | 用户标识符(用于个性化) | "local" | | |
| | `fast` | boolean | ❌ | 跳过重排序(延迟 ~150ms) | false | | |
| | `use_agentic` | boolean | ❌ | 使用 LangGraph 工作流(路由→检索→评估→网络回退) | false | | |
| | `async_rerank` | boolean | ❌ | 异步重排序(先返回 RRF 结果,后台重排序) | false | | |
| #### 响应 | |
| ```json | |
| { | |
| "recommendations": [ | |
| { | |
| "isbn": "0140283331", | |
| "title": "战争与和平", | |
| "authors": "列夫·托尔斯泰", | |
| "description": "史诗般的历史小说...", | |
| "thumbnail": "https://example.com/cover.jpg", | |
| "caption": "俄国贵族家庭的命运", | |
| "tags": ["历史", "战争", "爱情"], | |
| "average_rating": 4.5, | |
| "explanations": [ | |
| { | |
| "feature": "title_similarity", | |
| "contribution": 0.82, | |
| "direction": "positive" | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| ``` | |
| #### 内部逻辑流程 | |
| ``` | |
| 用户查询 "哲学小说" | |
| │ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ QueryRouter │ ← 意图分类 | |
| │ • ISBN? → EXACT │ | |
| │ • 关键词? → FAST │ | |
| │ • 复杂查询? → DEEP │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ VectorDB.hybrid_search │ ← 混合检索 | |
| │ • BM25 稀疏检索 (50条) │ | |
| │ • Dense 稠密检索 (50条)│ | |
| │ • RRF 融合 → Top 50 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ Reranker(可选) │ ← 精排 | |
| │ • Cross-Encoder 打分 │ | |
| │ • Top 10 精准结果 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ MetadataStore │ ← 元数据补充 | |
| │ • 添加完整书籍信息 │ | |
| │ • 封面、作者、评分等 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| 返回结果 | |
| ``` | |
| **关键技术点**: | |
| 1. **Hybrid Search(混合检索)**: BM25(关键词匹配)+ Dense Embeddings(语义理解) | |
| 2. **RRF Fusion(倒数排名融合)**: 合并两种检索结果,公式:`score = 1/(k + rank)` | |
| 3. **Cross-Encoder Reranking(交叉编码器重排序)**: 精准打分,但延迟 ~400ms | |
| --- | |
| ### 2. `/api/recommend/similar/{isbn}` - 相似书籍推荐 | |
| **用途**: 用户点击某本书后,推荐相似的书籍(内容过滤)。 | |
| #### 请求 | |
| ```http | |
| GET /api/recommend/similar/0140283331?k=10&category=Fiction | |
| ``` | |
| #### 参数 | |
| | 参数 | 类型 | 说明 | | |
| |------|------|------| | |
| | `isbn` | string (路径参数) | 种子书籍的 ISBN | | |
| | `k` | int (查询参数) | 返回数量 (1-50) | | |
| | `category` | string | 类别过滤 | | |
| #### 响应 | |
| 与 `/recommend` 相同格式。 | |
| #### 内部逻辑 | |
| ``` | |
| ISBN "0140283331" | |
| │ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ MetadataStore │ ← 查找书籍 | |
| │ 获取标题、描述 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ VectorDB.search │ ← 向量相似度 | |
| │ 用描述做 embedding │ | |
| │ 找最近邻 (cosine) │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| 返回相似书籍 | |
| ``` | |
| **技术点**: | |
| - 使用 **Sentence-BERT** (`all-MiniLM-L6-v2`) 将书籍描述编码为 384 维向量 | |
| - **ChromaDB** 使用 HNSW 索引做快速近似最近邻搜索 | |
| - 延迟:~20-100ms | |
| --- | |
| ## 聊天 API(RAG) | |
| ### 3. `/chat/completions` - 流式聊天 | |
| **用途**: 用户与某本书对话,LLM 基于书籍内容回答问题。 | |
| #### 请求 | |
| ```http | |
| POST /chat/completions | |
| Content-Type: application/json | |
| X-LLM-Key: sk-xxxxxxx (OpenAI 时需要) | |
| { | |
| "isbn": "0140283331", | |
| "query": "这本书的主题是什么?", | |
| "user_id": "local", | |
| "provider": "ollama" | |
| } | |
| ``` | |
| #### 参数 | |
| | 参数 | 类型 | 说明 | | |
| |------|------|------| | |
| | `isbn` | string | 要聊天的书籍 ISBN | | |
| | `query` | string | 用户问题 | | |
| | `user_id` | string | 用户 ID(用于聊天历史) | | |
| | `provider` | string | LLM 提供商:"ollama"(本地)或 "openai" | | |
| #### 响应 | |
| **流式响应**(Server-Sent Events): | |
| ``` | |
| data: 这 | |
| data: 本 | |
| data: 书 | |
| data: 的 | |
| data: 主题 | |
| data: 是 | |
| data: 战争 | |
| data: 与 | |
| data: 和平 | |
| ... | |
| ``` | |
| #### 内部逻辑 | |
| ``` | |
| 用户问题:"主题是什么?" | |
| │ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ DataRepository │ ← 获取书籍元数据 | |
| │ • 标题、作者、描述 │ | |
| │ • 评论摘要 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ build_persona() │ ← 构建用户画像 | |
| │ • 用户收藏的书籍 │ | |
| │ • 生成个性化 prompt │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ LLMFactory │ ← 调用 LLM | |
| │ • Ollama: llama3 │ | |
| │ • OpenAI: gpt-4 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ StreamingResponse │ ← 流式返回 | |
| │ • 实时推送 token │ | |
| │ • 前端逐字显示 │ | |
| └─────────────────────────┘ | |
| ``` | |
| **关键技术点**: | |
| 1. **RAG(检索增强生成)**: 先检索书籍信息,再生成回答 | |
| 2. **流式响应**: 使用 Server-Sent Events(SSE),用户体验更好 | |
| 3. **上下文压缩**: 保留最近 2 轮对话,旧对话用 LLM 总结压缩 | |
| --- | |
| ## 个性化推荐 API | |
| ### 4. `/api/recommend/personalized` - 协同过滤推荐(RecSys 路径) | |
| **用途**: 基于用户历史行为,推荐个性化书籍(无需查询词)。 | |
| #### 请求 | |
| ```http | |
| GET /api/recommend/personalized?user_id=A3SPTOKDG7WBLN&k=10&intent=general&enable_diversity=true | |
| ``` | |
| #### 参数 | |
| | 参数 | 类型 | 说明 | 默认值 | | |
| |------|------|------|--------| | |
| | `user_id` | string | 用户 ID | - | | |
| | `k` | int | 返回数量 | 10 | | |
| | `intent` | string | 意图:"general"/"favorites"/"new" | "general" | | |
| | `enable_diversity` | boolean | 启用多样性重排序 | true | | |
| | `real_time_isbns` | string | 实时会话书籍(逗号分隔) | - | | |
| #### 响应 | |
| 与 `/recommend` 相同格式。 | |
| #### 内部逻辑(这是你项目的核心!) | |
| ``` | |
| 用户 ID "A3SPTOKDG7WBLN" | |
| │ | |
| ▼ | |
| ┌──────────────────────────────────────┐ | |
| │ RecallFusion(7 通道召回) │ | |
| │ ┌────────────────────────────────┐ │ | |
| │ │ 1. ItemCF(方向加权协同过滤) │ │ → Top 100 | |
| │ │ • 用户读 A 后读 B │ │ | |
| │ │ • forward 权重 1.0 │ │ | |
| │ │ • backward 权重 0.7 │ │ | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 2. SASRec(序列 Transformer) │ │ → Top 100 | |
| │ │ • 自注意力机制 │ │ | |
| │ │ • 捕捉阅读顺序 │ │ | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 3. Swing(用户对重叠加权) │ │ → Top 100 | |
| │ │ • 1/(α + |I_u ∩ I_v|) │ │ | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 4. Item2Vec(Word2Vec 嵌入) │ │ → Top 100 | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 5. YoutubeDNN(双塔神经网络) │ │ → Top 100 | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 6. UserCF(用户相似度) │ │ → Top 100 | |
| │ ├────────────────────────────────┤ │ | |
| │ │ 7. Popularity(流行度回退) │ │ → Top 100 | |
| │ └────────────────────────────────┘ │ | |
| │ RRF 融合 → Top 100 候选 │ | |
| └────────┬─────────────────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ FeatureEngineer │ ← 特征工程 | |
| │ • 用户统计 (u_cnt...) │ | |
| │ • 物品统计 (i_cnt...) │ | |
| │ • SASRec 分数 │ | |
| │ • ItemCF 分数 │ | |
| │ • 17 个排序特征 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ LGBMRanker │ ← L2R 排序 | |
| │ • LambdaRank 目标 │ | |
| │ • 直接优化 NDCG │ | |
| │ • 输出排序分数 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ DiversityReranker │ ← 多样性重排序 | |
| │ • MMR (λ=0.75) │ | |
| │ • 流行度惩罚 (γ=0.3) │ | |
| │ • 每类别最多 3 本 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| 返回 Top K | |
| ``` | |
| **关键技术点**: | |
| 1. **7 通道召回策略**: | |
| - **ItemCF(物品协同过滤)**: 方向加权,捕捉"先读 A 后读 B"模式 | |
| - **SASRec(序列推荐)**: Transformer 自注意力,理解阅读顺序 | |
| - **Swing**: 用户对重叠惩罚,减少流行度偏差 | |
| - **Item2Vec**: Word2Vec 应用于物品序列 | |
| - **YoutubeDNN**: 深度双塔模型(用户塔 + 物品塔) | |
| - **UserCF(用户协同过滤)**: Jaccard 相似度 | |
| - **Popularity**: 冷启动回退 | |
| 2. **RRF(倒数排名融合)**: | |
| ```python | |
| # 每个通道贡献的分数 | |
| score += weight * (1.0 / (k + rank + 1)) | |
| # k=60, rank 是 0-based 排名 | |
| ``` | |
| 3. **LGBMRanker(LambdaRank)**: | |
| - 直接优化 NDCG(归一化折损累计增益) | |
| - 不是二分类,是 list-wise 排序 | |
| - 训练时使用 hard negative sampling | |
| 4. **多样性重排序(MMR)**: | |
| ```python | |
| # Maximal Marginal Relevance | |
| score_new = λ * 相关性分数 - (1-λ) * 与已选书籍的相似度 | |
| # λ=0.75: 75% 相关性,25% 多样性 | |
| ``` | |
| **性能指标**: | |
| - **HR@10 = 0.4545** (命中率:Top 10 中包含用户实际点击书籍的概率) | |
| - **MRR@5 = 0.2893** (平均倒数排名) | |
| - **延迟 P95 < 500ms** | |
| --- | |
| ## 用户收藏 API | |
| ### 5. `/favorites/add` - 添加收藏 | |
| ```http | |
| POST /favorites/add | |
| Content-Type: application/json | |
| { | |
| "user_id": "local", | |
| "isbn": "0140283331" | |
| } | |
| ``` | |
| #### 响应 | |
| ```json | |
| { | |
| "status": "ok", | |
| "favorites_count": 15 | |
| } | |
| ``` | |
| --- | |
| ### 6. `/favorites/list/{user_id}` - 获取收藏列表 | |
| ```http | |
| GET /favorites/list/local | |
| ``` | |
| #### 响应 | |
| ```json | |
| { | |
| "favorites": [ | |
| { | |
| "isbn": "0140283331", | |
| "title": "战争与和平", | |
| "author": "列夫·托尔斯泰", | |
| "img": "cover.jpg", | |
| "category": "Fiction", | |
| "rating": 4.5, | |
| "status": "finished", | |
| "added_at": "2026-01-15T10:30:00", | |
| "comment": "史诗般的作品" | |
| } | |
| ] | |
| } | |
| ``` | |
| --- | |
| ### 7. `/favorites/update` - 更新收藏 | |
| ```http | |
| PUT /favorites/update | |
| Content-Type: application/json | |
| { | |
| "user_id": "local", | |
| "isbn": "0140283331", | |
| "rating": 5.0, | |
| "status": "finished", | |
| "comment": "太精彩了!" | |
| } | |
| ``` | |
| --- | |
| ### 8. `/favorites/persona` - 生成用户画像 | |
| **用途**: 基于用户收藏的书籍,生成个性化描述。 | |
| ```http | |
| GET /favorites/persona?user_id=local | |
| ``` | |
| #### 响应 | |
| ```json | |
| { | |
| "persona": { | |
| "description": "你是一位热爱经典文学的读者,偏好历史小说和哲学作品...", | |
| "top_genres": ["历史", "哲学", "文学"], | |
| "reading_stats": { | |
| "total_books": 25, | |
| "avg_rating": 4.3, | |
| "favorite_authors": ["托尔斯泰", "陀思妥耶夫斯基"] | |
| } | |
| } | |
| } | |
| ``` | |
| --- | |
| ## 书籍管理 API | |
| ### 9. `/books/add` - 添加新书 | |
| **用途**: 动态添加书籍到数据库和向量索引。 | |
| ```http | |
| POST /books/add | |
| Content-Type: application/json | |
| { | |
| "isbn": "1234567890", | |
| "title": "新书标题", | |
| "author": "作者名", | |
| "description": "这是一本关于...", | |
| "category": "Fiction", | |
| "thumbnail": "https://example.com/cover.jpg" | |
| } | |
| ``` | |
| #### 内部逻辑 | |
| ``` | |
| 新书信息 | |
| │ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ MetadataStore.add() │ ← SQLite 插入 | |
| │ • 保存元数据 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| ┌─────────────────────────┐ | |
| │ VectorDB.add() │ ← ChromaDB 索引 | |
| │ • 描述 → embedding │ | |
| │ • 加入 HNSW 索引 │ | |
| └────────┬────────────────┘ | |
| ▼ | |
| 返回成功 | |
| ``` | |
| --- | |
| ### 10. `/api/book/{isbn}/highlights` - 书籍推荐亮点 | |
| **用途**: 为用户生成个性化书籍推荐文案(营销功能)。 | |
| ```http | |
| GET /api/book/0140283331/highlights?user_id=local | |
| ``` | |
| #### 响应 | |
| ```json | |
| { | |
| "isbn": "0140283331", | |
| "highlights": [ | |
| "这本书与你喜欢的《安娜·卡列尼娜》风格相似", | |
| "史诗般的战争场面描写", | |
| "深刻的人性探讨" | |
| ], | |
| "personalized_pitch": "基于你对历史小说的喜爱,这本书会让你爱不释手。" | |
| } | |
| ``` | |
| --- | |
| ## 监控 API | |
| ### 11. `/health` - 健康检查 | |
| ```http | |
| GET /health | |
| ``` | |
| #### 响应 | |
| ```json | |
| { | |
| "status": "healthy" | |
| } | |
| ``` | |
| --- | |
| ### 12. `/metrics` - Prometheus 指标 | |
| **用途**: 暴露系统性能指标,供 Prometheus 抓取。 | |
| ```http | |
| GET /metrics | |
| ``` | |
| #### 响应(Prometheus 格式) | |
| ``` | |
| # HELP http_requests_total Total count of HTTP requests | |
| # TYPE http_requests_total counter | |
| http_requests_total{method="POST",endpoint="/recommend",status_code="200"} 1234 | |
| # HELP http_request_duration_seconds HTTP request latency in seconds | |
| # TYPE http_request_duration_seconds histogram | |
| http_request_duration_seconds_bucket{method="POST",endpoint="/recommend",le="0.1"} 450 | |
| http_request_duration_seconds_bucket{method="POST",endpoint="/recommend",le="0.5"} 1200 | |
| http_request_duration_seconds_sum{method="POST",endpoint="/recommend"} 523.4 | |
| http_request_duration_seconds_count{method="POST",endpoint="/recommend"} 1234 | |
| ``` | |
| **监控指标**: | |
| - `http_requests_total`: 总请求数(按方法、端点、状态码分组) | |
| - `http_request_duration_seconds`: 请求延迟直方图 | |
| --- | |
| ## 完整数据流 | |
| ### 场景 1: 用户搜索 "悲伤的科幻小说" | |
| ``` | |
| 1. 前端发送请求 | |
| POST /recommend | |
| { "query": "悲伤的科幻小说", "category": "All" } | |
| 2. FastAPI 接收 → RecommendationOrchestrator | |
| 3. QueryRouter 分类 | |
| → "悲伤的科幻小说" 是复杂查询 | |
| → 策略: DEEP (Hybrid + Rerank) | |
| 4. VectorDB.hybrid_search() | |
| • BM25: "悲伤" OR "科幻" OR "小说" → Top 50 | |
| • Dense: embedding("悲伤的科幻小说") → Top 50 | |
| • RRF 融合 → Top 50 | |
| 5. Reranker.rerank() | |
| • Cross-Encoder 打分每个候选 | |
| • 排序 → Top 10 | |
| 6. MetadataStore.get_books_batch() | |
| • 补充完整元数据(封面、作者、评分) | |
| 7. 返回结果 | |
| { | |
| "recommendations": [ | |
| {"isbn": "xxx", "title": "三体", ...}, | |
| {"isbn": "yyy", "title": "银河系漫游指南", ...} | |
| ] | |
| } | |
| ``` | |
| **延迟分析**: | |
| - Router: <5ms | |
| - Hybrid Search: ~230ms (P50) | |
| - Reranking: ~400ms | |
| - Metadata: ~10ms | |
| - **总计**: ~650ms (P50), ~1250ms (P95) | |
| --- | |
| ### 场景 2: 用户请求个性化推荐 | |
| ``` | |
| 1. 前端发送请求 | |
| GET /api/recommend/personalized?user_id=A3SPTOKDG7WBLN&k=10 | |
| 2. FastAPI → RecommendationService | |
| 3. RecallFusion.get_recall_items() | |
| • ItemCF: 用户历史 → 相似物品 → Top 100 | |
| • SASRec: 用户序列 → Transformer → Top 100 | |
| • Swing: 用户对重叠 → Top 100 | |
| • ... (7 通道) | |
| • RRF 融合 → Top 100 候选 | |
| 4. FeatureEngineer.extract_features() | |
| • 对每个候选,提取 17 个特征 | |
| • user_stats: u_cnt, u_mean, u_std | |
| • item_stats: i_cnt, i_mean, i_std | |
| • sasrec_score: SASRec 嵌入相似度 | |
| • icf_max: ItemCF 最大分数 | |
| • ... | |
| 5. LGBMRanker.predict() | |
| • 输入: 100 个候选 × 17 特征 | |
| • 输出: 100 个排序分数 | |
| • 排序 → Top 10 | |
| 6. DiversityReranker.rerank() | |
| • MMR 多样性重排序 | |
| • 每类别最多 3 本 | |
| • 流行度惩罚 | |
| 7. MetadataStore.get_books_batch() | |
| • 补充元数据 | |
| 8. 返回结果 | |
| ``` | |
| **延迟分析**: | |
| - Recall (7 通道): ~150ms | |
| - Feature Engineering: ~50ms | |
| - LGBMRanker: ~30ms | |
| - Diversity Rerank: ~10ms | |
| - Metadata: ~10ms | |
| - **总计**: ~250ms (P50), ~420ms (P95) | |
| --- | |
| ### 场景 3: 用户与书籍对话 | |
| ``` | |
| 1. 前端发送请求 | |
| POST /chat/completions | |
| { | |
| "isbn": "0140283331", | |
| "query": "这本书的主题是什么?", | |
| "provider": "ollama" | |
| } | |
| 2. ChatService.chat_stream() | |
| 3. DataRepository.get_book_metadata() | |
| • 获取书籍信息(标题、描述、评论摘要) | |
| 4. build_persona() | |
| • 获取用户收藏的书籍 | |
| • 生成用户画像 | |
| 5. 构建 Prompt | |
| --- | |
| 系统: 你是一位文学评论家。 | |
| 书籍信息: | |
| - 标题: 战争与和平 | |
| - 作者: 列夫·托尔斯泰 | |
| - 描述: 史诗般的历史小说... | |
| 用户画像: | |
| - 喜欢: 历史小说、哲学作品 | |
| 用户问题: 这本书的主题是什么? | |
| --- | |
| 6. LLMFactory.create("ollama") | |
| • 调用 Ollama llama3 模型 | |
| 7. StreamingResponse | |
| • 实时推送生成的 token | |
| • 前端逐字显示 | |
| 8. 保存聊天历史 | |
| • 用户消息 + AI 回复 | |
| • 最多保留 10 条(5 轮对话) | |
| ``` | |
| **延迟分析**: | |
| - Metadata: ~10ms | |
| - Persona 构建: ~20ms | |
| - LLM 首 token: ~200-500ms | |
| - 后续 token: ~50ms/token | |
| - **总计**: 流式响应,用户体验好 | |
| --- | |
| ## 外部 API 集成 | |
| ### Google Books API(新鲜度回退) | |
| **用途**: 当本地数据库没有某本书时,从 Google Books 获取。 | |
| ```python | |
| # src/core/web_search.py | |
| def fetch_from_google_books(isbn): | |
| url = f"https://www.googleapis.com/books/v1/volumes?q=isbn:{isbn}" | |
| response = requests.get(url) | |
| data = response.json() | |
| # 解析 JSON,提取书籍信息 | |
| book = { | |
| "isbn": isbn, | |
| "title": data["items"][0]["volumeInfo"]["title"], | |
| "authors": data["items"][0]["volumeInfo"]["authors"], | |
| ... | |
| } | |
| # 保存到 online_books.db(暂存库) | |
| online_books_store.add_book(book) | |
| return book | |
| ``` | |
| **何时触发**: | |
| - `/recommend` 请求中包含 "latest" "new" "2024" 等关键词 | |
| - `freshness_fallback=True` | |
| - 本地结果不足 | |
| --- | |
| ## 内部 API 架构 | |
| ### 依赖关系 | |
| ``` | |
| FastAPI main.py | |
| │ | |
| ├─ /recommend → RecommendationOrchestrator | |
| │ ├─ QueryRouter | |
| │ ├─ VectorDB | |
| │ ├─ Reranker | |
| │ └─ MetadataStore | |
| │ | |
| ├─ /api/recommend/personalized → RecommendationService | |
| │ ├─ RecallFusion | |
| │ │ ├─ ItemCF | |
| │ │ ├─ SASRec | |
| │ │ ├─ Swing | |
| │ │ └─ ... | |
| │ ├─ FeatureEngineer | |
| │ ├─ LGBMRanker | |
| │ └─ DiversityReranker | |
| │ | |
| └─ /chat/completions → ChatService | |
| ├─ DataRepository | |
| ├─ build_persona() | |
| └─ LLMFactory | |
| ``` | |
| --- | |
| ## API 性能基准(v2.6.0) | |
| | 端点 | P50 延迟 | P95 延迟 | 吞吐量 | | |
| |------|---------|---------|--------| | |
| | `/recommend` (FAST) | 230ms | 310ms | 3-4 QPS | | |
| | `/recommend` (DEEP) | 710ms | 1250ms | 1-2 QPS | | |
| | `/api/recommend/personalized` | 245ms | 420ms | 3-5 QPS | | |
| | `/api/recommend/similar/{isbn}` | 50ms | 100ms | 10-15 QPS | | |
| | `/chat/completions` (首 token) | 300ms | 600ms | - | | |
| | `/health` | 5ms | 15ms | 100+ QPS | | |
| --- | |
| ## 总结 | |
| ### 核心技术栈 | |
| | 层级 | 技术 | 用途 | | |
| |------|------|------| | |
| | **API 框架** | FastAPI | 异步 API,自动生成 OpenAPI 文档 | | |
| | **向量数据库** | ChromaDB | 存储书籍描述的 384 维 embedding | | |
| | **稀疏检索** | BM25Okapi | 关键词精确匹配 | | |
| | **重排序** | Cross-Encoder (ms-marco) | 精准排序 | | |
| | **元数据存储** | SQLite (FTS5) | 零 RAM 模式,全文搜索 | | |
| | **LLM** | Ollama (llama3) / OpenAI | 聊天生成 | | |
| | **排序模型** | LightGBM (LambdaRank) | 优化 NDCG | | |
| | **序列模型** | SASRec (PyTorch) | Transformer 序列推荐 | | |
| | **监控** | Prometheus | 性能指标 | | |
| ### 你的项目亮点 | |
| 1. **双路径架构**: RAG(查询)+ RecSys(个性化) | |
| 2. **7 通道召回**: 协同过滤 + 深度学习 + 流行度 | |
| 3. **方向加权 ItemCF**: 创新点,捕捉阅读顺序 | |
| 4. **LambdaRank 优化**: 直接优化 NDCG,不是二分类 | |
| 5. **流式 LLM 响应**: SSE 实时推送,用户体验佳 | |
| 6. **生产级监控**: Prometheus 指标,可观测性强 | |
| --- | |
| **最后更新**: 2026-02-12 | |
| **维护者**: 项目团队 | |