使用ObjectBox作为向量存储时遇CoreException 10001错误的解决咨询
解决ObjectBox向量存储的多实例冲突问题
问题背景
我开发了一个基于RAG的问答应用,采用ObjectBox作为向量存储,Streamlit作为前端交互。核心代码如下:
import streamlit as st import os from langchain_groq import ChatGroq from langchain_community.document_loaders import PyPDFDirectoryLoader from langchain_community.embeddings import OllamaEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from langchain.chains import create_retrieval_chain from langchain_objectbox.vectorstores import ObjectBox import time groq_api_key = "The Groq API Key" st.title("Objectbox VectorsstoreDB with Llama3") llm = ChatGroq(groq_api_key=groq_api_key, model_name="Llama3-8b-8192") prompt = ChatPromptTemplate.from_template( """ Answer the questions based on the provided context only. Please provide te most accurate response based on the question <<context>> {context} <<context>> Questions: {input} """ ) if "vector" not in st.session_state: st.session_state.embeddings=OllamaEmbeddings() st.session_state.loader = PyPDFDirectoryLoader("./us_census") # Data Ingestion st.session_state.docs = st.session_state.loader.load() # Document loading st.session_state.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200) # Chunk Creation st.session_state.final_documents = st.session_state.text_splitter.split_documents(st.session_state.docs[:20]) # Splitting st.session_state.vectors = ObjectBox.from_documents(st.session_state.final_documents,st.session_state.embeddings,embedding_dimensions=768) # Vector Ollama embeddings print("hi") input_prompt = st.text_input("Input Prompt") if st.button("Documents Embedding"): #vector_embedding() st.write("Vector Store DB is Ready") if input_prompt: document_chain = create_stuff_documents_chain(llm,prompt) retriever = st.session_state.vectors.as_retriever() retrieval_chain = create_retrieval_chain(retriever,document_chain) start = time.process_time() response = retrieval_chain.invoke({"input":input_prompt}) print("Response time:",time.process_time()-start) st.write(response['answer']) # Streamlit expander with st.expander("Doc similarity search"): # finding relevant chunks for i, doc in enumerate(response["context"]): st.write(doc.page_content) st.write("-------------------------")
错误详情
在Streamlit输入框提交查询后,触发以下错误:
CoreException: 10001 (ILLEGAL_STATE) - Cannot open store: another store is still open using the same path: "C:\Users\RISHAV BHATTACHARJEE\Desktop\RB Workbase\Generative-AI\Langchain\ObjectBox\objectbox"
回溯信息:
File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\streamlit\runtime\scriptrunner\script_runner.py", line 584, in _run_script exec(code, module.__dict__) File "C:\Users\RISHAV BHATTACHARJEE\Desktop\RB Workbase\Generative-AI\Langchain\ObjectBox\app.py", line 38, in st.session_state.vectors = ObjectBox.from_documents(st.session_state.final_documents,st.session_state.embeddings,embedding_dimensions=768) # Vector Ollama embeddings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\langchain_core\vectorstores.py", line 550, in from_documents return cls.from_texts(texts, embedding, metadatas=metadatas, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\langchain_objectbox\vectorstores.py", line 215, in from_texts ob = cls(embedding, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\langchain_objectbox\vectorstores.py", line 52, in __init__ self._db = self._create_objectbox_db() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\langchain_objectbox\vectorstores.py", line 252, in _create_objectbox_db return objectbox.Store(model=model,directory=db_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\objectbox\store.py", line 168, in __init__ self._c_store = c.obx_store_open(options._c_handle) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\RISHAV BHATTACHARJEE\anaconda3\Lib\site-packages\objectbox\c.py", line 295, in check_result raise CoreException(C.obx_last_error_code())
解决方法
1. 修正Session State键名匹配问题
原代码中判断条件用的是"vector",但实际赋值的是st.session_state.vectors(复数),导致每次脚本运行都会重新创建ObjectBox实例,引发多实例冲突。把判断条件改为:
if "vectors" not in st.session_state:
2. 优化初始化触发逻辑
把向量库初始化逻辑绑定到"Documents Embedding"按钮,避免自动重复执行:
if st.button("Documents Embedding"): if "vectors" not in st.session_state: st.session_state.embeddings=OllamaEmbeddings() st.session_state.loader = PyPDFDirectoryLoader("./us_census") st.session_state.docs = st.session_state.loader.load() st.session_state.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200) st.session_state.final_documents = st.session_state.text_splitter.split_documents(st.session_state.docs[:20]) st.session_state.vectors = ObjectBox.from_documents(st.session_state.final_documents,st.session_state.embeddings,embedding_dimensions=768) st.write("Vector Store DB is Ready")
3. 确保单例实例唯一
ObjectBox不允许同一路径下同时打开多个存储实例,通过Session State保存唯一实例,确保整个应用生命周期中只创建一次。
修改后的完整代码
import streamlit as st import os from langchain_groq import ChatGroq from langchain_community.document_loaders import PyPDFDirectoryLoader from langchain_community.embeddings import OllamaEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate from langchain.chains import create_retrieval_chain from langchain_objectbox.vectorstores import ObjectBox import time groq_api_key = "The Groq API Key" st.title("Objectbox VectorsstoreDB with Llama3") llm = ChatGroq(groq_api_key=groq_api_key, model_name="Llama3-8b-8192") prompt = ChatPromptTemplate.from_template( """ Answer the questions based on the provided context only. Please provide the most accurate response based on the question <<context>> {context} <<context>> Questions: {input} """ ) input_prompt = st.text_input("Input Prompt") if st.button("Documents Embedding"): if "vectors" not in st.session_state: st.session_state.embeddings=OllamaEmbeddings() st.session_state.loader = PyPDFDirectoryLoader("./us_census") # Data Ingestion st.session_state.docs = st.session_state.loader.load() # Document loading st.session_state.text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200) # Chunk Creation st.session_state.final_documents = st.session_state.text_splitter.split_documents(st.session_state.docs[:20]) # Splitting st.session_state.vectors = ObjectBox.from_documents(st.session_state.final_documents,st.session_state.embeddings,embedding_dimensions=768) # Vector Ollama embeddings print("Vector Store initialized") st.write("Vector Store DB is Ready") if input_prompt: if "vectors" not in st.session_state: st.error("Please click 'Documents Embedding' first to initialize the vector store.") else: document_chain = create_stuff_documents_chain(llm,prompt) retriever = st.session_state.vectors.as_retriever() retrieval_chain = create_retrieval_chain(retriever,document_chain) start = time.process_time() response = retrieval_chain.invoke({"input":input_prompt}) print("Response time:",time.process_time()-start) st.write(response['answer']) # Streamlit expander with st.expander("Doc similarity search"): # finding relevant chunks for i, doc in enumerate(response["context"]): st.write(doc.page_content) st.write("-------------------------")
内容的提问来源于stack exchange,提问作者Rishav Bhattacharjee
相关产品推荐
相关产品推荐

