chatchat-space / Langchain-Chatchat

Langchain-Chatchat(原Langchain-ChatGLM)基于 Langchain 与 ChatGLM, Qwen 与 Llama 等语言模型的 RAG 与 Agent 应用 | Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM, Qwen and Llama) RAG and Agent app with langchain
Apache License 2.0
31.89k stars 5.56k forks source link

6个线程添加文件到知识库,导致向量库faiss的文件错乱,直接整个向量库都废了。已经添加了4000多份文件了。 #4914

Closed sengineer00 closed 1 month ago

sengineer00 commented 2 months ago

2024-09-06 12:08:33.117 | ERROR | chatchat.server.knowledge_base.kb_cache.faiss_cache:load_vector_store:140 - Error in struct faiss::Index __cdecl faiss::read_index(struct faiss::IOReader ,int) at D:\a\faiss-wheels\faiss-wheels\faiss\faiss\impl\index_read.cpp:540: Error: 'ret == (size)' failed: read error in D:\data\chatchat_data\data\knowledge_base\29082024\vector_store\text-embedding-3-large\index.faiss: 448339923 != 448339968 (No error) 2024-09-06 12:08:33.118 | ERROR | chatchat.server.chat.kb_chat:knowledge_base_chat_iterator:301 - error in knowledge chat: 向量库 29082024 加载失败。

liunux4odoo commented 2 months ago

你自己开的多线程?FAISS属于文件,明显不能并行写入。

sengineer00 commented 2 months ago

不是自己开的多线程,是项目的上传接口支持多个文件同时上传,项目后台本身也是用多线程逻辑处理的

liunux4odoo commented 2 months ago

说一下你的操作步鄹,我试试能不能复现。 另外,大量文件不建议走 API,至少不要一次性走太多。最好是到服务器运行 chatchat kb -r 命令。

sengineer00 commented 2 months ago

其实就是循环调用upload接口,每次传送6个文件,我设置的是600的超时时间,我发现有的上传会超时,这时候其实客户端已经停止请求了,但是langchain服务端还在运行上一次请求的upload逻辑。另外,我修改了kb_doc_api.py里面的update_docs方法,在接口快要结束时,我读取了向量库的文件并做了bm25关键字检索的预处理过程,将预处理后的结果保存在本地我呢间。这样修改的目的是为了保证在关键字检索知识库的时候加快相应速度,这里我读取向量库的方法比较粗暴,没有用.acquire()锁, v = kb.load_vector_store().obj.docstore._dict.values()。 我检查了faiss_kb_service.py中的do_add_doc方法,用了with self.load_vector_store().acquire() as vs:,按理说向量库更新这个动作应该是线程安全的了吧。

liunux4odoo commented 2 months ago

建议你把读取向量库和 bm25 预处理的功能先禁掉,超时设大一点,再试试。

sengineer00 commented 2 months ago

嗯,我准备加上锁,然后超时加大一些再试试