Langchain-Chatchat icon indicating copy to clipboard operation
Langchain-Chatchat copied to clipboard

"删除知识库内指定文件"接口是不是有BUG

Open luojihaohuawei opened this issue 1 year ago • 5 comments

在调用”/knowledge_base/delete_docs“删除知识库内文件时,能返回200并提示删除成功,文件所保存的目录下也没有该文件,但是再用”/knowledge_base/list_files“进行搜索时却又能获取到刚刚提示已删除的文件,请问这个是BUG吗

luojihaohuawei avatar Feb 22 '24 11:02 luojihaohuawei

🤖

嘿,@luojihaohuawei!又见面了,希望你最近一切都好!遇到你真是太好了,我们来看看这次又碰到了什么有趣的挑战吧。

根据我在Langchain-Chatchat仓库中找到的相关问题,这个问题可能是由于在删除知识库文件时,对应的向量索引并没有同步删除导致的。这个问题在这个issue中有详细的讨论,并且在这个commit中已经被修复。

另外,我还找到了一段Python代码,这段代码可以手动删除.faiss和.pkl文件中的向量数据,你可以参考一下:

import pickle

with open('index.pkl', 'rb') as f:
    id_list = pickle.load(f)
print(id_list)

import faiss
import numpy as np
# 加载Faiss索引对象
index = faiss.read_index('index.faiss')
# 获取向量数量和维度
num_vectors = index.ntotal
dimension = index.d
print(num_vectors )
print(dimension)
# 打印向量数据
for i in range(num_vectors):
    vector = index.reconstruct(i)
    print(f"Vector {i+1}: {vector}")

# 要删除的数据点的标识符(ID)列表
ids_to_remove = [1, 2, 3]
ids_to_remove =np.array(ids_to_remove)
# 删除指定的数据
index.remove_ids(ids_to_remove)
# 重新生成.faiss文件
faiss.write_index(index, "index.faiss")

# 获取向量数量和维度
num_vectors = index.ntotal
dimension = index.d
print(num_vectors )
print(dimension)
# 打印向量数据
for i in range(num_vectors):
    vector = index.reconstruct(i)
    print(f"Vector {i+1}: {vector}")

这段代码首先加载.faiss和.pkl文件,然后删除指定的向量数据,最后重新生成.faiss文件。

如果你使用的是Langchain-Chatchat的最新版本,这个问题应该已经被修复了。如果你还在使用旧版本,建议你更新到最新版本试试。

Sources

About Dosu

This response is meant to be useful and save you time. It is not meant to be a precise solution, but rather a starting point for your own research.

Help me be more useful! Please leave a 👍 if this is helpful and 👎 if it is irrelevant.

If you want to continue the conversation, start your reply with @dosu-bot.

dosubot[bot] avatar Feb 22 '24 11:02 dosubot[bot]

这是删除知识库,不是删除文件,相当于删除vector stor那个文件夹

zRzRzRzRzRzRzR avatar Feb 22 '24 14:02 zRzRzRzRzRzRzR

这是删除知识库,不是删除文件,相当于删除vector stor那个文件夹

”/knowledge_base/delete_docs“接口按照swagger说明("删除知识库内指定文件")不是删除文件吗?

luojihaohuawei avatar Feb 23 '24 01:02 luojihaohuawei

是删除这个文件并重新弄一个没有这个文件的vector store

zRzRzRzRzRzRzR avatar Feb 25 '24 06:02 zRzRzRzRzRzRzR

是删除这个文件并重新弄一个没有这个文件的vector store

抱歉,这里我不是很理解清楚,我的理解是:按照您的说法重新弄的vector store不是应该覆盖旧的vector store吗?,这样才能实现删除DB里面该文件的功能呀。 如果不是我理解的这样,目前项目有无实现删除包括指定知识库和存储路径下文件的接口呢?

luojihaohuawei avatar Feb 26 '24 01:02 luojihaohuawei

这个问题已经被标记为 stale ,因为它已经超过 30 天没有任何活动。

github-actions[bot] avatar Mar 27 '24 21:03 github-actions[bot]