【博客搭建】ChatHexo
graph TB
subgraph "用户端"
Browser["🌐 用户浏览器<br/>访问 tianlejin.top"]
end
subgraph "Cloudflare 网络"
CDN["☁️ Cloudflare CDN<br/>静态资源缓存 (12小时)<br/>DDoS 防护"]
Tunnel["🔒 Cloudflare Tunnel<br/>内网穿透服务<br/>PID: 205"]
end
subgraph "本地服务器 (WSL2)"
subgraph "Web 层"
Nginx["🌍 Nginx<br/>localhost:50001<br/>静态文件服务 + 反向代理<br/>通过 Tunnel 映射到 tianlejin.top"]
Hexo["📝 Hexo 开发服务器<br/>localhost:4000<br/>仅本地预览,不对外"]
end
subgraph "应用层"
FastAPI["⚡ FastAPI 后端<br/>127.0.0.1:4317<br/>聊天 API 服务"]
Agent["🤖 LangGraph Agent<br/>多轮对话管理<br/>工具调用编排"]
RAG["📚 RAG 模块<br/>FAISS 向量检索<br/>1556 文本块"]
end
subgraph "数据层"
IndexJSON["📄 index.json<br/>博客文章索引<br/>Hexo 构建生成"]
FAISSCache["💾 FAISS 缓存<br/>.cache/faiss_index<br/>25MB 向量数据"]
Memory["🧠 MemorySaver<br/>会话状态管理<br/>thread_id 机制"]
end
end
subgraph "远程 AI 服务"
EmbeddingAPI["🔢 Embedding API<br/>192.168.205.183:51001<br/>Qwen3-Embedding-8B<br/>文本向量化"]
ChatAPI["💬 Chat API<br/>172.21.8.164:12480<br/>Qwen3.5-35B-A3B<br/>对话生成"]
end
%% 用户请求流
Browser -->|"HTTPS 请求"| CDN
CDN -->|"缓存未命中"| Tunnel
Tunnel -->|"内网转发"| Nginx
%% 静态资源流
Nginx -->|"静态文件"| Hexo
Hexo -->|"构建时生成"| IndexJSON
%% API 请求流
Nginx -->|"/chathexo-api/*"| FastAPI
FastAPI -->|"调用 agent_answer()"| Agent
%% Agent 工具调用
Agent -->|"rag_tool"| RAG
Agent -->|"grep_tool/list_posts"| IndexJSON
Agent -->|"读取会话历史"| Memory
%% RAG 检索流程
RAG -->|"加载索引"| FAISSCache
RAG -->|"文本向量化"| EmbeddingAPI
RAG -->|"生成回答"| ChatAPI
%% 索引构建流程
IndexJSON -.->|"首次构建/缓存失效"| RAG
RAG -.->|"保存向量索引"| FAISSCache
%% Agent LLM 调用
Agent -->|"ReAct 推理"| ChatAPI
%% 响应返回
FastAPI -->|"JSON 响应"| Nginx
Nginx -->|"返回结果"| Tunnel
Tunnel -->|"加密传输"| CDN
CDN -->|"HTTPS 响应"| Browser
%% 样式定义
classDef userLayer fill:#e1f5ff,stroke:#01579b,stroke-width:2px
classDef cloudLayer fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef webLayer fill:#f3e5f5,stroke:#4a148c,stroke-width:2px
classDef appLayer fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px
classDef dataLayer fill:#fce4ec,stroke:#880e4f,stroke-width:2px
classDef aiLayer fill:#fff9c4,stroke:#f57f17,stroke-width:2px
class Browser userLayer
class CDN,Tunnel cloudLayer
class Nginx,Hexo webLayer
class FastAPI,Agent,RAG appLayer
class IndexJSON,FAISSCache,Memory dataLayer
class EmbeddingAPI,ChatAPI aiLayer
关键组件说明
1. 用户端
- 浏览器:访问
tianlejin.top,加载前端 JS/CSS,发起聊天请求
2. Cloudflare 网络
- CDN:缓存静态资源(12小时),提供 DDoS 防护和全球加速
- Tunnel:内网穿透服务,映射规则:
tianlejin.top→localhost:50001
3. Web 层
- Nginx (
localhost:50001):- 静态文件服务:
/home/tianlejin/myblog/txm_blog/public - API 反向代理:
/chathexo-api/*→127.0.0.1:4317 - 通过 Cloudflare Tunnel 暴露到公网域名
tianlejin.top
- 静态文件服务:
- Hexo (
localhost:4000):- 开发预览服务器(执行
hexo s启动) - 仅本地使用,不参与生产环境
- 构建命令
hexo g生成public/目录和index.json
- 开发预览服务器(执行
4. 应用层
- FastAPI (
127.0.0.1:4317):提供/chathexo-api/chat接口 - LangGraph Agent:多轮对话管理,工具调用编排(ReAct 模式)
- RAG 模块:向量检索 + 上下文生成
5. 数据层
- index.json:博客文章元数据(标题、内容、标签等)
- FAISS 缓存:1556 个文本块的向量索引(25MB)
- MemorySaver:基于
thread_id的会话状态管理
6. 远程 AI 服务
- Embedding API (
192.168.205.183:51001):Qwen3-Embedding-8B,文本向量化 - Chat API (
172.21.8.164:12480):Qwen3.5-35B-A3B,对话生成
数据流说明
用户聊天请求流程
- 用户在浏览器访问
tianlejin.top并输入问题 - 请求路径:浏览器 → Cloudflare CDN → Cloudflare Tunnel →
localhost:50001(Nginx) - Nginx 反向代理:
/chathexo-api/chat→127.0.0.1:4317(FastAPI) - FastAPI 调用 Agent,传入
query和thread_id - Agent 根据问题类型选择工具:
- 语义搜索 →
rag_tool→ FAISS 检索 → Embedding API - 关键词搜索 →
grep_tool→ 直接读取index.json - 列表查询 →
list_posts→ 直接读取index.json
- 语义搜索 →
- Agent 调用 Chat API 生成回答(ReAct 推理)
- 返回结果:FastAPI → Nginx (
localhost:50001) → Tunnel → CDN → 浏览器
索引构建流程
- 开发阶段:
hexo s启动开发服务器 (localhost:4000),本地预览博客 - 部署阶段:
hexo clean && hexo g生成静态文件到public/目录- 包括
public/chathexo/index.json(所有文章元数据) - Nginx 提供
public/目录的静态文件服务
- 包括
- 首次调用
rag_tool时:- 读取
../public/chathexo/index.json - 文本分块(1556 块)
- 调用 Embedding API 向量化
- 构建 FAISS 索引并缓存到
.cache/faiss_index(耗时 ~85 秒)
- 读取
- 后续调用直接加载缓存(除非手动删除或重新构建)
性能指标
- 索引构建时间:85.61 秒(1556 文本块)
- 索引大小:25MB (index.faiss) + 2.9MB (index.pkl)
- CDN 缓存时间:12 小时
- 后端运行时间:15+ 小时(稳定运行)
评论

