Update app.py
Browse files
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 |
-
# استفاده از
|
42 |
-
embeddings =
|
43 |
-
|
44 |
-
|
|
|
45 |
|
46 |
-
|
|
|
47 |
|
48 |
# ----------------- ساختن Index از PDF -----------------
|
49 |
-
|
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=
|
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 |
)
|