candenizkocak commited on
Commit
06f5b76
·
1 Parent(s): 3f6f5e2

app and requirements file uploaded

Browse files
Files changed (2) hide show
  1. app.py +138 -0
  2. requirements.txt +6 -0
app.py CHANGED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import uuid
3
+ from typing import Sequence
4
+
5
+ from langchain.chains import create_history_aware_retriever, create_retrieval_chain
6
+ from langchain.chains.combine_documents import create_stuff_documents_chain
7
+ from langchain_community.document_loaders import TextLoader
8
+ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
9
+ from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
10
+ from langchain_core.vectorstores import InMemoryVectorStore
11
+
12
+ from langchain_groq import ChatGroq
13
+ from langchain_huggingface import HuggingFaceEmbeddings
14
+
15
+ from langchain_text_splitters import RecursiveCharacterTextSplitter
16
+ from langgraph.checkpoint.memory import MemorySaver
17
+ from langgraph.graph import START, StateGraph
18
+ from langgraph.graph.message import add_messages
19
+ from typing_extensions import Annotated, TypedDict
20
+
21
+ import os
22
+ GROQ_API_KEY = os.getenv("GROQ_API_KEY")
23
+
24
+ llm = ChatGroq(model="llama-3.2-11b-text-preview", api_key=GROQ_API_KEY, temperature=0)
25
+
26
+ loader = TextLoader("stj.txt")
27
+ loader.load()
28
+ docs = loader.load()
29
+
30
+ model_name = "sentence-transformers/all-MiniLM-L6-v2"
31
+ model_kwargs = {'device': 'cpu'}
32
+ encode_kwargs = {'normalize_embeddings': False}
33
+ hf = HuggingFaceEmbeddings(
34
+ model_name=model_name,
35
+ model_kwargs=model_kwargs,
36
+ encode_kwargs=encode_kwargs
37
+ )
38
+
39
+ text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
40
+ splits = text_splitter.split_documents(docs)
41
+ vectorstore = InMemoryVectorStore.from_documents(
42
+ documents=splits, embedding=hf
43
+ )
44
+ retriever = vectorstore.as_retriever()
45
+
46
+ contextualize_q_system_prompt = (
47
+ "Sohbet geçmişi ve en son kullanıcı sorusu verilirse, sohbet geçmişine atıfta bulunabilecek en son kullanıcı sorusunu, sohbet geçmişi olmadan anlaşılabilecek bağımsız bir soru haline getirin. Soruyu yanıtlamayın, sadece yeniden düzenleyin ve gerekirse geri döndürün."
48
+ )
49
+ contextualize_q_prompt = ChatPromptTemplate.from_messages(
50
+ [
51
+ ("system", contextualize_q_system_prompt),
52
+ MessagesPlaceholder("chat_history"),
53
+ ("human", "{input}"),
54
+ ]
55
+ )
56
+ history_aware_retriever = create_history_aware_retriever(
57
+ llm, retriever, contextualize_q_prompt
58
+ )
59
+
60
+ system_prompt = (
61
+ "Soru-cevap görevleri için bir asistansın. Soruyu yanıtlamak için alınan aşağıdaki bağlam parçalarını kullan. Cevabı bilmiyorsan, bilmiyorum de. Cevabı üç cümleyle sınırla ve kısa tut."
62
+ "\n\n"
63
+ "{context}"
64
+ )
65
+ qa_prompt = ChatPromptTemplate.from_messages(
66
+ [
67
+ ("system", system_prompt),
68
+ MessagesPlaceholder("chat_history"),
69
+ ("human", "{input}"),
70
+ ]
71
+ )
72
+ question_answer_chain = create_stuff_documents_chain(llm, qa_prompt)
73
+
74
+ rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)
75
+
76
+ class State(TypedDict):
77
+ input: str
78
+ chat_history: Annotated[Sequence[BaseMessage], add_messages]
79
+ context: str
80
+ answer: str
81
+
82
+ def call_model(state: State):
83
+ response = rag_chain.invoke(state)
84
+ return {
85
+ "chat_history": [
86
+ HumanMessage(state["input"]),
87
+ AIMessage(response["answer"]),
88
+ ],
89
+ "context": response["context"],
90
+ "answer": response["answer"],
91
+ }
92
+
93
+ workflow = StateGraph(state_schema=State)
94
+ workflow.add_edge(START, "model")
95
+ workflow.add_node("model", call_model)
96
+
97
+ memory = MemorySaver()
98
+ app = workflow.compile(checkpointer=memory)
99
+
100
+ def rag_response(user_input, chat_history, thread_id):
101
+ config = {"configurable": {"thread_id": thread_id}}
102
+
103
+ state = {
104
+ "input": user_input,
105
+ "chat_history": [msg[0] for msg in chat_history]
106
+ }
107
+
108
+ result = app.invoke(state, config=config)
109
+
110
+ chat_history.append((user_input, result["answer"]))
111
+
112
+ return "", chat_history
113
+
114
+ def acknowledge_disclaimer():
115
+ thread_id = str(uuid.uuid4())
116
+ return gr.update(visible=False), gr.update(visible=False), thread_id
117
+
118
+ with gr.Blocks() as demo:
119
+
120
+ disclaimer_message = gr.Markdown(
121
+ "**⚠️ Uyarı:** Büyük dil modelleri [halüsinasyon](https://en.wikipedia.org/wiki/Hallucination_(artificial_intelligence)) sebebi ile yanlış cevaplar verebilir. Lütfen aldığınız cevapları uygulamadan önce doğrulayınız.\nBu demo resmi olarak Işık Üniversitesini temsil **etmemektedir.**",
122
+ visible=True
123
+ )
124
+ ok_button = gr.Button("OK", visible=True)
125
+
126
+ chatbox = gr.Chatbot(label="Sohbet Geçmişi", visible=False)
127
+ user_input = gr.Textbox(placeholder="Soru", label="Kullanıcı Soru Alanı", visible=False)
128
+ submit_button = gr.Button("Submit", visible=False)
129
+
130
+ thread_id_component = gr.State()
131
+
132
+ ok_button.click(acknowledge_disclaimer, outputs=[disclaimer_message, ok_button, thread_id_component])
133
+
134
+ submit_button.click(rag_response, inputs=[user_input, chatbox, thread_id_component], outputs=[user_input, chatbox])
135
+
136
+ ok_button.click(lambda: [gr.update(visible=True)] * 3, outputs=[chatbox, user_input, submit_button])
137
+
138
+ demo.launch()
requirements.txt CHANGED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ langchain==0.3.4
2
+ langchain-community==0.3.3
3
+ sentence-transformers==3.2.0
4
+ langchain-huggingface==0.1.0
5
+ langgraph==0.2.39
6
+ langchain-groq==0.2.0