Создание веб-приложения CHAT WITH PDF Django для колледжа | Не удалось получить точные ответы langchain
Я пытаюсь создать Django, Langchain Pdf Chat Web App, на котором студенты могут загружать свои Syllabus PDF и задавать вопросы о нем. аналогично этому Website.
Это проект колледжа по искусственному интеллекту и веб-разработке.
Я много узнал об этом и из-за ограниченных ресурсов и будучи новичком. Я создал простое веб-приложение django, на котором можно загрузить pdf и задать вопрос из него, и он использует, встраивание, vectorstore, и Chat-gpt API и предоставление ответов, но точность ответов очень плохая и иногда совершенно неактуальна.
Вот код проекта, который я создаю на данный момент:
Из файла Views.py
def upload_pdf(request):
if request.method == 'POST':
form = PDFUploadForm(request.POST, request.FILES)
if form.is_valid():
pdf_doc = form.save()
pdf_text = get_pdf_text([pdf_doc.pdf_file.path])
pdf_doc.processed_text = pdf_text
pdf_doc.save()
return redirect('process_pdf')
else:
form = PDFUploadForm()
return render(request, 'pdf/upload_pdf.html', {'form': form})
def processing_text(request):
pdf_docs = PDFDocument.objects.all()
if not pdf_docs:
return redirect('upload_pdf')
raw_text = "".join([doc.processed_text for doc in pdf_docs if doc.processed_text is not None])
# If all processed_text are None, handle accordingly
if not raw_text:
print("All processed_text are None.")
return redirect('upload_pdf')
text_chunks = get_text_chunks(raw_text)
vectorstore = get_vectorstore(text_chunks, api_key=OPENAI_API_KEY)
vectorstore_id = str(len(vectorstore_dict))
vectorstore_dict[vectorstore_id] = vectorstore
request.session['vectorstore_id'] = vectorstore_id
return redirect('ask_question')
def ask_question(request):
if request.method == 'POST':
form = QuestionForm(request.POST)
if form.is_valid():
user_question = form.cleaned_data['question']
vectorstore_id = request.session.get('vectorstore_id')
if vectorstore_id:
vectorstore = vectorstore_dict[vectorstore_id]
conversation_chain = get_conversation_chain(vectorstore, api_key=OPENAI_API_KEY)
if 'chat_history' not in request.session:
request.session['chat_history'] = []
chat_history = request.session['chat_history']
response = conversation_chain.invoke({
'question': user_question,
'chat_history': chat_history
})
new_chat_history = response['chat_history']
request.session['chat_history'] = [str(item) for item in new_chat_history]
return render(request, 'pdf/answer.html', {'chat_history': new_chat_history})
else:
form = QuestionForm()
return render(request, 'pdf/ask_question.html', {'form': form})
вот код из Utils.py
vectorstore_dict = {}
def get_pdf_text(pdf_paths):
text = ""
for path in pdf_paths:
pdf_reader = PdfReader(path)
for page in pdf_reader.pages:
text += page.extract_text()
return text
def get_text_chunks(text):
sections = re.split(r"(Semester \d+|Subject: [\w\s]+)", text)
text_chunks = []
for i in range(1, len(sections), 2): # Use the odd-indexed parts (headings like Semester or Subject)
heading = sections[i] # The heading (e.g., "Semester 1")
content = sections[i+1] if i+1 < len(sections) else "" # The content (e.g., subjects under Semester 1)
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=700, # Adjust based on your requirement
chunk_overlap=150
)
chunks = text_splitter.split_text(content)
text_chunks.extend([f"{heading}\n{chunk}" for chunk in chunks])
print("Generated Chunks: ", text_chunks) # Debugging: Inspect the chunks
return text_chunks
def get_vectorstore(text_chunks, api_key):
embeddings = OpenAIEmbeddings(openai_api_key=api_key)
vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
return vectorstore
def get_conversation_chain(vectorstore, api_key):
llm = ChatOpenAI(api_key=api_key)
memory = ConversationBufferMemory(return_messages=True, memory_key="chat_history")
retriever = vectorstore.as_retriever(search_type="mmr", k=5)
conversation_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory
)
return conversation_chain
Пожалуйста, помогите, я хочу улучшить качество моих ответов, они должны быть полными и иметь достаточно содержания, чтобы объяснить вещи должным образом
Если требуются какие-либо другие файлы кодов, связанные с этим проектом, пожалуйста, спрашивайте, я буду рад предоставить их.