Copain22 commited on
Commit
244cebc
Β·
verified Β·
1 Parent(s): 0083296

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -105
app.py CHANGED
@@ -1,112 +1,83 @@
1
  import os
2
- from pathlib import Path
 
 
 
 
 
 
 
3
 
4
- import torch
5
- import gradio as gr
6
- from huggingface_hub import login
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
- # ──────────────────── 0. Constants ────────────────────
23
- SYSTEM_PROMPT = """
24
- You are a friendly cafΓ© assistant for CafΓ© Eleven. Your job is to:
25
- 1. Greet the customer warmly
26
- 2. Help them place their order
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
- WRAPPER_PROMPT = PromptTemplate(
38
- """<s>[INST] <<SYS>>
39
- {system_prompt}
40
- Current conversation:
41
- {chat_history}
42
- <</SYS>>
43
- {query_str} [/INST]"""
44
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
- login(token=os.environ["HF_TOKEN"])
 
 
 
 
47
 
48
- # ──────────────────── 1. Documents & embeddings ────────────────────
49
- docs = SimpleDirectoryReader(
50
- input_files=[str(p) for p in Path(".").glob("*.pdf")]
51
- ).load_data()
52
 
53
- embed_model = LangchainEmbedding(
54
- HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
55
- )
56
- Settings.embed_model = embed_model
57
- Settings.chunk_size = 512
58
-
59
- index = VectorStoreIndex.from_documents(docs)
60
-
61
- # ──────────────────── 2. Chat engine setup ────────────────────
62
- _state = {"chat_engine": None}
63
-
64
- def get_chat_engine():
65
- if _state["chat_engine"] is None:
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})