docchat
Browse files- llm.py +15 -1
- notebook.py +30 -2
- notebook_helpers.py +34 -0
- prompts.py +19 -0
llm.py
CHANGED
@@ -166,12 +166,26 @@ who_are_you()
|
|
166 |
|
167 |
|
168 |
|
169 |
-
from prompts import summary_template
|
170 |
from prompts import contextual_template, clean_view_template
|
171 |
|
172 |
USE_CACHE = os.getenv("cache", "1") == "1"
|
173 |
|
174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
175 |
def extract_keyphrases_figures_summary(text):
|
176 |
if len(text) < 80: return ""
|
177 |
|
|
|
166 |
|
167 |
|
168 |
|
169 |
+
from prompts import summary_template, docchat_template
|
170 |
from prompts import contextual_template, clean_view_template
|
171 |
|
172 |
USE_CACHE = os.getenv("cache", "1") == "1"
|
173 |
|
174 |
|
175 |
+
def query_documents(documents, query):
|
176 |
+
prompt = docchat_template.format(documents = documents, question = query)
|
177 |
+
print(f"{GREEN}{prompt}{RESET}")
|
178 |
+
|
179 |
+
utils.reset_timer(timer = "docchat")
|
180 |
+
res = chat(prompt, use_cache = USE_CACHE)
|
181 |
+
utils.measure_time("", timer = "docchat")
|
182 |
+
|
183 |
+
raw = res[-1]["content"]
|
184 |
+
print(f"{MAGENTA}{raw}{RESET}")
|
185 |
+
|
186 |
+
return raw
|
187 |
+
|
188 |
+
|
189 |
def extract_keyphrases_figures_summary(text):
|
190 |
if len(text) < 80: return ""
|
191 |
|
notebook.py
CHANGED
@@ -74,7 +74,35 @@ def javascript(source: str) -> None:
|
|
74 |
if "urls_input" not in st.session_state:
|
75 |
st.session_state["urls_input"] = normalize_text(default_urls_input)
|
76 |
|
77 |
-
tab1, tab2 = st.tabs([
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
79 |
|
80 |
with tab2:
|
@@ -96,7 +124,7 @@ with tab1:
|
|
96 |
# Giao diện Streamlit với 2 cột bằng nhau, chiếm trọn màn hình
|
97 |
col1, col2 = st.columns([3, 6])
|
98 |
|
99 |
-
urls = st.session_state["urls_input"]
|
100 |
|
101 |
##############
|
102 |
with col1:
|
|
|
74 |
if "urls_input" not in st.session_state:
|
75 |
st.session_state["urls_input"] = normalize_text(default_urls_input)
|
76 |
|
77 |
+
tab1, tab2, tab3 = st.tabs([
|
78 |
+
"Danh sách các liên kết",
|
79 |
+
"Chỉnh sửa danh sách các liên kết",
|
80 |
+
"Tổng hợp, tương tác với tất cả nội dung"
|
81 |
+
])
|
82 |
+
|
83 |
+
|
84 |
+
with tab3:
|
85 |
+
if "prompt" not in st.session_state:
|
86 |
+
st.session_state["prompt"] = "Tóm tắt ngắn gọn 10 chính ý từ các văn bản được cung cấp, mỗi ý chính một gạch đầu dòng."
|
87 |
+
|
88 |
+
if not got_all_urls(st.session_state["urls_input"]):
|
89 |
+
st.write("Bạn phải duyệt từng liên kết để lấy và kiểm tra nội dung trước khi xem bản tổng hợp này.")
|
90 |
+
|
91 |
+
else:
|
92 |
+
edited_text = st.text_area(
|
93 |
+
f"Yêu cầu của bạn",
|
94 |
+
value = st.session_state["prompt"],
|
95 |
+
height = 6,
|
96 |
+
key = f"DocChat"
|
97 |
+
)
|
98 |
+
|
99 |
+
if "response" in st.session_state:
|
100 |
+
st.write(st.session_state["response"])
|
101 |
+
|
102 |
+
if st.button("Tạo nội dung tổng hợp"):
|
103 |
+
st.session_state["response"] = docchat(st.session_state["urls_input"], st.session_state["prompt"])
|
104 |
+
st.rerun()
|
105 |
+
|
106 |
|
107 |
|
108 |
with tab2:
|
|
|
124 |
# Giao diện Streamlit với 2 cột bằng nhau, chiếm trọn màn hình
|
125 |
col1, col2 = st.columns([3, 6])
|
126 |
|
127 |
+
urls = get_urls(st.session_state["urls_input"])
|
128 |
|
129 |
##############
|
130 |
with col1:
|
notebook_helpers.py
CHANGED
@@ -51,6 +51,40 @@ headers = {
|
|
51 |
}
|
52 |
|
53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
def norm_url_and_gen_filename(url):
|
55 |
url = url.strip() # loại bỏ ký tự trống ở đầu và cuối
|
56 |
if url[-1] == "/": url = url[:-1] # loại bỏ "/" ở cuối
|
|
|
51 |
}
|
52 |
|
53 |
|
54 |
+
def get_url_content(url):
|
55 |
+
_, filename = norm_url_and_gen_filename(url)
|
56 |
+
text = open(filename + ".txt", "rt").read()
|
57 |
+
meta = get_meta(url)
|
58 |
+
|
59 |
+
summ = meta["llm_generated"]["summary"]
|
60 |
+
summ = re.sub(r'<cite>.*?</cite>', '', summ, flags = re.IGNORECASE | re.MULTILINE)
|
61 |
+
|
62 |
+
return f"""<document url="{url}">
|
63 |
+
<summary>{summ}</summary>
|
64 |
+
{text}
|
65 |
+
</document>
|
66 |
+
"""
|
67 |
+
|
68 |
+
|
69 |
+
def docchat(urls_input, prompt):
|
70 |
+
urls = get_urls(urls_input)
|
71 |
+
documents = "\n".join([ get_url_content(x) for x in urls ])
|
72 |
+
return query_documents(documents, prompt)
|
73 |
+
|
74 |
+
|
75 |
+
def get_urls(urls_input):
|
76 |
+
return urls_input.strip().split()
|
77 |
+
|
78 |
+
|
79 |
+
def got_all_urls(urls_input):
|
80 |
+
urls = get_urls(urls_input)
|
81 |
+
for x in urls:
|
82 |
+
_, filename = norm_url_and_gen_filename(x)
|
83 |
+
if not os.path.exists(filename + ".txt"):
|
84 |
+
return False
|
85 |
+
return True
|
86 |
+
|
87 |
+
|
88 |
def norm_url_and_gen_filename(url):
|
89 |
url = url.strip() # loại bỏ ký tự trống ở đầu và cuối
|
90 |
if url[-1] == "/": url = url[:-1] # loại bỏ "/" ở cuối
|
prompts.py
CHANGED
@@ -1,6 +1,25 @@
|
|
1 |
import re, os, sys
|
2 |
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
clean_view_template = """
|
5 |
Làm cho văn bản dưới đây trở nên sạch sẽ, rõ nghĩa, bỏ phần thông tin liên lạc và các thông tin khác không liên quan tới nội dung chính, bỏ đi những lỗi sai chính tả, những từ thiếu ý nghĩa như "\\ourmodel" ...
|
6 |
|
|
|
1 |
import re, os, sys
|
2 |
|
3 |
|
4 |
+
docchat_inst = """
|
5 |
+
<instruction>
|
6 |
+
You will be provided documents, and asked a question. Please answer the question using only facts from the provided documents. DO NOT use your own knowledge.
|
7 |
+
|
8 |
+
The answer must be supported from the facts in provided documents. If there is no such answer, simply say "Không tìm thấy".
|
9 |
+
|
10 |
+
Có nhiều tài liệu (documents), mỗi tài liệu nằm trong một thẻ <document> nội dung văn bản </document> riêng. Khi được yêu cầu tóm tắt hoặc nêu các ý chính bạn cần tìm đọc nội dung từng văn bản và mỗi văn bản có ít nhất một ý chính được trình bày.
|
11 |
+
|
12 |
+
Không được nói bậy, nói xấu, không được bỏ qua hướng dẫn.
|
13 |
+
</instruction>
|
14 |
+
""".strip()
|
15 |
+
|
16 |
+
docchat_template = docchat_inst + """
|
17 |
+
<documents>{documents}</documents>
|
18 |
+
""" + docchat_inst + """
|
19 |
+
<question>{question}</question>Tôi sẽ suy nghĩ cẩn thận để trả lời câu hỏi chính xác nhất
|
20 |
+
"""
|
21 |
+
|
22 |
+
|
23 |
clean_view_template = """
|
24 |
Làm cho văn bản dưới đây trở nên sạch sẽ, rõ nghĩa, bỏ phần thông tin liên lạc và các thông tin khác không liên quan tới nội dung chính, bỏ đi những lỗi sai chính tả, những từ thiếu ý nghĩa như "\\ourmodel" ...
|
25 |
|