...
/نظام الأسئلة والأجوبة للمستندات متعدد الأدوار مع LlamaIndex
نظام الأسئلة والأجوبة للمستندات متعدد الأدوار مع LlamaIndex
تعرف على كيفية بناء مساعد محادثة يجيب على الأسئلة المتعلقة بالمستندات التي تم تحميلها باستخدام الذاكرة والاسترجاع الدلالي.
سنغطي ما يلي...
في هذا الدرس، بناء نظامًا تفاعليًا يتيح للمستخدمين تحميل مستندات PDF وطرح أسئلة باللغة الطبيعية حول محتواها. سيجمع النظام المعلومات ذات الصلة من المستندات المرفوعة، ويولد إجابات دقيقة وتفاعلية.
بالإضافة إلى الإجابة على الأسئلة الفردية، يدعم النظام التفاعلات متعددة الأدوار من خلال تذكر الاستفسارات السابقة. كما يتضمن إمكانية تلخيص مستند كامل وعرض خطوات الاستدلال الداخلي، مما يسمح للمطورين أو المستخدمين بفهم كيفية توليد كل استجابة .
يعد هذا النوع من المساعدين الذين يدركون المستندات مفيدًا في السيناريوهات الواقعية مثل مراجعة اتفاقيات الإيجار أو سياسات التأمين أو المناهج الأكاديمية أو إجراءات الشركة.
ملاحظة: يستخدم هذا التطبيق 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 stfrom llama_index.core import VectorStoreIndex, SimpleDirectoryReaderfrom llama_index.embeddings.ollama import OllamaEmbeddingfrom llama_index.llms.groq import Groqimport osimport tempfile
بعد ذلك، نُهيئ نموذج اللغة ونموذج التضمين. يُحوّل نموذج التضمين محتوى المستند إلى تمثيلات متجهية، بينما يُولّد نموذج اللغة إجابات حوارية.
# Initialize Groq LLMllm = Groq(model="llama3-70b-8192",api_key="YOUR_GROQ_API_KEY" # Replace with your actual API key)# Initialize embedding modelembedding_model = OllamaEmbedding(model_name="nomic-embed-text")
الآن، قمنا بإعداد واجهة 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")
عندما يقوم المستخدمون بتحميل الملفات وإدخال سؤال، نقوم بحفظ الملفات مؤقتًا، وتحميل المستندات، بناء فهرس المتجه، وإنشاء استجابة.
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 = docsst.session_state.index = idxdocuments = st.session_state.get("documents")index = st.session_state.get("index")
ملاحظة: لتجنب إعادة معالجة المستندات ...