|
@@ -74,11 +74,25 @@ def _build_chunks(splitter, items: list[dict], source: str) -> tuple[list[Docume
|
|
|
"""
|
|
"""
|
|
|
chunks: list[Document] = []
|
|
chunks: list[Document] = []
|
|
|
ids: list[str] = []
|
|
ids: list[str] = []
|
|
|
|
|
+ seen_ids: set[str] = set()
|
|
|
|
|
+ unique_items: list[dict] = []
|
|
|
for item in items:
|
|
for item in items:
|
|
|
|
|
+ item_id = item.get("id")
|
|
|
|
|
+ if item_id is None:
|
|
|
|
|
+ continue
|
|
|
|
|
+ key = str(item_id)
|
|
|
|
|
+ if key in seen_ids:
|
|
|
|
|
+ continue # 数据源重复 id(如 join 重复行),仅保留先出现者,避免 doc_id 幂等覆盖
|
|
|
|
|
+ seen_ids.add(key)
|
|
|
|
|
+ unique_items.append(item)
|
|
|
|
|
+ if len(unique_items) != len(items):
|
|
|
|
|
+ logger.warning("知识库同步[%s]: 数据源含 %d 条重复 id,去重后 %d 篇",
|
|
|
|
|
+ source, len(items) - len(unique_items), len(unique_items))
|
|
|
|
|
+ for item in unique_items:
|
|
|
item_id = item.get("id")
|
|
item_id = item.get("id")
|
|
|
title = item.get("title", "")
|
|
title = item.get("title", "")
|
|
|
content = item.get("content", "")
|
|
content = item.get("content", "")
|
|
|
- if item_id is None or not content:
|
|
|
|
|
|
|
+ if not content:
|
|
|
continue
|
|
continue
|
|
|
# 若 content 已含 title 前缀则不重复拼接
|
|
# 若 content 已含 title 前缀则不重复拼接
|
|
|
full_text = f"{title}\n\n{content}" if title and title not in content else content
|
|
full_text = f"{title}\n\n{content}" if title and title not in content else content
|