Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,34 @@ APP_HOST=0.0.0.0
APP_PORT=8080
APP_DEBUG=false

# Elasticsearch
# 功能手板 gRPC(与 HTTP 同进程;明文无鉴权,生产勿对公网裸暴露)
GRPC_HOST=0.0.0.0
GRPC_PORT=50051
GRPC_ENABLED=true

# 量产 gRPC
SOMNI_GRPC_PORT=50052
SOMNI_GRPC_ENABLED=true

# Elasticsearch(功能手板)
ES_NODE=http://localhost:9200
ES_AUDIO_INDEX=somni_audio_materials
ES_TAG_VECTORS_INDEX=somni_audio_tag_dictionary

# MongoDB(Somni 数据同步源)
# 量产 ES(与手板隔离;可填另一节点)
SOMNI_ES_NODE=http://localhost:9201
SOMNI_ES_AUDIO_INDEX=somni_audio_materials
SOMNI_ES_TAG_VECTORS_INDEX=somni_audio_tag_dictionary

# MongoDB(功能手板 Fullive)
MONGO_URI=mongodb://user:password@host:27017/Fullive
MONGO_DB=Fullive

# comm-service gRPC
COMM_GRPC_HOST=bionode-test.fulai.tech
COMM_GRPC_PORT=443
COMM_GRPC_USE_TLS=true
# MongoDB(量产 Somni)
SOMNI_MONGO_URI=mongodb://user:password@host:27017/Somni
SOMNI_MONGO_DB=Somni
# 答卷集合(对齐 BioNode quiz_answers 结构)
SOMNI_MONGO_ANSWERS_COLLECTION=somni_quiz_answers

# 检索参数
SIM_THRESHOLD=0.7
Expand Down Expand Up @@ -55,6 +70,8 @@ LOG_RETENTION=7 days

# 音频检索缓存(空 REDIS_URL 表示关闭;TTL 自写入起算,命中不续期)
REDIS_URL=redis://127.0.0.1:6379/0
# 量产 Redis(与手板隔离)
SOMNI_REDIS_URL=redis://127.0.0.1:6379/1
# 连接池大小:需 ≥ HTTP 并发峰值,过小会 Too many connections
REDIS_MAX_CONNECTIONS=512
SEARCH_CACHE_MAX_SIZE=2048
Expand Down
80 changes: 32 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,64 +1,48 @@
# UburPython

BioNode 体系中的 **Somni 音频检索服务**:以三维度检索为核心,从 MongoDB 同步 Somni 原料与标签词典至 Elasticsearch,对外提供 HTTP 检索 API
**Somni / 功能手板音频检索服务**:三维度检索为核心;HTTP 保留;同进程再对外暴露功能手板与量产两套 gRPC

- **核心**:三维度音频检索(`somni_audio_materials` ES 召回 + 标签词典向量 + 四步精排流水线)
- **数据源**:MongoDB `Fullive` 库(`somni_audio_materials`、`somni_audio_tag_dictionary`)
- **索引**:Elasticsearch `somni_audio_materials`、`somni_audio_tag_dictionary`(字段含义见 mapping `meta.description`)
- **写路径**:`POST/PUT /api/audio` 写 Mongo `somni_audio_materials`(Somni 文档体);有 `audio_url` 时同步 upsert ES;`DELETE` 仍经 comm-service
- **核心**:三维度音频检索(ES 召回 + 标签词典向量 + 精排)
- **功能手板**:`MONGO_*` + `ES_NODE` + `REDIS_URL`;HTTP `:8080` + gRPC `:50051`
- **量产**:`SOMNI_MONGO_*` + `SOMNI_ES_*` + `SOMNI_REDIS_URL`;gRPC `:50052`
- **写路径**:直连 Mongo,再同步本侧 ES(不再调用 BioNode)
- **接口文档**:`docs/功能手板接口文档.md`、`docs/量产接口文档.md`

## 架构

```text
算法端 / 调用方
对外 HTTP (FastAPI + Pydantic)
├──读(检索)──► somni_audio_materials (ES)
│ + somni_audio_tag_dictionary (ES 向量)
│ + 进程内 Embedding (bge-small-zh-v1.5)
├──写(创建/更新)──► Mongo somni_audio_materials ──► ES upsert(有 audio_url)
├──写(删除)──► comm-service (gRPC) + ES delete
└──同步(定时/手动)──► MongoDB Somni 集合 ──► Elasticsearch
├── HTTP :8080 ──► app/api/audio ──► server/handboard(Fullive)
├── gRPC :50051 ─► uburnode.v1(手板 audio/quiz)
└── gRPC :50052 ─► uburnode.somni.v1(量产 ListTags/ListAudios/Search/GetAnswer)
```

