Пример кода < /h3>
# ----------- code to store data in vectordb ----------------
ext_to_loader = {
'.csv': CSVLoader,
'.json': JSONLoader,
'.txt': TextLoader,
'.pdf': PDFPlumberLoader,
'.docx': Docx2txtLoader,
'.pptx': PPTXLoader,
'.xlsx': ExcelLoader,
'.xls': ExcelLoader,
'single_page_url':WebBaseLoader,
'all_urls_from_base_url': RecursiveUrlLoader,
'directory': DirectoryLoader
}
def get_loader_for_extension(file_path):
_, ext = os.path.splitext(file_path)
loader_class = ext_to_loader.get(ext.lower())
if loader_class:
return loader_class(file_path)
else:
print(f"Unsupported file extension: {ext}")
return None
def normalize_documents(docs):
return [
doc.page_content if isinstance(doc.page_content, str) else '\n'.join(doc.page_content) if isinstance(doc.page_content, list) else ''
for doc in docs
]
def vectorestore_function(split_documents_with_metadata, user_vector_store_path):
try:
# Create vector store with metadata
embeddings = OpenAIEmbeddings(
model = "text-embedding-ada-002",
openai_api_key=OPENAI_API_KEY
)
vector_store = Chroma(
embedding_function=embeddings,
persist_directory=user_vector_store_path
)
vector_store.add_documents(documents=split_documents_with_metadata)
return vector_store
except Exception as e:
print(f'Error in vectorestore_function {str(e)}')
loader = get_loader_for_extension(saved_file_path)
docs = loader.load()
normalized_docs = normalize_documents(docs)
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size)
split_docs = text_splitter.create_documents(normalized_docs)
split_documents_with_metadata = [
Document(page_content=document.page_content, metadata={"user_id": user_id, "doc_id": document_id})
for document in split_docs
]
vectorestore_function(
split_documents_with_metadata,
user_vector_store_path
)
#Note: I use above (same) code to add or update new data
# ----------------------------------------------------------- code for interaction with AI -----------------------------------------------------------
def get_vector_store(user_vector_store_path):
embeddings = OpenAIEmbeddings(
model = "text-embedding-ada-002",
openai_api_key=OPENAI_API_KEY
)
vectorstore = Chroma(
embedding_function=embeddings,
persist_directory=user_vector_store_path
)
return vectorstore
document_id_list = [str(document_id) if isinstance(document_id, int) else document_id for document_id in document_id_list]
user_vector_store_path = os.path.join(VECTOR_STORE_PATH, user_id)
vectorstore = get_vector_store(user_vector_store_path)
retriever=vectorstore.as_retriever()
current_threshold = 0.25
try:
# Configure filtering
retriever.search_type = "similarity_score_threshold"
retriever.search_kwargs = {
"filter": {
"$and": [
{"user_id": user_id},
{"doc_id": {"$in": document_id_list}}
]
},
"score_threshold": current_threshold,
"k": 3
}
retrieved_docs = retriever.invoke(question)
except Exception as e:
print(f'error: {str(e)}')
print(f"retrieved_docs : {retrieved_docs}")
if not retrieved_docs:
return jsonify({'error': f'No relevant docs were retrieved.'}), 404
< /code>
Сообщение об ошибке и трасса стека (если применимо) < /h3>
warning:langchain_core.vectorstores.base:no Соответствующие документы были получены с использованием порога оценки релевантности 0.25 < /p>
Описание: < /strong>
Я сталкиваюсь с проблемой с моим живым сервером. Когда создается новый пользователь, создается новая векторная база данных, и все работает нормально. Если я добавлю больше данных, он хранится в векторной базе данных, но я не могу получить вновь добавленные данные. < /P>
Интересно, что эта проблема не возникает в моей локальной среде - это происходит только на живом сервере. Чтобы сделать новые данные, я должен выполнить PM2 RELOAD «ID», так как мое приложение работает с PM2. Однако, если другой пользователь находится в середине разговора, когда я перезагружаю PM2, соединение сокета отключается, нарушая их сеанс. - Используется для мобильного приложения
node.js - используется для бэк -офиса
python - обрабатывает извлечение данных, создание векторной базы данных и разговоры
Загрузка файла, создание встраивания и векторные базы данных обрабатываются с использованием сельдерея.
Сервер настроен с Apache, а PM2 используется для управления процессом применения. < /P>
Проблема:
Новые данные добавляются в векторную базу данных, но не могут быть получены до тех пор, пока не будет выполнена перезагрузка PM2 «ID». За влиянием текущих разговоров с пользователями.
чего я хочу достичь:
Я хочу убедиться, что система работает плавно, когда пользователь добавляет или обновляет данные в векторной базе данных. Новые данные должны быть немедленно доступны для разговоров, не требуя перезагрузки PM2. < /P>
In the back office, I am using Socket.IO to send status updates:
< /code>
socketio.emit('status', {'message': {
"user_id": user_id,
"document_id": document_id,
"status": 200,
"message": f"Document ID {document_id} processed successfully."
}}, room=room)
< /code>
This message is successfully emitted, and users can start conversations after receiving it. However, I’m still facing the issue where newly added data is not retrievable until I reload PM2.
Question:
How can I ensure that the system updates the vector database dynamically without requiring a PM2 reload, while keeping active socket connections intact?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ordb-29499