feat(rag_client): 新增 rag_embed_texts 批量向量化通道——调 rag /api/embed.dspy,按10条分块,任一块失败整体失败带块号(挖掘批次状态机需可行动报错,禁部分成功静默丢数据)

This commit is contained in:
ymq 2026-09-11 22:12:58 +08:00
parent 1b1f8dfa52
commit 78c89a0cce

View File

@ -222,6 +222,30 @@ async def rag_kb_list(project_id):
return await _rag_call(project_id, "kb_list.dspy", payload={})
async def rag_embed_texts(project_id, texts, batch_size=10):
"""批量文本向量化rag 对外 API/rag/api/embed.dspy凭据单点在 rag
以项目 owner 身份调用内部按 batch_size 分块循环返回
(vectors 列表, '') (None, 错误)任一分块失败立即整体失败并带块号
调用方挖掘批次需要可行动的报错禁止部分成功静默丢数据
"""
if not texts:
return None, "texts 为空"
all_vecs = []
bs = max(1, min(int(batch_size or 10), 10))
for i in range(0, len(texts), bs):
chunk = texts[i:i + bs]
data, err = await _rag_call(project_id, "embed.dspy", payload={"texts": chunk})
if err:
return None, "embedding 失败@块%d-%d: %s" % (i, i + len(chunk) - 1, err)
vecs = (data or {}).get("vectors") if isinstance(data, dict) else None
if not vecs or len(vecs) != len(chunk):
return None, "embedding 返回数量不符@块%d-%d%s/%d" % (
i, i + len(chunk) - 1, len(vecs or []), len(chunk))
all_vecs.extend(vecs)
return all_vecs, ""
async def rag_doc_upload(project_id, kb_id, file_path, file_name=""):
"""以 owner 身份上传文件入库API 模式:原始字节 + query 参数)。"""
import os