初始化提交

This commit is contained in:
chenxin committed 2026-08-21 16:00:13 +08:00
commit 887c1f449e
963 files changed
+166869

No files matched your search

+164
View File
@@ -0,0 +1,164 @@
# 元炁 · 本地推理引擎
元炁(Yuánqì)是魂镜的**本地模型推理引擎**,纯 Python 实现,直接加载 GGUF / FlagEmbedding / transformers 模型进行本地推理,不依赖外部推理服务。
> 「元」即原始、根本;「炁」为道家万化之源的能量。——元炁为魂镜承载本地模型推理,提供内生智力。
---
## 架构概览
```mermaid
flowchart LR
lingtai[灵台 · Backend]
yuanqi[元炁 · Local Inference Engine]
models[(models/ 目录)]
lingtai -->|POST /v1/chat/completions| yuanqi
lingtai -->|POST /v1/embeddings| yuanqi
lingtai -->|POST /v1/rerank| yuanqi
lingtai -->|GET /healthz| yuanqi
yuanqi -->|llama-cpp-python 直接加载| models
yuanqi -->|FlagEmbedding / transformers 直接加载| models
```
## 提供的 API
| 端点 | 能力 | 引擎 |
| --- | --- | --- |
| `POST /v1/chat/completions` | LLM 对话 & 多模态视觉理解 | `llama-cpp-python` |
| `POST /v1/embeddings` | 文本向量嵌入 | `FlagEmbedding`(BGE-M3) |
| `POST /v1/rerank` | 重排序(Reranker) | `transformers` CrossEncoder |
| `GET /healthz` | 健康检查 | — |
## 模型文件结构
所有模型统一放在项目根目录 `models/` 下,按子目录分类:
```text
models/
├── gguf/ # GGUF 格式 LLM + 多模态模型
│ ├── qwen2.5-7b-instruct-q4_k_m.gguf
│ ├── llama3.2-vision-11b-q4_k_m.gguf
│ └── llama3.2-vision-11b-mmproj-f16.gguf
├── FlagModel/ # FlagEmbedding 模型
│ └── bge-m3/ # BGE-M3 嵌入模型
└── transformers/ # transformers 交叉编码器
└── bge-reranker-v2-m3/ # 重排序模型
```
通过环境变量 `YUANQI_MODELS_DIR` 可覆盖模型根目录。
## 快速开始
```bash
# 1. 下载模型(任选需要的)
# LLM:
wget -P models/gguf/ https://hf.co/Qwen/Qwen2.5-7B-Instruct-GGUF/resolve/main/qwen2.5-7b-instruct-q4_k_m.gguf
# Embedding:
pip install huggingface-hub
huggingface-cli download BAAI/bge-m3 --local-dir models/FlagModel/bge-m3
# Reranker:
huggingface-cli download BAAI/bge-reranker-v2-m3 --local-dir models/transformers/bge-reranker-v2-m3
# 2. 启动元炁
cd yuanqi
uv venv -p 3.12
source .venv/bin/activate
# 安装全部依赖包括开发依赖
uv sync --all-extras
# 安装启动对应的所有依赖,不包括开发依赖
uv sync --extra all
uv run uvicorn src.main:app --reload --port 11434
# 3. 验证
curl http://localhost:11434/healthz
```
## 模型tokenizer验证
```bash
python -c 'from transformers import AutoTokenizer; t=AutoTokenizer.from_pretrained("/Users/chenxin/code/python/hunjing/models/FlagModel/bge-m3"); ids=t("你好世界").input_ids; print("len:",len(ids)); print("ids:",ids); print("tokens:",t.convert_ids_to_tokens(ids))'
len: 5
ids: [0, 6, 124084, 3221, 2]
tokens: ['<s>', '▁', '你好', '世界', '</s>']
python -c 'from transformers import AutoTokenizer; t=AutoTokenizer.from_pretrained("/Users/chenxin/code/python/hunjing/models/transformers/bge-reranker-v2-m3"); q="搜索查询"; docs=["文档A","文档B","文档C"]; [(print("\nDOC:",d),print("len:",len(t(q,d).input_ids)),print("ids:",t(q,d).input_ids),print("tokens:",t.convert_ids_to_tokens(t(q,d).input_ids))) for d in docs]'
DOC: 文档A
len: 11
ids: [0, 6, 63449, 115106, 2, 2, 6, 2564, 59529, 284, 2]
tokens: ['<s>', '▁', '搜索', '查询', '</s>', '</s>', '▁', '文', '档', 'A', '</s>']
DOC: 文档B
len: 11
ids: [0, 6, 63449, 115106, 2, 2, 6, 2564, 59529, 571, 2]
tokens: ['<s>', '▁', '搜索', '查询', '</s>', '</s>', '▁', '文', '档', 'B', '</s>']
DOC: 文档C
len: 11
ids: [0, 6, 63449, 115106, 2, 2, 6, 2564, 59529, 441, 2]
tokens: ['<s>', '▁', '搜索', '查询', '</s>', '</s>', '▁', '文', '档', 'C', '</s>']
```
## 配置
通过环境变量配置(详见 `.env.example`):
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
| `YUANQI_HOST` | `0.0.0.0` | 监听地址 |
| `YUANQI_PORT` | `11434` | 监听端口 |
| `YUANQI_MODELS_DIR` | `../models` | 模型文件根目录 |
| `YUANQI_LLM_MODEL_PATH` | 自动扫描 `models/gguf/` | GGUF 模型路径 |
| `YUANQI_EMBEDDING_MODEL` | `BAAI/bge-m3` | Embedding 模型(HF名或本地路径) |
| `YUANQI_RERANKER_MODEL` | `BAAI/bge-reranker-v2-m3` | Reranker 模型(HF名或本地路径) |
| `YUANQI_VISION_MODEL_PATH` | 自动扫描 `models/gguf/` | 多模态 GGUF 路径 |
| `YUANQI_DEVICE` | `cpu` | 推理设备:cpu / cuda / mps |
| `YUANQI_LLM_MAX_TOKENS` | `2048` | 最大生成 Token |
| `YUANQI_LLM_TEMPERATURE` | `0.7` | 生成温度 |
| `YUANQI_LLM_CTX_SIZE` | `4096` | 上下文窗口大小 |
| `YUANQI_LOG_LEVEL` | `info` | 日志级别 |
## 项目结构
```text
yuanqi/
├── pyproject.toml # 依赖:llama-cpp-python / FlagEmbedding / transformers
├── Dockerfile # 容器镜像
├── README.md # 本文件
├── src/
│ ├── main.py # FastAPI 入口(引擎初始化 + 路由注册)
│ ├── config.py # 配置加载(环境变量 → models/ 路径解析)
│ ├── endpoints/
│ │ ├── chat.py # LLM 对话端点(OpenAI 兼容)
│ │ ├── embeddings.py# 向量嵌入端点(OpenAI 兼容)
│ │ ├── rerank.py # 重排序端点(自定义 API)
│ │ └── health.py # 健康检查端点
│ ├── engine/
│ │ ├── base.py # 引擎抽象基类
│ │ ├── llm.py # llama-cpp-python LLM 引擎
│ │ ├── embedding.py # FlagEmbedding (BGE-M3) 引擎
│ │ └── reranker.py # transformers CrossEncoder 引擎
│ └── models/
│ └── schemas.py # Pydantic 请求/响应模型
└── tests/
└── ...
```
## Docker 部署
详见《docker/README.md》及 `docker-compose.app.yml` 中 `hunjing-yuanqi` 服务定义。
**注意:** 容器部署时需将宿主机 `models/` 目录挂载到容器内:
```yaml
hunjing-yuanqi:
volumes:
- ../models:/app/models # 挂载模型目录
- ../logs:/app/logs # 日志
```
## 设计文档
详细的架构设计与决策见 `docs/architecture/system-architecture.md`。