fix: rebuild-index 分批编码 + nl_query search_by_vector + consumer 消费组初始化

This commit is contained in:
小唯 A06
2026-05-27 10:40:52 +08:00
parent 38abc1cab6
commit ed5753e881
4 changed files with 74 additions and 4 deletions
+42
View File
@@ -0,0 +1,42 @@
# 织忆 v3.1 待修复问题(2026-05-27)
## 待修复 Bug
### 1. NL query 失败
**问题**:hf-mirror.com 无 bge-m3 模型,nl_query.py 试图从该镜像下载
**根因**:sbert_meta.json model_name 标记为 "bge-m3",但本地 SBertIndex 用 moka-ai/m3e-base(768d);nl_query.py 内部用 m3e-base 编码搜 search,流程本身正常但报错来自镜像下载
**修复**:确认 nl_query.py 是否需要下载模型(应该用本地 m3e-base),sbert_meta.json model_name 改回 moka-ai/m3e-base
### 2. graph/stats 500
**问题**:graph/stats 返回 Internal Server Error
**根因**:graph.db 是 0 字节文件,SQLite 表未初始化
**修复**:删除 0 字节 db,重启时让 sqlite_storage.py 自动建表
### 3. batch-commit 500 Internal Error
**问题**:POST /batch-commit 返回 500
**待查**:可能是 redis_store.append_commit 失败或 episode.to_dict() 格式问题
### 4. recall/batch 请求格式
**问题**:需要确认正确的请求 body 格式(list vs {"queries": [...]})
**修复**:查看路由定义,确认期望格式
### 5. systemd restart 循环导入
**问题**:systemd restart 失败,日志显示循环导入
**根因**:早期版本代码遗留,api/embedder.py 已修复但 systemd 用的是旧代码
**修复**:reload systemd daemon + 重启服务
## 待完成的自动化
### 6. Crontab 定时任务
**问题**:无定时 rebuild-index 任务
**修复**:添加 crontab 任务
### 7. 双实例 + Nginx
**问题**:实例2(7822)未运行,Nginx 8188 无响应
**修复**:启动实例2,配置/重启 Nginx
## 元数据问题
### 8. sbert_meta.json model_name 错误
**问题**:sbert_meta.json 标记为 bge-m3,实际是 moka-ai/m3e-base
**修复**:改回 moka-ai/m3e-base
+5 -3
View File
@@ -20,13 +20,15 @@ def nl_query(q: str, top_k: int = 5):
try:
from storage.bge_embedder import get_bge_client
from storage.sbert_embedder import SentenceTransformersRecall
import numpy as np
import numpy as np
bge = get_bge_client()
embedder = SentenceTransformersRecall()
# 获取本地 sbert 搜索结果(m3e-base 768维)
raw = embedder.search(q, top_k * 2)
# 用 bge-m3 (1024d) 编码 query,传给 search_by_vector
# 不走 SBertIndex.search()(内部用 moka-ai/m3e-base 768d,会有维度不匹配)
query_vec = np.array(bge.encode(q, normalize_output=True), dtype=np.float32)
raw = embedder.search_by_vector(query_vec, top_k * 2)
# 用 bge-m3 重打分(1024维)
scored = []
+20 -1
View File
@@ -563,7 +563,26 @@ def rebuild_index():
all_docs.append(doc)
embedder = _get_embedder()
embedder.index_documents(all_docs)
bge = _get_bge()
# 用 bge-m3 API 编码(1024维),分批处理避免 API 超限
# encode_batch 内部已按 32 条分批,但总量过大会触发服务端验证错误
# 这里显式分批调用
BATCH_SIZE = 32
all_vectors = []
for i in range(0, len(all_docs), BATCH_SIZE):
batch = all_docs[i:i + BATCH_SIZE]
texts = [doc.get('content', '') or '' for doc in batch]
try:
vectors = bge.encode_batch(texts, normalize_output=True)
all_vectors.extend(vectors)
except Exception as e:
print(f"[Rebuild] bge.encode_batch 失败 (batch {i//BATCH_SIZE}): {e}")
# 用零向量填充失败的批次
all_vectors.extend([[0.0] * 1024 for _ in texts])
embedder.index_documents_with_vectors(all_docs, all_vectors)
stats = embedder.get_stats()
return {
+7
View File
@@ -34,6 +34,13 @@ def _start_event_consumer():
return
last_id = '$'
logging.info("[Consumer] 启动")
# 确保消费组存在(MKSTREAM:流不存在则自动创建)
try:
redis.xgroup_create('zhiyi:events', 'zhiyi-consumers', id='0', mkstream=True)
logging.info("[Consumer] 消费组 zhiyi-consumers 已创建")
except Exception as e:
if 'BUSYGROUP' not in str(e):
logging.warning(f"[Consumer] 消费组创建失败(可忽略): {e}")
while True:
try:
events = redis.xreadgroup(