Spaces:
Running
Running
File size: 4,569 Bytes
66530af 318d005 66530af 318d005 165095e 318d005 165095e f138016 |
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 |
import streamlit as st
from langchain.document_loaders import PyPDFLoader, Docx2txtLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import ConversationalRetrievalChain
from langchain.llms import OpenAI
import os
import tempfile
from doc_qa import embeddings,llm
from doc_qa_1 import embeddings,doc_qa
def start_message(doc_name):
st.success("✅ ドキュメントのアップロードが完了しました!")
st.markdown(f"### 📄 アップロードされました: `{doc_name}`")
st.markdown("これで文書に関する質問ができます。 💬")
st.markdown("例えば、次のような質問ができます。:")
st.markdown("- この文書は何について書かれていますか?")
st.markdown("- 重要なポイントを要約してください。")
st.markdown("- 著者は誰ですか?")
st.markdown("はじめるには、下に質問を入力してください。!")
# Function to load individual file
def load_file(file, suffix):
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_file:
temp_file.write(file.read())
temp_file_path = temp_file.name
if suffix == ".pdf":
loader = PyPDFLoader(temp_file_path)
elif suffix == ".docx":
loader = Docx2txtLoader(temp_file_path)
elif suffix == ".txt":
loader = TextLoader(temp_file_path)
else:
return []
return loader.load()
st.set_page_config(
page_title="QA Assistant",
page_icon="https://yourdomain.com/logo.png",
layout="centered"
)
# Title
st.title("📄 ドキュメント質問応答支援ツール")
# Step 1: Upload document
if "file_uploaded" not in st.session_state:
st.session_state.file_uploaded = False
st.markdown("""
👋 こちらへようこそ!私は文書の内容を理解するためのインテリジェントアシスタントです。
あなたは以下のことができます:
PDF、DOCX、TXTファイルをアップロード
文書の内容について質問
要約、重要ポイント、または具体的な詳細の取得
🛠️ 質問の例:
この文書は何について書かれていますか?
主要なポイントを要約してください。
著者は誰ですか?
重要な日付や締め切りは何ですか?
結論や推奨事項は何ですか?
📂 まず、1つ以上の文書をアップロードしてください。
💬 その後、下に質問を入力しましょう!
""")
if "messages" not in st.session_state:
st.session_state.messages = []
flag = 0
# Upload multiple files
with st.sidebar:
uploaded_files = st.file_uploader("PDF、DOCX、またはTXTファイルをアップロードしてください。", type=["pdf", "docx", "txt"], accept_multiple_files=True)
# Load and process documents
file_names=[]
if uploaded_files:
all_docs = []
for file in uploaded_files:
suffix = os.path.splitext(file.name)[1]
docs = load_file(file, suffix)
all_docs.extend(docs)
file_names.append(file.name)
# Split and embed documents
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
split_docs = text_splitter.split_documents(all_docs)
#embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(split_docs, embeddings)
# Setup ConversationalRetrievalChain
qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=vectorstore.as_retriever(),
return_source_documents=False
)
start_message('\n'.join(file_names))
flag = 1
# Initialize session state
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
for msg in st.session_state.messages:
st.chat_message(msg["role"]).write(msg["content"])
if flag==1:
if user_query := st.chat_input():
st.session_state.messages.append({"role": "user", "content": user_query})
with st.chat_message("user"):
st.markdown(user_query)
#st.markdown(f"**Q:** {user_query}")
result=doc_qa(user_query,vectorstore)
st.session_state.messages.append({"role": "assistant", "content": result["answer"]})
with st.chat_message("assistant"):
st.markdown(result["answer"])
st.session_state.chat_history.append((user_query, result["answer"])) |