File size: 4,807 Bytes
06f5b76
 
 
 
 
 
 
 
 
 
 
3a7955a
 
06f5b76
 
 
 
 
 
 
3a7955a
06f5b76
3a7955a
06f5b76
3a7955a
06f5b76
 
 
 
 
3a7955a
06f5b76
 
 
 
3a7955a
06f5b76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18e1152
b010baa
06f5b76
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import gradio as gr
import uuid
from typing import Sequence

from langchain.chains import create_history_aware_retriever, create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.document_loaders import TextLoader
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.vectorstores import InMemoryVectorStore

from langchain_cohere import ChatCohere
from langchain_cohere import CohereEmbeddings

from langchain_text_splitters import RecursiveCharacterTextSplitter
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, StateGraph
from langgraph.graph.message import add_messages
from typing_extensions import Annotated, TypedDict


import os
COHERE_API_KEY = os.getenv("COHERE_API_KEY")

llm = ChatCohere(model="c4ai-aya-expanse-32b", cohere_api_key=COHERE_API_KEY, temperature=0)

loader = TextLoader("stj.txt")
loader.load()
docs = loader.load()

embeddings = CohereEmbeddings(model="embed-multilingual-v3.0",cohere_api_key=COHERE_API_KEY)

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = InMemoryVectorStore.from_documents(
    documents=splits, embedding=embeddings
)
retriever = vectorstore.as_retriever()

contextualize_q_system_prompt = (
    "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."
)
contextualize_q_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_q_system_prompt),
        MessagesPlaceholder("chat_history"),
        ("human", "{input}"),
    ]
)
history_aware_retriever = create_history_aware_retriever(
    llm, retriever, contextualize_q_prompt
)

system_prompt = (
    "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."
    "\n\n"
    "{context}"
)
qa_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        MessagesPlaceholder("chat_history"),
        ("human", "{input}"),
    ]
)
question_answer_chain = create_stuff_documents_chain(llm, qa_prompt)

rag_chain = create_retrieval_chain(history_aware_retriever, question_answer_chain)

class State(TypedDict):
    input: str
    chat_history: Annotated[Sequence[BaseMessage], add_messages]
    context: str
    answer: str

def call_model(state: State):
    response = rag_chain.invoke(state)
    return {
        "chat_history": [
            HumanMessage(state["input"]),
            AIMessage(response["answer"]),
        ],
        "context": response["context"],
        "answer": response["answer"],
    }

workflow = StateGraph(state_schema=State)
workflow.add_edge(START, "model")
workflow.add_node("model", call_model)

memory = MemorySaver()
app = workflow.compile(checkpointer=memory)

def rag_response(user_input, chat_history, thread_id):
    config = {"configurable": {"thread_id": thread_id}}

    state = {
        "input": user_input,
        "chat_history": [msg[0] for msg in chat_history]
    }

    result = app.invoke(state, config=config)

    chat_history.append((user_input, result["answer"]))

    return "", chat_history

def acknowledge_disclaimer():
    thread_id = str(uuid.uuid4())
    return gr.update(visible=False), gr.update(visible=False), thread_id

with gr.Blocks() as demo:
    
    disclaimer_message = gr.Markdown(
        "**⚠️ 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.**",
        visible=True
    )
    ok_button = gr.Button("OK", visible=True)
    
    chatbox = gr.Chatbot(label="Sohbet Geçmişi", visible=False)
    user_input = gr.Textbox(placeholder="Soru", label="Kullanıcı Soru Alanı", visible=False)
    submit_button = gr.Button("Gönder", visible=False)
    
    thread_id_component = gr.State()

    ok_button.click(acknowledge_disclaimer, outputs=[disclaimer_message, ok_button, thread_id_component])

    submit_button.click(rag_response, inputs=[user_input, chatbox, thread_id_component], outputs=[user_input, chatbox])

    ok_button.click(lambda: [gr.update(visible=True)] * 3, outputs=[chatbox, user_input, submit_button])

demo.launch()