fix: improve OCR indexing and evidence review

This commit is contained in:
2026-09-25 19:03:19 +08:00
parent ac1f0ff46d
commit df5fcb4bda
12 changed files with 185 additions and 36 deletions
+18 -10
View File
@@ -7,9 +7,13 @@ from .config import get_settings
from .models import KnowledgeChunk, KnowledgeDocument
INDEX_VERSION = 2
def split_pages(pages: list[dict], *, size=650, overlap=100):
for page in pages:
blocks = [block.strip() for block in page.get("text", "").split("\n\n") if block.strip()]
text = page.get("text", "").strip()
blocks = [text] if text else []
for table in page.get("tables", []):
blocks.append("表格: " + str(table.get("rows", table)))
for block in blocks:
@@ -49,18 +53,22 @@ def ingest(db, *, course_version_id: int, project_id: int | None, submission_fil
existing = db.scalar(select(KnowledgeDocument).where(KnowledgeDocument.course_version_id == course_version_id,
KnowledgeDocument.project_id == project_id, KnowledgeDocument.submission_file_id == submission_file_id,
KnowledgeDocument.title == title))
if existing and existing.source_hash == source_hash and existing.status == "ready":
if existing and existing.source_hash == source_hash and existing.index_version == INDEX_VERSION and existing.status == "ready":
return existing
if existing:
db.execute(delete(KnowledgeChunk).where(KnowledgeChunk.document_id == existing.id))
db.delete(existing)
db.flush()
doc = KnowledgeDocument(course_version_id=course_version_id, project_id=project_id, submission_file_id=submission_file_id,
title=title, document_type=category, source_hash=source_hash, status="indexing")
db.add(doc)
db.flush()
chunks = list(split_pages(pages))
vectors = embedder([chunk["text"] for chunk in chunks])
if len(vectors) != len(chunks):
raise RuntimeError("嵌入向量数量与知识片段数量不一致")
if existing:
db.execute(delete(KnowledgeChunk).where(KnowledgeChunk.document_id == existing.id))
doc = existing
doc.document_type, doc.source_hash = category, source_hash
else:
doc = KnowledgeDocument(course_version_id=course_version_id, project_id=project_id, submission_file_id=submission_file_id,
title=title, document_type=category, source_hash=source_hash)
db.add(doc)
doc.index_version, doc.status = INDEX_VERSION, "indexing"
db.flush()
for chunk, vector in zip(chunks, vectors):
db.add(KnowledgeChunk(document_id=doc.id, course_version_id=course_version_id, project_id=project_id,
document_type=category, page=chunk["page"], section=chunk["section"], text=chunk["text"], embedding=vector))