Я создаю проект, в котором пользователь загружает PDF-файл, который создает базу данных вектора цветности, и пользователь получает выходные данные. Проблема возникает, когда пользователь загружает второй PDF-файл: система должна удалить существующую векторную базу данных и создать новую. Однако я продолжаю сталкиваться с ошибкой «PermissionError: [WinError 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом». Похоже, что файл все еще используется другим процессом, и я не могу удалить старую векторную базу данных по мере необходимости. Как я могу решить эту проблему, чтобы убедиться, что файл правильно закрыт или освобожден перед удалением?
После исследования я обнаружил, что Chroma не имеет встроенной функции для закрытия или удаления файла. векторная БД. Я попробовал несколько решений, включая принудительное удаление и использование библиотеки psutil для завершения процессов, но пока ни одно из них не сработало. Было бы очень полезно, если бы кто-нибудь мог мне в этом помочь.
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import FileResponse
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores.chroma import Chroma
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from langchain.prompts import PromptTemplate
import os
import shutil
import tempfile
import time
from dotenv import load_dotenv
load_dotenv()
app = FastAPI()
# Folders
OUTPUT_DIR = "output_dir"
PERSIST_DIR = "vector_db"
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(PERSIST_DIR, exist_ok=True)
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
#
def process_pdf(pdf_path: str) -> str:
# Check if a vector DB already exists, and delete it if found
if os.path.exists(PERSIST_DIR):
shutil.rmtree(PERSIST_DIR)
os.makedirs(PERSIST_DIR)
# Load the PDF document
loader = PyPDFLoader(pdf_path)
pages = loader.load()
# Split the document into chunks
splitter = RecursiveCharacterTextSplitter(
chunk_size=200,
chunk_overlap=50
)
chunks = splitter.split_documents(pages)
# Initialize embeddings and vector store
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory=PERSIST_DIR)
# Initialize retriever and LLM
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
llm = ChatOpenAI(
model="gpt-4o",
temperature=0.9,
max_tokens=500,
openai_api_key=OPENAI_API_KEY
)
# Create prompt template and retrieval chain
template = """
Act as an experienced document reviewer. Your task is to give a clear concise summary of the document.
context: {context}
input: {input}
answer:
"""
prompt = PromptTemplate.from_template(template)
combine_docs_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain)
# Generate responses from the LLM
response_1 = retrieval_chain.invoke({"input": "Give me summary of the document."})
time.sleep(5)
# Generate a unique filename by incrementing a number suffix
base_filename = "Output"
file_number = 1
while os.path.exists(f"{OUTPUT_DIR}/{base_filename}_{file_number}.txt"):
file_number += 1
filename = f"{OUTPUT_DIR}/{base_filename}_{file_number}.txt"
# Save responses to a text file
with open(filename, "w", encoding="utf-8") as file:
file.write("Output:\n\n")
file.write("Summary:\n")
file.write(response_1["answer"] + "\n\n")
return filename
# API
@app.post("/process-pdf/")
async def process_pdf_file(file: UploadFile = File(...)):
try:
# Use a temporary directory to store the uploaded PDF file
with tempfile.TemporaryDirectory() as temp_dir:
temp_pdf_path = os.path.join(temp_dir, file.filename)
# Save the uploaded PDF temporarily
with open(temp_pdf_path, "wb") as temp_file:
shutil.copyfileobj(file.file, temp_file)
# Process the PDF and generate the report
result_file_path = process_pdf(temp_pdf_path)
# Return the generated text file as a response
return FileResponse(result_file_path, filename=os.path.basename(result_file_path))
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Подробнее здесь: https://stackoverflow.com/questions/789 ... ng-deleted