import streamlit as st from llama_index.core import StorageContext, load_index_from_storage, VectorStoreIndex, SimpleDirectoryReader, ChatPromptTemplate from llama_index.llms.huggingface import HuggingFaceInferenceAPI from dotenv import load_dotenv from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core import Settings import os import base64 # Load environment variables load_dotenv() # Configure the Llama index settings Settings.llm = HuggingFaceInferenceAPI( model_name="google/gemma-1.1-7b-it", tokenizer_name="google/gemma-1.1-7b-it", context_window=3900, token=os.getenv("HF_TOKEN"), max_new_tokens=1000, generate_kwargs={"temperature": 0.1}, ) Settings.embed_model = HuggingFaceEmbedding( model_name="BAAI/bge-small-en-v1.5" ) # Define the directory for persistent storage and data PERSIST_DIR = "./db" DATA_DIR = "data" # Ensure data directory exists os.makedirs(DATA_DIR, exist_ok=True) os.makedirs(PERSIST_DIR, exist_ok=True) def displayPDF(file): with open(file, "rb") as f: base64_pdf = base64.b64encode(f.read()).decode('utf-8') pdf_display = f'' st.markdown(pdf_display, unsafe_allow_html=True) def data_ingestion(): documents = SimpleDirectoryReader(DATA_DIR).load_data() storage_context = StorageContext.from_defaults() index = VectorStoreIndex.from_documents(documents) index.storage_context.persist(persist_dir=PERSIST_DIR) def handle_query(query): storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR) index = load_index_from_storage(storage_context) chat_text_qa_msgs = [ ( "user", """You are a Q&A assistant named CHATTO, created by Hao. You have a specific response programmed for when users specifically ask about your creator, Hao. The response is: "I was created by Hao, an enthusiast in Artificial Intelligence. He is dedicated to solving complex problems and delivering innovative solutions. With a strong focus on machine learning, deep learning, Python, generative AI, NLP, and computer vision, Hao is passionate about pushing the boundaries of AI to explore new possibilities." For all other inquiries, your main goal is to provide answers as accurately as possible, based on the instructions and context you have been given. If a question does not match the provided context or is outside the scope of the document, kindly advise the user to ask questions within the context of the document. Context: {context_str} Question: {query_str} """ ) ] text_qa_template = ChatPromptTemplate.from_messages(chat_text_qa_msgs) query_engine = index.as_query_engine(text_qa_template=text_qa_template) answer = query_engine.query(query) if hasattr(answer, 'response'): return answer.response elif isinstance(answer, dict) and 'response' in answer: return answer['response'] else: return "抱歉,我找不到答案。" # Streamlit app initialization st.title("与您的PDF聊天 🦜📄") st.markdown("在这里聊天👇") if 'messages' not in st.session_state: st.session_state.messages = [{'role': 'assistant', "content": '你好啊!上传一个PDF,并询问我有关其内容的任何信息。'}] with st.sidebar: st.title("上传PDF:") uploaded_file = st.file_uploader("上传您的PDF文件并点击提交&处理按钮") if st.button("提交"): with st.spinner("处理中..."): filepath = "data/saved_pdf.pdf" with open(filepath, "wb") as f: f.write(uploaded_file.getbuffer()) # displayPDF(filepath) # Display the uploaded PDF data_ingestion() # Process PDF every time new file is uploaded st.success("Done") user_prompt = st.chat_input("问我关于PDF的内容:") if user_prompt: st.session_state.messages.append({'role': 'user', "content": user_prompt}) response = handle_query(user_prompt) st.session_state.messages.append({'role': 'assistant', "content": response}) for message in st.session_state.messages: with st.chat_message(message['role']): st.write(message['content'])