Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,112 +1,83 @@
|
|
1 |
import os
|
2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
try:
|
8 |
-
from langchain_huggingface import HuggingFaceEmbeddings # New recommended import
|
9 |
-
except ImportError:
|
10 |
-
# Fallback to community version if new package not available
|
11 |
-
from langchain_community.embeddings import HuggingFaceEmbeddings
|
12 |
-
from llama_index.core import (
|
13 |
-
VectorStoreIndex,
|
14 |
-
SimpleDirectoryReader,
|
15 |
-
Settings,
|
16 |
-
PromptTemplate,
|
17 |
-
)
|
18 |
-
from llama_index.core.memory import ChatMemoryBuffer
|
19 |
-
from llama_index.embeddings.langchain import LangchainEmbedding
|
20 |
-
from llama_index.llms.huggingface import HuggingFaceLLM
|
21 |
|
22 |
-
#
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
3. Ask for pickup time
|
28 |
-
4. Suggest add-ons/extras from our menu
|
29 |
-
5. Confirm the complete order
|
30 |
-
Menu items are embedded in the document. Always:
|
31 |
-
- Be polite and professional
|
32 |
-
- Confirm order details clearly
|
33 |
-
- Suggest popular combinations
|
34 |
-
- Never make up items not in our menu
|
35 |
-
"""
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
|
46 |
-
|
|
|
|
|
|
|
|
|
47 |
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
).load_data()
|
52 |
|
53 |
-
|
54 |
-
|
55 |
-
)
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
llm = HuggingFaceLLM(
|
67 |
-
tokenizer_name="meta-llama/Llama-2-7b-chat-hf",
|
68 |
-
model_name="meta-llama/Llama-2-7b-chat-hf",
|
69 |
-
context_window=3900,
|
70 |
-
max_new_tokens=256,
|
71 |
-
generate_kwargs={"temperature": 0.2, "do_sample": True},
|
72 |
-
device_map="auto",
|
73 |
-
model_kwargs={
|
74 |
-
"torch_dtype": torch.float16,
|
75 |
-
"load_in_4bit": True,
|
76 |
-
"token": os.environ["HF_TOKEN"],
|
77 |
-
},
|
78 |
-
system_prompt=SYSTEM_PROMPT,
|
79 |
-
query_wrapper_prompt=WRAPPER_PROMPT,
|
80 |
-
)
|
81 |
-
Settings.llm = llm
|
82 |
-
|
83 |
-
memory = ChatMemoryBuffer.from_defaults(token_limit=2000)
|
84 |
-
_state["chat_engine"] = index.as_chat_engine(
|
85 |
-
chat_mode="condense_plus_context",
|
86 |
-
memory=memory,
|
87 |
-
system_prompt=SYSTEM_PROMPT,
|
88 |
-
)
|
89 |
-
return _state["chat_engine"]
|
90 |
-
|
91 |
-
# ββββββββββββββββββββ 3. Gradio UI ββββββββββββββββββββ
|
92 |
-
with gr.Blocks(title="CafΓ© Eleven Chat") as demo:
|
93 |
-
gr.Markdown("## β CafΓ© Eleven Ordering Assistant")
|
94 |
-
chatbot = gr.Chatbot(height=500, type="messages") # Fixed warning
|
95 |
-
user_in = gr.Textbox(placeholder="Hi, I'd like a latte...", label="Your order")
|
96 |
-
clear = gr.Button("Clear Chat")
|
97 |
-
|
98 |
-
def respond(message, chat_history):
|
99 |
-
if message.lower().strip() in {"quit", "exit", "done"}:
|
100 |
-
return "Thank you for your order! We'll see you soon.", chat_history
|
101 |
-
|
102 |
-
engine = get_chat_engine()
|
103 |
-
reply = engine.chat(message).response
|
104 |
-
chat_history.append((message, reply))
|
105 |
-
return "", chat_history
|
106 |
-
|
107 |
-
user_in.submit(respond, [user_in, chatbot], [user_in, chatbot])
|
108 |
-
clear.click(lambda: None, None, chatbot, queue=False)
|
109 |
-
|
110 |
-
# ββββββββββββββββββββ 4. Launch ββββββββββββββββββββ
|
111 |
-
if __name__ == "__main__":
|
112 |
-
demo.queue(default_concurrency_limit=3).launch(server_name="0.0.0.0")
|
|
|
1 |
import os
|
2 |
+
import streamlit as st
|
3 |
+
from langchain_community.embeddings import HuggingFaceEmbeddings
|
4 |
+
from langchain_community.vectorstores import FAISS
|
5 |
+
from langchain.chains import ConversationalRetrievalChain
|
6 |
+
from langchain_community.llms import HuggingFaceHub
|
7 |
+
from langchain.memory import ConversationBufferMemory
|
8 |
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
9 |
+
from langchain_community.document_loaders import PyMuPDFLoader
|
10 |
|
11 |
+
# ββββββββββββββββββββ 1. Setup ββββββββββββββββββββ
|
12 |
+
st.title("β CafΓ© Eleven Ordering Assistant")
|
13 |
+
st.caption("Powered by LangChain & Streamlit")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
+
# Load documents
|
16 |
+
@st.cache_resource
|
17 |
+
def load_docs():
|
18 |
+
loader = PyMuPDFLoader("menu.pdf") # Change to your PDF filename
|
19 |
+
return loader.load()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
|
21 |
+
# Initialize components
|
22 |
+
@st.cache_resource
|
23 |
+
def init_chain():
|
24 |
+
# Embeddings
|
25 |
+
embeddings = HuggingFaceEmbeddings(
|
26 |
+
model_name="sentence-transformers/all-mpnet-base-v2"
|
27 |
+
)
|
28 |
+
|
29 |
+
# Text splitting
|
30 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
|
31 |
+
documents = text_splitter.split_documents(load_docs())
|
32 |
+
|
33 |
+
# Vectorstore
|
34 |
+
vectorstore = FAISS.from_documents(documents, embeddings)
|
35 |
+
|
36 |
+
# LLM (using free inference API)
|
37 |
+
llm = HuggingFaceHub(
|
38 |
+
repo_id="meta-llama/Llama-2-7b-chat-hf",
|
39 |
+
huggingfacehub_api_token=os.environ["HF_TOKEN"],
|
40 |
+
model_kwargs={
|
41 |
+
"temperature": 0.2,
|
42 |
+
"max_new_tokens": 256
|
43 |
+
}
|
44 |
+
)
|
45 |
+
|
46 |
+
# Memory
|
47 |
+
memory = ConversationBufferMemory(
|
48 |
+
memory_key="chat_history",
|
49 |
+
return_messages=True,
|
50 |
+
output_key='answer'
|
51 |
+
)
|
52 |
+
|
53 |
+
# Chain
|
54 |
+
return ConversationalRetrievalChain.from_llm(
|
55 |
+
llm=llm,
|
56 |
+
retriever=vectorstore.as_retriever(),
|
57 |
+
memory=memory,
|
58 |
+
return_source_documents=True
|
59 |
+
)
|
60 |
|
61 |
+
# ββββββββββββββββββββ 2. Chat Interface ββββββββββββββββββββ
|
62 |
+
if "messages" not in st.session_state:
|
63 |
+
st.session_state.messages = [
|
64 |
+
{"role": "assistant", "content": "Hi! Welcome to CafΓ© Eleven. What would you like to order today?"}
|
65 |
+
]
|
66 |
|
67 |
+
for message in st.session_state.messages:
|
68 |
+
with st.chat_message(message["role"]):
|
69 |
+
st.markdown(message["content"])
|
|
|
70 |
|
71 |
+
if prompt := st.chat_input("Your order..."):
|
72 |
+
st.session_state.messages.append({"role": "user", "content": prompt})
|
73 |
+
with st.chat_message("user"):
|
74 |
+
st.markdown(prompt)
|
75 |
+
|
76 |
+
with st.chat_message("assistant"):
|
77 |
+
chain = init_chain()
|
78 |
+
result = chain({"question": prompt})
|
79 |
+
response = result["answer"]
|
80 |
+
|
81 |
+
# Display response
|
82 |
+
st.markdown(response)
|
83 |
+
st.session_state.messages.append({"role": "assistant", "content": response})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|