M17idd commited on
Commit
6997dfd
·
verified ·
1 Parent(s): 9138bf0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -9
app.py CHANGED
@@ -1,12 +1,11 @@
1
  import os
2
  import time
3
  import streamlit as st
 
4
  from groq import Groq
5
  from langchain.document_loaders import PyPDFLoader
6
  from langchain.text_splitter import RecursiveCharacterTextSplitter
7
  from langchain.schema import Document as LangchainDocument
8
- from langchain.vectorstores import FAISS
9
- from langchain.embeddings import HuggingFaceEmbeddings
10
  from langchain.chains import RetrievalQA
11
  from langchain.llms import OpenAI
12
 
@@ -18,6 +17,9 @@ st.set_page_config(page_title="چت‌بات ارتش - فقط از PDF", page_i
18
  # ----------------- تعریف کلید API -----------------
19
  groq_api_key = "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"
20
 
 
 
 
21
  # ----------------- لود PDF و ساخت ایندکس -----------------
22
  @st.cache_resource
23
  def build_pdf_index():
@@ -38,15 +40,17 @@ def build_pdf_index():
38
  # تبدیل به Document
39
  documents = [LangchainDocument(page_content=t) for t in texts]
40
 
41
- # استفاده از HuggingFaceEmbedding محلی برای FAISS
42
- embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
43
-
44
- vectordb = FAISS.from_documents(documents, embedding=embeddings)
 
45
 
46
- return vectordb
 
47
 
48
  # ----------------- ساختن Index از PDF -----------------
49
- index = build_pdf_index()
50
 
51
  # ----------------- تعریف LLM Groq -----------------
52
  client = Groq(api_key=groq_api_key)
@@ -57,10 +61,31 @@ class GroqLLM(OpenAI):
57
 
58
  llm = GroqLLM(api_key=groq_api_key, model_name="deepseek-r1-distill-llama-70b")
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  # ----------------- Retrieval Chain -----------------
61
  chain = RetrievalQA.from_chain_type(
62
  llm=llm,
63
- retriever=index.as_retriever(),
64
  chain_type="stuff",
65
  input_key="question"
66
  )
 
1
  import os
2
  import time
3
  import streamlit as st
4
+ import spacy
5
  from groq import Groq
6
  from langchain.document_loaders import PyPDFLoader
7
  from langchain.text_splitter import RecursiveCharacterTextSplitter
8
  from langchain.schema import Document as LangchainDocument
 
 
9
  from langchain.chains import RetrievalQA
10
  from langchain.llms import OpenAI
11
 
 
17
  # ----------------- تعریف کلید API -----------------
18
  groq_api_key = "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"
19
 
20
+ # ----------------- بارگذاری مدل spaCy برای امبدینگ -----------------
21
+ nlp = spacy.load("en_core_web_md") # یا 'en_core_web_lg' برای مدل بزرگتر
22
+
23
  # ----------------- لود PDF و ساخت ایندکس -----------------
24
  @st.cache_resource
25
  def build_pdf_index():
 
40
  # تبدیل به Document
41
  documents = [LangchainDocument(page_content=t) for t in texts]
42
 
43
+ # استفاده از spaCy برای تولید امبدینگ
44
+ embeddings = []
45
+ for doc in documents:
46
+ spacy_doc = nlp(doc.page_content) # تبدیل متن به شیء spaCy
47
+ embeddings.append(spacy_doc.vector) # استخراج امبدینگ از spaCy
48
 
49
+ # به جای FAISS، فقط لیست امبدینگ‌ها را برمی‌گردانیم
50
+ return documents, embeddings
51
 
52
  # ----------------- ساختن Index از PDF -----------------
53
+ documents, embeddings = build_pdf_index()
54
 
55
  # ----------------- تعریف LLM Groq -----------------
56
  client = Groq(api_key=groq_api_key)
 
61
 
62
  llm = GroqLLM(api_key=groq_api_key, model_name="deepseek-r1-distill-llama-70b")
63
 
64
+ # ----------------- Retrieval Chain -----------------
65
+ # به جای استفاده از FAISS، اکنون از لیست امبدینگ‌ها استفاده می‌کنیم
66
+ class SimpleRetriever:
67
+ def __init__(self, documents, embeddings):
68
+ self.documents = documents
69
+ self.embeddings = embeddings
70
+
71
+ def retrieve(self, query, top_k=1):
72
+ query_embedding = nlp(query).vector # تبدیل سوال به امبدینگ با استفاده از spaCy
73
+ similarities = []
74
+ for doc_embedding in self.embeddings:
75
+ similarity = query_embedding.dot(doc_embedding) # محاسبه شباهت بین امبدینگ‌ها
76
+ similarities.append(similarity)
77
+
78
+ # یافتن مستندات مشابه بر اساس بیشترین شباهت
79
+ ranked_docs = sorted(zip(similarities, self.documents), reverse=True)
80
+ return [doc for _, doc in ranked_docs[:top_k]]
81
+
82
+ # استفاده از retriever ساده برای جستجو در امبدینگ‌ها
83
+ retriever = SimpleRetriever(documents, embeddings)
84
+
85
  # ----------------- Retrieval Chain -----------------
86
  chain = RetrievalQA.from_chain_type(
87
  llm=llm,
88
+ retriever=retriever.retrieve, # استفاده از متد retrieve
89
  chain_type="stuff",
90
  input_key="question"
91
  )