mirror of
https://github.com/RYDE-WORK/Langchain-Chatchat.git
synced 2026-01-24 07:43:16 +08:00
* 新功能: - 知识库管理界面支持查看、编辑、删除向量库文档。暂不支持增加(aggrid添加新行比较麻烦,需要另外实现) - 去除知识库管理界面中重建知识库和删除知识库按钮,建议用户到终端命令操作 修复: - 所有与知识库名称、文件名称有关的数据库操作函数都改成大小写不敏感,所有路径统一为 posix 风格,避免因路径文本不一致导致数据重复和操作失效 (close #2232) 开发者: - 添加 update_docs_by_id 函数与 API 接口。当前仅支持 FAISS,暂时未用到,未将来对知识库做更细致的修改做准备 - 统一 DocumentWithScore 与 DocumentWithVsId - FAISS 返回的 Document.metadata 中包含 ID, 方便后续查找比对 - /knowledge_base/search_docs 接口支持 file_name, metadata 参数,可以据此检索文档 * fix bug
67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
from server.db.models.knowledge_metadata_model import SummaryChunkModel
|
||
from server.db.session import with_session
|
||
from typing import List, Dict
|
||
|
||
|
||
@with_session
|
||
def list_summary_from_db(session,
|
||
kb_name: str,
|
||
metadata: Dict = {},
|
||
) -> List[Dict]:
|
||
'''
|
||
列出某知识库chunk summary。
|
||
返回形式:[{"id": str, "summary_context": str, "doc_ids": str}, ...]
|
||
'''
|
||
docs = session.query(SummaryChunkModel).filter(SummaryChunkModel.kb_name.ilike(kb_name))
|
||
|
||
for k, v in metadata.items():
|
||
docs = docs.filter(SummaryChunkModel.meta_data[k].as_string() == str(v))
|
||
|
||
return [{"id": x.id,
|
||
"summary_context": x.summary_context,
|
||
"summary_id": x.summary_id,
|
||
"doc_ids": x.doc_ids,
|
||
"metadata": x.metadata} for x in docs.all()]
|
||
|
||
|
||
@with_session
|
||
def delete_summary_from_db(session,
|
||
kb_name: str
|
||
) -> List[Dict]:
|
||
'''
|
||
删除知识库chunk summary,并返回被删除的Dchunk summary。
|
||
返回形式:[{"id": str, "summary_context": str, "doc_ids": str}, ...]
|
||
'''
|
||
docs = list_summary_from_db(kb_name=kb_name)
|
||
query = session.query(SummaryChunkModel).filter(SummaryChunkModel.kb_name.ilike(kb_name))
|
||
query.delete(synchronize_session=False)
|
||
session.commit()
|
||
return docs
|
||
|
||
|
||
@with_session
|
||
def add_summary_to_db(session,
|
||
kb_name: str,
|
||
summary_infos: List[Dict]):
|
||
'''
|
||
将总结信息添加到数据库。
|
||
summary_infos形式:[{"summary_context": str, "doc_ids": str}, ...]
|
||
'''
|
||
for summary in summary_infos:
|
||
obj = SummaryChunkModel(
|
||
kb_name=kb_name,
|
||
summary_context=summary["summary_context"],
|
||
summary_id=summary["summary_id"],
|
||
doc_ids=summary["doc_ids"],
|
||
meta_data=summary["metadata"],
|
||
)
|
||
session.add(obj)
|
||
|
||
session.commit()
|
||
return True
|
||
|
||
|
||
@with_session
|
||
def count_summary_from_db(session, kb_name: str) -> int:
|
||
return session.query(SummaryChunkModel).filter(SummaryChunkModel.kb_name.ilike(kb_name)).count()
|