## 数据流

| 环节 | 来源 | 目标 | 模块 |
|------|------|------|------|
| Mongo → ES 同步 | `somni_audio_materials`、`somni_audio_tag_dictionary` | 同名 ES 索引 | `scripts/sync_es_from_comm.py` |
| 标签向量 | 词典 `name` / `name_en` | `name_vector` / `name_en_vector` | 同步脚本 + `app/embedding/` |
| HTTP 检索 | ES 原料文档 | `data.results[].materials[]` 原样返回 | `app/services/retrieval.py` |
| HTTP 创建/更新 | Somni 文档体(仅创建强制 `audio_name`) | Mongo + ES | `app/services/audio.py` |
| HTTP 删除(遗留) | material_id | comm + ES delete | `app/services/audio.py` |

字段命名全链路 **snake_case**。Somni 表结构详见仓库内 `音频表结构.md`。

## 目录结构

```text
UburPython/
├── app/
│ ├── main.py # FastAPI 入口 + lifespan
│ ├── core/ # 配置、日志、标签转换
│ ├── api/audio.py # 4 个 HTTP 端点
│ ├── schemas/audio.py # Pydantic 模型
│ ├── services/ # AudioService、RetrievalService
│ ├── mongo/materials.py # Mongo somni_audio_materials 读写
│ ├── es/
│ │ ├── search.py # EsSearch 读路径
│ │ ├── sync.py # EsSync(Somni upsert + 删除)
│ │ ├── somni_docs.py # description_text 等文档转换
│ │ └── index_mappings.py # ES 索引 mapping + 字段注释
│ ├── embedding/encoder.py # bge-small-zh-v1.5 向量编码
│ └── bionode_grpc_clients/ # comm-service gRPC 客户端
│ ├── main.py # FastAPI + lifespan(双 gRPC)
│ ├── api/audio.py # HTTP /api/audio
│ ├── server/
│ │ ├── bootstrap.py # 启停手板/量产 gRPC
│ │ ├── handboard/ # 功能手板 audio|quiz
│ │ └── somni/ # 量产 audio|quiz
│ ├── uburnode_grpc/grpc_gen/ # proto 生成 stub
│ ├── core/ # 配置、日志、bson 工具
│ ├── schemas/
│ ├── services/retrieval.py # 检索流水线
│ ├── es/ # ES 读/写同步
│ ├── embedding/
│ ├── cache/
│ └── middleware/
├── scripts/
│ ├── sync_es_from_comm.py # Mongo → ES 差异同步
│ └── gen_proto.sh # 生成 gRPC stub
├── proto/ # bionode_comm.proto
│ └── gen_uburnode_proto.sh # 生成对外 gRPC stub
├── proto/
│ ├── uburnode.proto
│ └── uburnode_somni.proto
├── tests/
├── pyproject.toml
└── .env.example
Expand All @@ -70,22 +54,22 @@ UburPython/
# 1. 安装依赖(推荐 uv)
uv sync --extra dev

# 2. 生成 comm gRPC stub(CUD 接口需要)
chmod +x scripts/gen_proto.sh
./scripts/gen_proto.sh
# 2. 生成对外 gRPC stub
chmod +x scripts/gen_uburnode_proto.sh
./scripts/gen_uburnode_proto.sh

# 3. 本地 Elasticsearch
docker compose -f docker-compose.es.yml up -d
curl -s http://localhost:9200

# 4. 配置环境变量
cp .env.example .env
# 编辑 ES_NODE、MONGO_URI、EMBEDDING_ONNX_DIR、COMM_GRPC_* 等
# 编辑 ES_NODE、MONGO_URI、SOMNI_MONGO_URI、SOMNI_ES_NODE、EMBEDDING_* 等

# 5. 导出 ONNX 模型(若 models/ 目录尚无模型)
# 见 scripts/export_onnx_model.py

# 6. Mongo → ES 全量同步
# 6. Mongo → ES 同步(手板库)
uv run python scripts/sync_es_from_comm.py --dry-run
uv run python scripts/sync_es_from_comm.py

Expand Down
2 changes: 1 addition & 1 deletion app/api/audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
UpdateAudioRequest,
)
from app.schemas.response import ApiResponse, success
from app.services.audio import AudioService
from app.server.handboard.audio.service import AudioService

router = APIRouter(prefix="/audio", tags=["audio"])

Expand Down
5 changes: 0 additions & 5 deletions app/bionode_grpc_clients/__init__.py

This file was deleted.

8 changes: 0 additions & 8 deletions app/bionode_grpc_clients/comm/__init__.py

This file was deleted.

Loading