dayuan commited on
Commit
64a9585
·
1 Parent(s): b95b9dc

first commit

Browse files
app.py ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Dict
2
+
3
+ import streamlit as st
4
+ import pickle
5
+ from langchain import OpenAI
6
+ from langchain.prompts import PromptTemplate
7
+ import os
8
+
9
+ from langchain import OpenAI
10
+ from langchain.chains.qa_with_sources import load_qa_with_sources_chain
11
+
12
+
13
+ with open("data/key.txt") as f:
14
+ openai_key = f.read().strip()
15
+ os.environ["OPENAI_API_KEY"] = openai_key
16
+
17
+ @st.cache
18
+ def get_docstore():
19
+ with open("data/acn_homepage_faiss_store_1000_tokens.pickle", "rb") as f:
20
+ store = pickle.load(f)
21
+ return store
22
+
23
+
24
+ def init_chain():
25
+ question_prompt_template = """長い文書の次の部分を使って、質問に答えるために関連するテキストがあるかどうかを確認します。
26
+ 関連するテキストがあれば、そのテキストを返す。なかったら、「関連情報なし」と返さないてください。
27
+
28
+ {context}
29
+
30
+ 質問: {question}
31
+ 関連するテキスト:"""
32
+ QUESTION_PROMPT = PromptTemplate(
33
+ template=question_prompt_template, input_variables=["context", "question"]
34
+ )
35
+
36
+ combine_prompt_template = """
37
+ あなたは、アクセンチュアのAIアシスタントです。
38
+ あなたには、以下のような長いドキュメントの抜粋部分と質問が与えられています。
39
+ 提供されたテキストを参考して人間と会話するように答えてください。
40
+ 提供されたテキストに根拠がない場合は、わからないと答えなさい。答えを捏造しないでください。
41
+ =========
42
+ テキスト:{summaries}
43
+ =========
44
+ 質問: {question}
45
+ =========
46
+ 答案:"""
47
+ COMBINE_PROMPT = PromptTemplate(
48
+ template=combine_prompt_template, input_variables=["summaries", "question"]
49
+ )
50
+
51
+ chain = load_qa_with_sources_chain(OpenAI(temperature=0),
52
+ chain_type="map_reduce",
53
+ return_intermediate_steps=True,
54
+ question_prompt=QUESTION_PROMPT,
55
+ combine_prompt=COMBINE_PROMPT,
56
+ verbose=True
57
+ )
58
+ return chain
59
+
60
+ # format the result to markdown format
61
+ def format_result_to_markdown(result: dict):
62
+ result_markdown = "# Source \n"
63
+ result_markdown += f"""
64
+ # Answer
65
+ {result["output_text"].strip()}
66
+ """
67
+ for i, intermediate_step in enumerate(result["intermediate_steps"]):
68
+ link = result["input_documents"][i].metadata["source"]
69
+ result_markdown += f"""
70
+ **Link**: {link}
71
+ **Extracted Information**: {intermediate_step}
72
+ """
73
+
74
+ return result_markdown
75
+
76
+ if __name__ == "__main__":
77
+ st.title("ACN AIアシスタント(超爆速版※)")
78
+ st.subheader("質問に答えるために関連するテキストを検索します。")
79
+ st.text("※超爆速とは、開発スピードを指しています。Botの反応速度ではありません。")
80
+ st.markdown(
81
+ """
82
+ ## 質問の例:
83
+ - アクセンチュアのAI領域のリーダは誰ですか?
84
+ - アクセンチュアのCEOは誰ですか?
85
+ - アクセンチュアの社長は誰ですか?
86
+ - アクセンチュアの事業内容は?
87
+ - アクセンチュアの事業所在地は?
88
+ - アクセンチュア社員の有給は何日ありますか?
89
+ """
90
+ )
91
+ docsearch = get_docstore()
92
+ chain = init_chain()
93
+ question = st.text_input("質問を入力してください", "")
94
+
95
+ answer_slot = st.empty()
96
+ with st.spinner("答案を検索中..."):
97
+ if st.button("Submit"):
98
+ try:
99
+ query = question.strip()
100
+ docs = docsearch.similarity_search(query, k=3)
101
+ result = chain(
102
+ {"input_documents": docs, "question": query},
103
+ )
104
+ answer_slot.markdown(format_result_to_markdown(result))
105
+ except Exception as e:
106
+ st.write(e)
data/acn_homepage_faiss_store_1000_tokens.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eeebf41460e484e4129f8a4cebd866ec5e44545d6fd4ac207a3a1ecea34e6d28
3
+ size 15033620
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ langchain==0.0.58
2
+ openai
3
+ faiss-cpu
4
+ streamlit
5
+ streamlit-chat