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"]))