felix-weiland commited on
Commit
31472b6
·
0 Parent(s):

Duplicate from felix-weiland/dn

Browse files
.gitattributes ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tflite filter=lfs diff=lfs merge=lfs -text
29
+ *.tgz filter=lfs diff=lfs merge=lfs -text
30
+ *.wasm filter=lfs diff=lfs merge=lfs -text
31
+ *.xz filter=lfs diff=lfs merge=lfs -text
32
+ *.zip filter=lfs diff=lfs merge=lfs -text
33
+ *.zst filter=lfs diff=lfs merge=lfs -text
34
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Dn
3
+ emoji: 📚
4
+ colorFrom: red
5
+ colorTo: green
6
+ sdk: streamlit
7
+ sdk_version: 1.21.0
8
+ app_file: app.py
9
+ pinned: false
10
+ duplicated_from: felix-weiland/dn
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass
2
+ from typing import Literal
3
+ import streamlit as st
4
+ from langchain.chat_models import ChatOpenAI
5
+ from langchain.embeddings.openai import OpenAIEmbeddings
6
+ from langchain.text_splitter import CharacterTextSplitter
7
+ from langchain.vectorstores import Chroma
8
+ from langchain.document_loaders.csv_loader import CSVLoader
9
+ from langchain.callbacks import get_openai_callback
10
+ from langchain.chains import ConversationChain
11
+ from langchain.chains.conversation.memory import ConversationSummaryMemory
12
+ from langchain.memory import ConversationBufferMemory
13
+ from langchain.chains import ConversationalRetrievalChain
14
+ import streamlit.components.v1 as components
15
+ import os
16
+ from langchain.chains import LLMChain
17
+ from langchain.chains.question_answering import load_qa_chain
18
+ from langchain.chains.conversational_retrieval.prompts import CONDENSE_QUESTION_PROMPT
19
+
20
+ @dataclass
21
+ class Message:
22
+ """Class for keeping track of a chat message."""
23
+ origin: Literal["human", "ai"]
24
+ message: str
25
+
26
+ def load_css():
27
+ with open("static/styles.css", "r") as f:
28
+ css = f"<style>{f.read()}</style>"
29
+ st.markdown(css, unsafe_allow_html=True)
30
+
31
+ @st.cache_resource()
32
+ def load_index():
33
+ loader = CSVLoader(file_path='dagens_nyheter_new.csv')
34
+ doc = loader.load()
35
+ text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
36
+ docs = text_splitter.split_documents(doc)
37
+ embeddings = OpenAIEmbeddings()
38
+ docsearch = Chroma.from_documents(docs, embeddings)
39
+
40
+ return docsearch
41
+
42
+ vectorstore = load_index()
43
+
44
+ def initialize_session_state():
45
+ if "history" not in st.session_state:
46
+ st.session_state.history = []
47
+
48
+ if "token_count" not in st.session_state:
49
+ st.session_state.token_count = 0
50
+
51
+ if "conversation" not in st.session_state:
52
+
53
+ memory = ConversationSummaryMemory(
54
+ llm=ChatOpenAI(temperature=0, model='gpt-3.5-turbo-0613'),
55
+ memory_key="chat_history",
56
+ return_messages=True
57
+ )
58
+
59
+ question_generator = LLMChain(
60
+ llm=ChatOpenAI(temperature=0, model="gpt-4"),
61
+ prompt=CONDENSE_QUESTION_PROMPT
62
+ )
63
+
64
+ doc_chain = load_qa_chain(
65
+ ChatOpenAI(temperature=0, model='gpt-3.5-turbo-16k'),
66
+ chain_type="stuff"
67
+ )
68
+
69
+ st.session_state.conversation = ConversationalRetrievalChain(
70
+ retriever=vectorstore.as_retriever(search_kwargs=dict(k=50)),
71
+ question_generator=question_generator,
72
+ combine_docs_chain=doc_chain,
73
+ memory=memory
74
+ )
75
+
76
+ def on_click_callback():
77
+
78
+ with get_openai_callback() as cb:
79
+ human_prompt = st.session_state.human_prompt
80
+ llm_response = st.session_state.conversation.run(
81
+ {"question": human_prompt}
82
+ )
83
+ st.session_state.history.append(
84
+ Message("human", human_prompt)
85
+ )
86
+ st.session_state.history.append(
87
+ Message("ai", llm_response)
88
+ )
89
+ st.session_state.token_count += cb.total_tokens
90
+
91
+ # Reset the user input to empty string after sending the message
92
+ st.session_state.human_prompt = ""
93
+
94
+ load_css()
95
+ initialize_session_state()
96
+
97
+ st.title("Dagens Nyheter Reviews")
98
+
99
+ chat_placeholder = st.container()
100
+ prompt_placeholder = st.form("chat-form")
101
+ credit_card_placeholder = st.empty()
102
+
103
+ with chat_placeholder:
104
+ for chat in st.session_state.history:
105
+ div = f"""
106
+ <div class="chat-row
107
+ {'' if chat.origin == 'ai' else 'row-reverse'}">
108
+ <img class="chat-icon" src="https://huggingface.co/spaces/felix-weiland/dn/resolve/main/static/{
109
+ 'ai_icon.png' if chat.origin == 'ai'
110
+ else 'user_icon.png'}"
111
+ width=32 height=32>
112
+ <div class="chat-bubble
113
+ {'ai-bubble' if chat.origin == 'ai' else 'human-bubble'}">
114
+ &#8203;{chat.message}
115
+ </div>
116
+ </div>
117
+ """
118
+ st.markdown(div, unsafe_allow_html=True)
119
+
120
+ for _ in range(3):
121
+ st.markdown("")
122
+
123
+ with prompt_placeholder:
124
+ st.markdown("**Chat**")
125
+ cols = st.columns((6, 1))
126
+ cols[0].text_input(
127
+ "Chat",
128
+ value="",
129
+ label_visibility="collapsed",
130
+ key="human_prompt",
131
+ )
132
+ cols[1].form_submit_button(
133
+ "Submit",
134
+ type="primary",
135
+ on_click=on_click_callback,
136
+ )
137
+
138
+
139
+ credit_card_placeholder.caption(f"""
140
+ Used {st.session_state.token_count} tokens \n
141
+ Debug Langchain conversation:
142
+ {st.session_state.conversation.memory.buffer}
143
+ """)
144
+
145
+ components.html("""
146
+ <script>
147
+ const streamlitDoc = window.parent.document;
148
+ const buttons = Array.from(
149
+ streamlitDoc.querySelectorAll('.stButton > button')
150
+ );
151
+ const submitButton = buttons.find(
152
+ el => el.innerText === 'Submit'
153
+ );
154
+ streamlitDoc.addEventListener('keydown', function(e) {
155
+ switch (e.key) {
156
+ case 'Enter':
157
+ submitButton.click();
158
+ break;
159
+ }
160
+ });
161
+ </script>
162
+ """,
163
+ height=0,
164
+ width=0,
165
+ )
dagens_nyheter_new.csv ADDED
The diff for this file is too large to render. See raw diff
 
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ altair==4.2.0
2
+ chromadb==0.3.22
3
+ langchain==0.0.198
4
+ langchainplus-sdk==0.0.9
5
+ openai==0.27.2
6
+ pandas==2.0.2
7
+ tiktoken==0.3.1
static/ai_icon.png ADDED
static/styles.css ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .chat-row {
2
+ display: flex;
3
+ margin: 5px;
4
+ width: 100%;
5
+ }
6
+
7
+ .row-reverse {
8
+ flex-direction: row-reverse;
9
+ }
10
+
11
+ .chat-bubble {
12
+ font-family: "Source Sans Pro", sans-serif, "Segoe UI", "Roboto", sans-serif;
13
+ border: 1px solid transparent;
14
+ padding: 5px 10px;
15
+ margin: 0px 7px;
16
+ max-width: 70%;
17
+ }
18
+
19
+ .ai-bubble {
20
+ background: rgb(240, 242, 246);
21
+ border-radius: 10px;
22
+ }
23
+
24
+ .human-bubble {
25
+ background: rgb(0, 106, 255);
26
+ color: white;
27
+ border-radius: 20px;
28
+ }
29
+
30
+ .chat-icon {
31
+ border-radius: 5px;
32
+ }
static/user_icon.png ADDED