Merge pull request #69 from xerrors/68-database-chunk-info

添加 chunk 信息
This commit is contained in:
Wenjie Zhang 2025-03-12 21:17:40 +08:00 committed by GitHub
commit 668cdbb2c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 42 additions and 20 deletions

View File

@ -1,7 +1,8 @@
import os import os
import json import json
import time import time
from src.utils import hashstr, logger, is_text_pdf from src.utils import hashstr, logger
from src.core.indexing import chunk
from src.models.embedding import get_embedding_model from src.models.embedding import get_embedding_model
@ -140,7 +141,6 @@ class DataBaseManager:
# 先保存一次数据库状态确保waiting状态被记录 # 先保存一次数据库状态确保waiting状态被记录
self._save_databases() self._save_databases()
from src.core.indexing import chunk
for new_file in new_files: for new_file in new_files:
file_id = new_file["file_id"] file_id = new_file["file_id"]
idx = self.get_idx_by_fileid(db, file_id) idx = self.get_idx_by_fileid(db, file_id)
@ -156,9 +156,10 @@ class DataBaseManager:
nodes = chunk(new_file["path"], params=params) nodes = chunk(new_file["path"], params=params)
self.knowledge_base.add_documents( self.knowledge_base.add_documents(
docs=[node.text for node in nodes], file_id=file_id,
collection_name=db.metaname, collection_name=db.metaname,
file_id=file_id) docs=[node.text for node in nodes],
chunk_infos=[node.dict() for node in nodes])
idx = self.get_idx_by_fileid(db, file_id) idx = self.get_idx_by_fileid(db, file_id)
db.files[idx]["status"] = "done" db.files[idx]["status"] = "done"
@ -219,20 +220,16 @@ class DataBaseManager:
lines = self.knowledge_base.client.query( lines = self.knowledge_base.client.query(
collection_name=db.metaname, collection_name=db.metaname,
filter=f"file_id == '{file_id}'", filter=f"file_id == '{file_id}'",
output_fields=["id", "text", "file_id", "hash"] output_fields=None
) )
# 删除 vector 字段
for line in lines:
line.pop("vector")
lines.sort(key=lambda x: x.get("start_char_idx", 0))
logger.debug(f"lines[0]: {lines[0]}")
return {"lines": lines} return {"lines": lines}
def chunking(self, text, params=None):
chunk_method = params.get("chunk_method", "fixed")
chunk_size = params.get("chunk_size", 500)
"""将文本切分成固定大小的块"""
chunks = []
for i in range(0, len(text), chunk_size):
chunks.append(text[i:i + chunk_size])
return chunks
def delete_database(self, db_id): def delete_database(self, db_id):
db = self.get_kb_by_id(db_id) db = self.get_kb_by_id(db_id)
if db is None: if db is None:

View File

@ -8,9 +8,21 @@ from llama_index.readers.file import FlatReader, DocxReader
from src.utils import hashstr from src.utils import hashstr
def chunk(text_or_path, params=None): def chunk(text_or_path, params=None):
"""
将文本或文件切分成固定大小的块
Args:
text_or_path: 文本或文件路径
params: 参数
chunk_size: 块大小
chunk_overlap: 块重叠大小
use_parser: 是否使用文件解析器
Returns:
nodes: 节点列表
"""
params = params or {} params = params or {}
chunk_size = int(params.get("chunk_size", 500)) chunk_size = int(params.get("chunk_size", 500))
chunk_overlap = int(params.get("chunk_overlap", 20)) chunk_overlap = int(params.get("chunk_overlap", 100))
splitter = SentenceSplitter( splitter = SentenceSplitter(
chunk_size=chunk_size, chunk_size=chunk_size,
chunk_overlap=chunk_overlap, chunk_overlap=chunk_overlap,

View File

@ -59,7 +59,7 @@ class KnowledgeBase:
dimension= dimension, # The vectors we will use in this demo has 768 dimensions dimension= dimension, # The vectors we will use in this demo has 768 dimensions
) )
def add_documents(self, docs, collection_name, **kwargs): def add_documents(self, docs, collection_name, chunk_infos=None, **kwargs):
"""添加已经分块之后的文本""" """添加已经分块之后的文本"""
# 检查 collection 是否存在 # 检查 collection 是否存在
import random import random
@ -67,6 +67,8 @@ class KnowledgeBase:
logger.error(f"Collection {collection_name} not found, create it") logger.error(f"Collection {collection_name} not found, create it")
# self.add_collection(collection_name) # self.add_collection(collection_name)
chunk_infos = chunk_infos or [{}] * len(docs)
vectors = self.embed_model.batch_encode(docs) vectors = self.embed_model.batch_encode(docs)
data = [{ data = [{
@ -74,7 +76,9 @@ class KnowledgeBase:
"vector": vectors[i], "vector": vectors[i],
"text": docs[i], "text": docs[i],
"hash": hashstr(docs[i], with_salt=True), "hash": hashstr(docs[i], with_salt=True),
**kwargs} for i in range(len(vectors))] **kwargs,
**chunk_infos[i]
} for i in range(len(vectors))]
res = self.client.insert(collection_name=collection_name, data=data) res = self.client.insert(collection_name=collection_name, data=data)
return res return res

View File

@ -94,8 +94,8 @@
@after-open-change="afterOpenChange" @after-open-change="afterOpenChange"
> >
<h2> {{ selectedFile?.lines.length }} 个片段</h2> <h2> {{ selectedFile?.lines.length }} 个片段</h2>
<p v-for="line in selectedFile?.lines" :key="line.id"> <p v-for="line in selectedFile?.lines" :key="line.id" class="line-text">
<strong>Chunk #{{ line.id }}</strong> {{ line.text }} {{ line.text }}
</p> </p>
</a-drawer> </a-drawer>
</div> </div>
@ -871,6 +871,15 @@ onUnmounted(() => {
} }
} }
} }
.custom-class .line-text {
padding: 10px;
border-radius: 4px;
&:hover {
background-color: var(--main-light-4);
}
}
</style> </style>
<style lang="less"> <style lang="less">