...

/

نظام الأسئلة والأجوبة للمستندات متعدد الأدوار مع LlamaIndex

نظام الأسئلة والأجوبة للمستندات متعدد الأدوار مع LlamaIndex

تعرف على كيفية بناء مساعد محادثة يجيب على الأسئلة المتعلقة بالمستندات التي تم تحميلها باستخدام الذاكرة والاسترجاع الدلالي.

سنغطي ما يلي...

في هذا الدرس، بناء نظامًا تفاعليًا يتيح للمستخدمين تحميل مستندات PDF وطرح أسئلة باللغة الطبيعية حول محتواها. سيجمع النظام المعلومات ذات الصلة من المستندات المرفوعة، ويولد إجابات دقيقة وتفاعلية.

بالإضافة إلى الإجابة على الأسئلة الفردية، يدعم النظام التفاعلات متعددة الأدوار من خلال تذكر الاستفسارات السابقة. كما يتضمن إمكانية تلخيص مستند كامل وعرض خطوات الاستدلال الداخلي، مما يسمح للمطورين أو المستخدمين بفهم كيفية توليد كل استجابة .

يعد هذا النوع من المساعدين الذين يدركون المستندات مفيدًا في السيناريوهات الواقعية مثل مراجعة اتفاقيات الإيجار أو سياسات التأمين أو المناهج الأكاديمية أو إجراءات الشركة.

Press + to interact
Application interface
Application interface

ملاحظة: يستخدم هذا التطبيق RAG لاسترجاع محتوى المستند، والذاكرة لدعم أسئلة المتابعة، وبناء المطالبة لدمج الذاكرة والسياق للتفاعل متعدد الأدوار والتلخيص، والتتبع الأساسي للملاحظة.

لتنفيذ هذا التطبيق، سوف نستخدم الوحدات والمكتبات التالية:

Modules and Libraries

Library/Module

Purpose

LlamaIndex

Indexing, retrieval, memory, and LLM integration

Streamlit

Front-end interface for user interaction

Ollama

Local embedding model for document vectors

Groq

LLM backend to generate conversational responses

لنبدأ بتنفيذ تطبيقنا خطوة بخطوة.

إعداد واجهة Streamlit وخط أنابيب RAG

لجعل نظام الأسئلة والأجوبة للمستندات تفاعليًا، نستخدم Streamlit بناء واجهة ويب بسيطة. يمكن للمستخدمين تحميل ملف PDF واحد أو أكثر وكتابة أسئلة باللغة الطبيعية. عند إرسال سؤال، يسترجع النظام المحتوى ذي الصلة من المستندات المرفوعة ويُنشئ استجابة باستخدام نموذج لغوي.

نبدأ باستيراد المكتبات الضرورية:

import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.llms.groq import Groq
import os
import tempfile
Import required modules

بعد ذلك، نُهيئ نموذج اللغة ونموذج التضمين. يُحوّل نموذج التضمين محتوى المستند إلى تمثيلات متجهية، بينما يُولّد نموذج اللغة إجابات حوارية.

# Initialize Groq LLM
llm = Groq(
model="llama3-70b-8192",
api_key="YOUR_GROQ_API_KEY" # Replace with your actual API key
)
# Initialize embedding model
embedding_model = OllamaEmbedding(model_name="nomic-embed-text")
Initialize the embedding model and LLM

الآن، قمنا بإعداد واجهة Streamlit. عرض عنوان، ووصف، ورافعة ملفات PDF، ونص إدخال أسئلة المستخدمين، زر لإنشاء ملخص.

st.set_page_config(page_title="Multi-Turn Document Q&A")
st.title("Multi-Turn Document Q&A with Your PDFs")
st.markdown("Upload one or more PDF documents, then ask questions or request a summary.")
uploaded_files = st.file_uploader("Upload PDF files", type=["pdf"], accept_multiple_files=True)
query = st.text_input("Enter your question:")
summarize_clicked = st.button("Summarize Document")
Set up the Streamlit interface

عندما يقوم المستخدمون بتحميل الملفات وإدخال سؤال، نقوم بحفظ الملفات مؤقتًا، وتحميل المستندات، بناء فهرس المتجه، وإنشاء استجابة.

if uploaded_files and "documents" not in st.session_state:
with st.spinner("Loading and indexing documents..."):
with tempfile.TemporaryDirectory() as temp_dir:
for uploaded_file in uploaded_files:
file_path = os.path.join(temp_dir, uploaded_file.name)
with open(file_path, "wb") as f:
f.write(uploaded_file.getbuffer())
docs = SimpleDirectoryReader(input_dir=temp_dir).load_data()
idx = VectorStoreIndex.from_documents(docs, embed_model=embedding_model)
st.session_state.documents = docs
st.session_state.index = idx
documents = st.session_state.get("documents")
index = st.session_state.get("index")
Load and index the uploaded documents once per session

ملاحظة: لتجنب إعادة معالجة المستندات ...