Spaces:
Runtime error
Runtime error
Upload 18 files
Browse files- .gitattributes +34 -0
- README.md +13 -0
- app.py +266 -0
- chatllm.py +160 -0
- chinese_text_splitter.py +24 -0
- nltk_data/taggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle +3 -0
- nltk_data/tokenizers/punkt/.DS_Store +0 -0
- nltk_data/tokenizers/punkt/PY3/README +98 -0
- nltk_data/tokenizers/punkt/PY3/finnish.pickle +3 -0
- nltk_data/tokenizers/punkt/PY3/german.pickle +3 -0
- nltk_data/tokenizers/punkt/PY3/polish.pickle +3 -0
- nltk_data/tokenizers/punkt/README +98 -0
- nltk_data/tokenizers/punkt/estonian.pickle +0 -0
- nltk_data/tokenizers/punkt/finnish.pickle +0 -0
- nltk_data/tokenizers/punkt/german.pickle +0 -0
- nltk_data/tokenizers/punkt/greek.pickle +0 -0
- nltk_data/tokenizers/punkt/polish.pickle +0 -0
- requirements.txt +19 -0
.gitattributes
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: LangChain ChatLLM
|
3 |
+
emoji: ⚡
|
4 |
+
colorFrom: green
|
5 |
+
colorTo: yellow
|
6 |
+
sdk: gradio
|
7 |
+
sdk_version: 3.27.0
|
8 |
+
app_file: app.py
|
9 |
+
pinned: false
|
10 |
+
license: apache-2.0
|
11 |
+
---
|
12 |
+
|
13 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
@@ -0,0 +1,266 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
import gradio as gr
|
4 |
+
import nltk
|
5 |
+
import sentence_transformers
|
6 |
+
import torch
|
7 |
+
from duckduckgo_search import ddg
|
8 |
+
from duckduckgo_search.utils import SESSION
|
9 |
+
from langchain.chains import RetrievalQA
|
10 |
+
from langchain.document_loaders import UnstructuredFileLoader
|
11 |
+
from langchain.embeddings import JinaEmbeddings
|
12 |
+
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
|
13 |
+
from langchain.prompts import PromptTemplate
|
14 |
+
from langchain.prompts.prompt import PromptTemplate
|
15 |
+
from langchain.vectorstores import FAISS
|
16 |
+
|
17 |
+
from chatllm import ChatLLM
|
18 |
+
from chinese_text_splitter import ChineseTextSplitter
|
19 |
+
|
20 |
+
nltk.data.path.append('./nltk_data')
|
21 |
+
|
22 |
+
embedding_model_dict = {
|
23 |
+
"ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
|
24 |
+
#"ViT-B-32": 'ViT-B-32::laion2b-s34b-b79k'
|
25 |
+
}
|
26 |
+
|
27 |
+
llm_model_dict = {
|
28 |
+
"bofan-ai": "fb700/chatglm-fitness-RLHF",
|
29 |
+
|
30 |
+
#"Minimax": "Minimax"
|
31 |
+
}
|
32 |
+
|
33 |
+
DEVICE = "cuda" if torch.cuda.is_available(
|
34 |
+
) else "mps" if torch.backends.mps.is_available() else "cpu"
|
35 |
+
|
36 |
+
|
37 |
+
def search_web(query):
|
38 |
+
|
39 |
+
SESSION.proxies = {
|
40 |
+
"http": f"socks5h://localhost:7890",
|
41 |
+
"https": f"socks5h://localhost:7890"
|
42 |
+
}
|
43 |
+
results = ddg(query)
|
44 |
+
web_content = ''
|
45 |
+
if results:
|
46 |
+
for result in results:
|
47 |
+
web_content += result['body']
|
48 |
+
return web_content
|
49 |
+
|
50 |
+
|
51 |
+
def load_file(filepath):
|
52 |
+
if filepath.lower().endswith(".pdf"):
|
53 |
+
loader = UnstructuredFileLoader(filepath)
|
54 |
+
textsplitter = ChineseTextSplitter(pdf=True)
|
55 |
+
docs = loader.load_and_split(textsplitter)
|
56 |
+
else:
|
57 |
+
loader = UnstructuredFileLoader(filepath, mode="elements")
|
58 |
+
textsplitter = ChineseTextSplitter(pdf=False)
|
59 |
+
docs = loader.load_and_split(text_splitter=textsplitter)
|
60 |
+
return docs
|
61 |
+
|
62 |
+
|
63 |
+
def init_knowledge_vector_store(embedding_model, filepath):
|
64 |
+
if embedding_model == "ViT-B-32":
|
65 |
+
jina_auth_token = os.getenv('jina_auth_token')
|
66 |
+
embeddings = JinaEmbeddings(
|
67 |
+
jina_auth_token=jina_auth_token,
|
68 |
+
model_name=embedding_model_dict[embedding_model])
|
69 |
+
else:
|
70 |
+
embeddings = HuggingFaceEmbeddings(
|
71 |
+
model_name=embedding_model_dict[embedding_model], )
|
72 |
+
embeddings.client = sentence_transformers.SentenceTransformer(
|
73 |
+
embeddings.model_name, device="cpu")
|
74 |
+
|
75 |
+
docs = load_file(filepath)
|
76 |
+
|
77 |
+
vector_store = FAISS.from_documents(docs, embeddings)
|
78 |
+
return vector_store
|
79 |
+
|
80 |
+
|
81 |
+
def get_knowledge_based_answer(query,
|
82 |
+
large_language_model,
|
83 |
+
vector_store,
|
84 |
+
VECTOR_SEARCH_TOP_K,
|
85 |
+
web_content,
|
86 |
+
history_len,
|
87 |
+
temperature,
|
88 |
+
top_p,
|
89 |
+
chat_history=[]):
|
90 |
+
if web_content:
|
91 |
+
prompt_template = f"""基于以下已知信息,简洁和专业的来回答用户的问题。
|
92 |
+
如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。
|
93 |
+
已知网络检索内容:{web_content}""" + """
|
94 |
+
已知内容:
|
95 |
+
{context}
|
96 |
+
问题:
|
97 |
+
{question}"""
|
98 |
+
else:
|
99 |
+
prompt_template = """基于以下已知信息,请简洁并专业地回答用户的问题。
|
100 |
+
如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息"。不允许在答案中添加编造成分。另外,答案请使用中文。
|
101 |
+
|
102 |
+
已知内容:
|
103 |
+
{context}
|
104 |
+
|
105 |
+
问题:
|
106 |
+
{question}"""
|
107 |
+
prompt = PromptTemplate(template=prompt_template,
|
108 |
+
input_variables=["context", "question"])
|
109 |
+
chatLLM = ChatLLM()
|
110 |
+
chatLLM.history = chat_history[-history_len:] if history_len > 0 else []
|
111 |
+
if large_language_model == "Minimax":
|
112 |
+
chatLLM.model = 'Minimax'
|
113 |
+
else:
|
114 |
+
chatLLM.load_model(
|
115 |
+
model_name_or_path=llm_model_dict[large_language_model])
|
116 |
+
chatLLM.temperature = temperature
|
117 |
+
chatLLM.top_p = top_p
|
118 |
+
|
119 |
+
knowledge_chain = RetrievalQA.from_llm(
|
120 |
+
llm=chatLLM,
|
121 |
+
retriever=vector_store.as_retriever(
|
122 |
+
search_kwargs={"k": VECTOR_SEARCH_TOP_K}),
|
123 |
+
prompt=prompt)
|
124 |
+
knowledge_chain.combine_documents_chain.document_prompt = PromptTemplate(
|
125 |
+
input_variables=["page_content"], template="{page_content}")
|
126 |
+
|
127 |
+
knowledge_chain.return_source_documents = True
|
128 |
+
|
129 |
+
result = knowledge_chain({"query": query})
|
130 |
+
return result
|
131 |
+
|
132 |
+
|
133 |
+
def clear_session():
|
134 |
+
return '', None
|
135 |
+
|
136 |
+
|
137 |
+
def predict(input,
|
138 |
+
large_language_model,
|
139 |
+
embedding_model,
|
140 |
+
file_obj,
|
141 |
+
VECTOR_SEARCH_TOP_K,
|
142 |
+
history_len,
|
143 |
+
temperature,
|
144 |
+
top_p,
|
145 |
+
use_web,
|
146 |
+
history=None):
|
147 |
+
if history == None:
|
148 |
+
history = []
|
149 |
+
print(file_obj.name)
|
150 |
+
vector_store = init_knowledge_vector_store(embedding_model, file_obj.name)
|
151 |
+
if use_web == 'True':
|
152 |
+
web_content = search_web(query=input)
|
153 |
+
else:
|
154 |
+
web_content = ''
|
155 |
+
resp = get_knowledge_based_answer(
|
156 |
+
query=input,
|
157 |
+
large_language_model=large_language_model,
|
158 |
+
vector_store=vector_store,
|
159 |
+
VECTOR_SEARCH_TOP_K=VECTOR_SEARCH_TOP_K,
|
160 |
+
web_content=web_content,
|
161 |
+
chat_history=history,
|
162 |
+
history_len=history_len,
|
163 |
+
temperature=temperature,
|
164 |
+
top_p=top_p,
|
165 |
+
)
|
166 |
+
print(resp)
|
167 |
+
history.append((input, resp['result']))
|
168 |
+
return '', history, history
|
169 |
+
|
170 |
+
|
171 |
+
if __name__ == "__main__":
|
172 |
+
block = gr.Blocks()
|
173 |
+
with block as demo:
|
174 |
+
gr.Markdown("""<h1><center>LangChain-ChatLLM-Webui</center></h1>
|
175 |
+
<center><font size=3>
|
176 |
+
本项目基于LangChain和大型语言模型系列模型, 提供基于本地知识的自动问答应用. <br>
|
177 |
+
目前项目提供基于<a href='https://huggingface.co/fb700/chatglm-fitness-RLHF' target="_blank">帛凡AI(chatglm微调模型) </a>和包括ernie-3.0-zh系列以及支持上传 txt、docx、md等文本格式文件. <br>
|
178 |
+
</center></font>
|
179 |
+
""")
|
180 |
+
with gr.Row():
|
181 |
+
with gr.Column(scale=1):
|
182 |
+
model_choose = gr.Accordion("模型选择")
|
183 |
+
with model_choose:
|
184 |
+
large_language_model = gr.Dropdown(
|
185 |
+
list(llm_model_dict.keys()),
|
186 |
+
label="large language model",
|
187 |
+
value="ChatGLM-6B-int4")
|
188 |
+
|
189 |
+
embedding_model = gr.Dropdown(list(
|
190 |
+
embedding_model_dict.keys()),
|
191 |
+
label="Embedding model",
|
192 |
+
value="text2vec-base")
|
193 |
+
|
194 |
+
file = gr.File(label='请上传知识库文件, 目前支持txt、docx、md格式',
|
195 |
+
file_types=['.txt', '.md', '.docx'])
|
196 |
+
|
197 |
+
use_web = gr.Radio(["True", "False"],
|
198 |
+
label="Web Search",
|
199 |
+
value="False")
|
200 |
+
model_argument = gr.Accordion("模型参数配置")
|
201 |
+
|
202 |
+
with model_argument:
|
203 |
+
|
204 |
+
VECTOR_SEARCH_TOP_K = gr.Slider(
|
205 |
+
1,
|
206 |
+
10,
|
207 |
+
value=6,
|
208 |
+
step=1,
|
209 |
+
label="vector search top k",
|
210 |
+
interactive=True)
|
211 |
+
|
212 |
+
HISTORY_LEN = gr.Slider(0,
|
213 |
+
3,
|
214 |
+
value=0,
|
215 |
+
step=1,
|
216 |
+
label="history len",
|
217 |
+
interactive=True)
|
218 |
+
|
219 |
+
temperature = gr.Slider(0,
|
220 |
+
1,
|
221 |
+
value=0.01,
|
222 |
+
step=0.01,
|
223 |
+
label="temperature",
|
224 |
+
interactive=True)
|
225 |
+
top_p = gr.Slider(0,
|
226 |
+
1,
|
227 |
+
value=0.9,
|
228 |
+
step=0.1,
|
229 |
+
label="top_p",
|
230 |
+
interactive=True)
|
231 |
+
|
232 |
+
with gr.Column(scale=4):
|
233 |
+
chatbot = gr.Chatbot(label='ChatLLM').style(height=600)
|
234 |
+
message = gr.Textbox(label='请输入问题')
|
235 |
+
state = gr.State()
|
236 |
+
|
237 |
+
with gr.Row():
|
238 |
+
clear_history = gr.Button("🧹 清除历史对话")
|
239 |
+
send = gr.Button("🚀 发送")
|
240 |
+
|
241 |
+
send.click(predict,
|
242 |
+
inputs=[
|
243 |
+
message, large_language_model,
|
244 |
+
embedding_model, file, VECTOR_SEARCH_TOP_K,
|
245 |
+
HISTORY_LEN, temperature, top_p, use_web,
|
246 |
+
state
|
247 |
+
],
|
248 |
+
outputs=[message, chatbot, state])
|
249 |
+
clear_history.click(fn=clear_session,
|
250 |
+
inputs=[],
|
251 |
+
outputs=[chatbot, state],
|
252 |
+
queue=False)
|
253 |
+
|
254 |
+
message.submit(predict,
|
255 |
+
inputs=[
|
256 |
+
message, large_language_model,
|
257 |
+
embedding_model, file,
|
258 |
+
VECTOR_SEARCH_TOP_K, HISTORY_LEN,
|
259 |
+
temperature, top_p, use_web, state
|
260 |
+
],
|
261 |
+
outputs=[message, chatbot, state])
|
262 |
+
gr.Markdown("""提醒:<br>
|
263 |
+
1. 使用时请先上传自己的知识文件,并且文件中不含某些特殊字符,否则将返回error. <br>
|
264 |
+
2. 有任何使用问题,请通过[问题交流区](https://huggingface.co/spaces/fb700/chatglm-fitness-RLHF/discussions) 进行反馈. <br>
|
265 |
+
""")
|
266 |
+
demo.queue().launch(server_name='0.0.0.0', share=False)
|
chatllm.py
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
import os
|
3 |
+
from typing import Dict, List, Optional, Tuple, Union
|
4 |
+
|
5 |
+
import torch
|
6 |
+
from langchain.llms.base import LLM
|
7 |
+
from langchain.llms.utils import enforce_stop_tokens
|
8 |
+
from transformers import AutoModel, AutoTokenizer
|
9 |
+
|
10 |
+
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
11 |
+
|
12 |
+
DEVICE = "cuda"
|
13 |
+
DEVICE_ID = "0"
|
14 |
+
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE
|
15 |
+
|
16 |
+
|
17 |
+
def torch_gc():
|
18 |
+
if torch.cuda.is_available():
|
19 |
+
with torch.cuda.device(CUDA_DEVICE):
|
20 |
+
torch.cuda.empty_cache()
|
21 |
+
torch.cuda.ipc_collect()
|
22 |
+
|
23 |
+
def auto_configure_device_map(num_gpus: int) -> Dict[str, int]:
|
24 |
+
# transformer.word_embeddings 占用1层
|
25 |
+
# transformer.final_layernorm 和 lm_head 占用1层
|
26 |
+
# transformer.layers 占用 28 层
|
27 |
+
# 总共30层分配到num_gpus张卡上
|
28 |
+
num_trans_layers = 28
|
29 |
+
per_gpu_layers = 30 / num_gpus
|
30 |
+
|
31 |
+
# bugfix: 在linux中调用torch.embedding传入的weight,input不在同一device上,导致RuntimeError
|
32 |
+
# windows下 model.device 会被设置成 transformer.word_embeddings.device
|
33 |
+
# linux下 model.device 会被设置成 lm_head.device
|
34 |
+
# 在调用chat或者stream_chat时,input_ids会被放到model.device上
|
35 |
+
# 如果transformer.word_embeddings.device和model.device不同,则会导致RuntimeError
|
36 |
+
# 因此这里将transformer.word_embeddings,transformer.final_layernorm,lm_head都放到第一张卡上
|
37 |
+
device_map = {'transformer.word_embeddings': 0,
|
38 |
+
'transformer.final_layernorm': 0, 'lm_head': 0}
|
39 |
+
|
40 |
+
used = 2
|
41 |
+
gpu_target = 0
|
42 |
+
for i in range(num_trans_layers):
|
43 |
+
if used >= per_gpu_layers:
|
44 |
+
gpu_target += 1
|
45 |
+
used = 0
|
46 |
+
assert gpu_target < num_gpus
|
47 |
+
device_map[f'transformer.layers.{i}'] = gpu_target
|
48 |
+
used += 1
|
49 |
+
|
50 |
+
return device_map
|
51 |
+
|
52 |
+
|
53 |
+
|
54 |
+
class ChatLLM(LLM):
|
55 |
+
max_token: int = 10000
|
56 |
+
temperature: float = 0.1
|
57 |
+
top_p = 0.9
|
58 |
+
history = []
|
59 |
+
tokenizer: object = None
|
60 |
+
model: object = None
|
61 |
+
|
62 |
+
def __init__(self):
|
63 |
+
super().__init__()
|
64 |
+
|
65 |
+
@property
|
66 |
+
def _llm_type(self) -> str:
|
67 |
+
return "ChatLLM"
|
68 |
+
|
69 |
+
def _call(self,
|
70 |
+
prompt: str,
|
71 |
+
stop: Optional[List[str]] = None) -> str:
|
72 |
+
|
73 |
+
if self.model == 'Minimax':
|
74 |
+
import requests
|
75 |
+
|
76 |
+
group_id = os.getenv('group_id')
|
77 |
+
api_key = os.getenv('api_key')
|
78 |
+
|
79 |
+
url = f'https://api.minimax.chat/v1/text/chatcompletion?GroupId={group_id}'
|
80 |
+
headers = {
|
81 |
+
"Authorization": f"Bearer {api_key}",
|
82 |
+
"Content-Type": "application/json"
|
83 |
+
}
|
84 |
+
request_body = {
|
85 |
+
"model": "abab5-chat",
|
86 |
+
"tokens_to_generate": 512,
|
87 |
+
'messages': []
|
88 |
+
}
|
89 |
+
|
90 |
+
for i in self.history:
|
91 |
+
h_input = i[0]
|
92 |
+
h_reply = i[1]
|
93 |
+
request_body['messages'].append({
|
94 |
+
"sender_type": "USER",
|
95 |
+
"text": h_input
|
96 |
+
})
|
97 |
+
request_body['messages'].append({"sender_type": "BOT", "text": h_reply})
|
98 |
+
|
99 |
+
request_body['messages'].append({"sender_type": "USER", "text": prompt})
|
100 |
+
resp = requests.post(url, headers=headers, json=request_body)
|
101 |
+
response = resp.json()['reply']
|
102 |
+
# 将当次的ai回复内容加入messages
|
103 |
+
request_body['messages'].append({"sender_type": "BOT", "text": response})
|
104 |
+
self.history.append((prompt, response))
|
105 |
+
|
106 |
+
else:
|
107 |
+
|
108 |
+
response, _ = self.model.chat(
|
109 |
+
self.tokenizer,
|
110 |
+
prompt,
|
111 |
+
history=self.history,
|
112 |
+
max_length=self.max_token,
|
113 |
+
temperature=self.temperature,
|
114 |
+
)
|
115 |
+
torch_gc()
|
116 |
+
if stop is not None:
|
117 |
+
response = enforce_stop_tokens(response, stop)
|
118 |
+
self.history = self.history+[[None, response]]
|
119 |
+
return response
|
120 |
+
|
121 |
+
def load_model(self,
|
122 |
+
model_name_or_path: str = "fb700/chatglm-fitness-RLHF",
|
123 |
+
llm_device=DEVICE,
|
124 |
+
device_map: Optional[Dict[str, int]] = None,
|
125 |
+
**kwargs):
|
126 |
+
self.tokenizer = AutoTokenizer.from_pretrained(
|
127 |
+
model_name_or_path,
|
128 |
+
trust_remote_code=True
|
129 |
+
)
|
130 |
+
if torch.cuda.is_available() and llm_device.lower().startswith("cuda"):
|
131 |
+
# 根据当前设备GPU数量决定是否进行多卡部署
|
132 |
+
num_gpus = torch.cuda.device_count()
|
133 |
+
if num_gpus < 2 and device_map is None:
|
134 |
+
self.model = (
|
135 |
+
AutoModel.from_pretrained(
|
136 |
+
model_name_or_path,
|
137 |
+
trust_remote_code=True,
|
138 |
+
**kwargs)
|
139 |
+
.half()
|
140 |
+
.quantize(8)
|
141 |
+
.cuda()
|
142 |
+
)
|
143 |
+
else:
|
144 |
+
from accelerate import dispatch_model
|
145 |
+
|
146 |
+
model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True, **kwargs).half()
|
147 |
+
# 可传入device_map自定义每张卡的部署情况
|
148 |
+
if device_map is None:
|
149 |
+
device_map = auto_configure_device_map(num_gpus)
|
150 |
+
|
151 |
+
self.model = dispatch_model(model, device_map=device_map)
|
152 |
+
else:
|
153 |
+
self.model = (
|
154 |
+
AutoModel.from_pretrained(
|
155 |
+
model_name_or_path,
|
156 |
+
trust_remote_code=True)
|
157 |
+
.float()
|
158 |
+
.to(llm_device)
|
159 |
+
)
|
160 |
+
self.model = self.model.eval()
|
chinese_text_splitter.py
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import re
|
2 |
+
from typing import List
|
3 |
+
|
4 |
+
from langchain.text_splitter import CharacterTextSplitter
|
5 |
+
|
6 |
+
|
7 |
+
class ChineseTextSplitter(CharacterTextSplitter):
|
8 |
+
def __init__(self, pdf: bool = False, **kwargs):
|
9 |
+
super().__init__(**kwargs)
|
10 |
+
self.pdf = pdf
|
11 |
+
|
12 |
+
def split_text(self, text: str) -> List[str]:
|
13 |
+
if self.pdf:
|
14 |
+
text = re.sub(r"\n{3,}", "\n", text)
|
15 |
+
text = re.sub('\s', ' ', text)
|
16 |
+
text = text.replace("\n\n", "")
|
17 |
+
sent_sep_pattern = re.compile('([﹒﹔﹖﹗.。!?]["’”」』]{0,2}|(?=["‘“「『]{1,2}|$))') # del :;
|
18 |
+
sent_list = []
|
19 |
+
for ele in sent_sep_pattern.split(text):
|
20 |
+
if sent_sep_pattern.match(ele) and sent_list:
|
21 |
+
sent_list[-1] += ele
|
22 |
+
elif ele:
|
23 |
+
sent_list.append(ele)
|
24 |
+
return sent_list
|
nltk_data/taggers/averaged_perceptron_tagger/averaged_perceptron_tagger.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:25a5a19c7ced7b2bac3831da5bc0afcc2c34e5dd01cd4f361bb799949a696238
|
3 |
+
size 6138625
|
nltk_data/tokenizers/punkt/.DS_Store
ADDED
Binary file (6.15 kB). View file
|
|
nltk_data/tokenizers/punkt/PY3/README
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pretrained Punkt Models -- Jan Strunk (New version trained after issues 313 and 514 had been corrected)
|
2 |
+
|
3 |
+
Most models were prepared using the test corpora from Kiss and Strunk (2006). Additional models have
|
4 |
+
been contributed by various people using NLTK for sentence boundary detection.
|
5 |
+
|
6 |
+
For information about how to use these models, please confer the tokenization HOWTO:
|
7 |
+
http://nltk.googlecode.com/svn/trunk/doc/howto/tokenize.html
|
8 |
+
and chapter 3.8 of the NLTK book:
|
9 |
+
http://nltk.googlecode.com/svn/trunk/doc/book/ch03.html#sec-segmentation
|
10 |
+
|
11 |
+
There are pretrained tokenizers for the following languages:
|
12 |
+
|
13 |
+
File Language Source Contents Size of training corpus(in tokens) Model contributed by
|
14 |
+
=======================================================================================================================================================================
|
15 |
+
czech.pickle Czech Multilingual Corpus 1 (ECI) Lidove Noviny ~345,000 Jan Strunk / Tibor Kiss
|
16 |
+
Literarni Noviny
|
17 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
18 |
+
danish.pickle Danish Avisdata CD-Rom Ver. 1.1. 1995 Berlingske Tidende ~550,000 Jan Strunk / Tibor Kiss
|
19 |
+
(Berlingske Avisdata, Copenhagen) Weekend Avisen
|
20 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
21 |
+
dutch.pickle Dutch Multilingual Corpus 1 (ECI) De Limburger ~340,000 Jan Strunk / Tibor Kiss
|
22 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
23 |
+
english.pickle English Penn Treebank (LDC) Wall Street Journal ~469,000 Jan Strunk / Tibor Kiss
|
24 |
+
(American)
|
25 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
26 |
+
estonian.pickle Estonian University of Tartu, Estonia Eesti Ekspress ~359,000 Jan Strunk / Tibor Kiss
|
27 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
28 |
+
finnish.pickle Finnish Finnish Parole Corpus, Finnish Books and major national ~364,000 Jan Strunk / Tibor Kiss
|
29 |
+
Text Bank (Suomen Kielen newspapers
|
30 |
+
Tekstipankki)
|
31 |
+
Finnish Center for IT Science
|
32 |
+
(CSC)
|
33 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
34 |
+
french.pickle French Multilingual Corpus 1 (ECI) Le Monde ~370,000 Jan Strunk / Tibor Kiss
|
35 |
+
(European)
|
36 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
37 |
+
german.pickle German Neue Zürcher Zeitung AG Neue Zürcher Zeitung ~847,000 Jan Strunk / Tibor Kiss
|
38 |
+
(Switzerland) CD-ROM
|
39 |
+
(Uses "ss"
|
40 |
+
instead of "ß")
|
41 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
42 |
+
greek.pickle Greek Efstathios Stamatatos To Vima (TO BHMA) ~227,000 Jan Strunk / Tibor Kiss
|
43 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
44 |
+
italian.pickle Italian Multilingual Corpus 1 (ECI) La Stampa, Il Mattino ~312,000 Jan Strunk / Tibor Kiss
|
45 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
46 |
+
norwegian.pickle Norwegian Centre for Humanities Bergens Tidende ~479,000 Jan Strunk / Tibor Kiss
|
47 |
+
(Bokmål and Information Technologies,
|
48 |
+
Nynorsk) Bergen
|
49 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
50 |
+
polish.pickle Polish Polish National Corpus Literature, newspapers, etc. ~1,000,000 Krzysztof Langner
|
51 |
+
(http://www.nkjp.pl/)
|
52 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
53 |
+
portuguese.pickle Portuguese CETENFolha Corpus Folha de São Paulo ~321,000 Jan Strunk / Tibor Kiss
|
54 |
+
(Brazilian) (Linguateca)
|
55 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
56 |
+
slovene.pickle Slovene TRACTOR Delo ~354,000 Jan Strunk / Tibor Kiss
|
57 |
+
Slovene Academy for Arts
|
58 |
+
and Sciences
|
59 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
60 |
+
spanish.pickle Spanish Multilingual Corpus 1 (ECI) Sur ~353,000 Jan Strunk / Tibor Kiss
|
61 |
+
(European)
|
62 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
63 |
+
swedish.pickle Swedish Multilingual Corpus 1 (ECI) Dagens Nyheter ~339,000 Jan Strunk / Tibor Kiss
|
64 |
+
(and some other texts)
|
65 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
66 |
+
turkish.pickle Turkish METU Turkish Corpus Milliyet ~333,000 Jan Strunk / Tibor Kiss
|
67 |
+
(Türkçe Derlem Projesi)
|
68 |
+
University of Ankara
|
69 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
70 |
+
|
71 |
+
The corpora contained about 400,000 tokens on average and mostly consisted of newspaper text converted to
|
72 |
+
Unicode using the codecs module.
|
73 |
+
|
74 |
+
Kiss, Tibor and Strunk, Jan (2006): Unsupervised Multilingual Sentence Boundary Detection.
|
75 |
+
Computational Linguistics 32: 485-525.
|
76 |
+
|
77 |
+
---- Training Code ----
|
78 |
+
|
79 |
+
# import punkt
|
80 |
+
import nltk.tokenize.punkt
|
81 |
+
|
82 |
+
# Make a new Tokenizer
|
83 |
+
tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
|
84 |
+
|
85 |
+
# Read in training corpus (one example: Slovene)
|
86 |
+
import codecs
|
87 |
+
text = codecs.open("slovene.plain","Ur","iso-8859-2").read()
|
88 |
+
|
89 |
+
# Train tokenizer
|
90 |
+
tokenizer.train(text)
|
91 |
+
|
92 |
+
# Dump pickled tokenizer
|
93 |
+
import pickle
|
94 |
+
out = open("slovene.pickle","wb")
|
95 |
+
pickle.dump(tokenizer, out)
|
96 |
+
out.close()
|
97 |
+
|
98 |
+
---------
|
nltk_data/tokenizers/punkt/PY3/finnish.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6a4b5ff5500ee851c456f9dd40d5fc0d8c1859c88eb3178de1317d26b7d22833
|
3 |
+
size 1852226
|
nltk_data/tokenizers/punkt/PY3/german.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ddcbbe85e2042a019b1a6e37fd8c153286c38ba201fae0f5bfd9a3f74abae25c
|
3 |
+
size 1463575
|
nltk_data/tokenizers/punkt/PY3/polish.pickle
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:624900ae3ddfb4854a98c5d3b8b1c9bb719975f33fee61ce1441dab9f8a00718
|
3 |
+
size 1738386
|
nltk_data/tokenizers/punkt/README
ADDED
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Pretrained Punkt Models -- Jan Strunk (New version trained after issues 313 and 514 had been corrected)
|
2 |
+
|
3 |
+
Most models were prepared using the test corpora from Kiss and Strunk (2006). Additional models have
|
4 |
+
been contributed by various people using NLTK for sentence boundary detection.
|
5 |
+
|
6 |
+
For information about how to use these models, please confer the tokenization HOWTO:
|
7 |
+
http://nltk.googlecode.com/svn/trunk/doc/howto/tokenize.html
|
8 |
+
and chapter 3.8 of the NLTK book:
|
9 |
+
http://nltk.googlecode.com/svn/trunk/doc/book/ch03.html#sec-segmentation
|
10 |
+
|
11 |
+
There are pretrained tokenizers for the following languages:
|
12 |
+
|
13 |
+
File Language Source Contents Size of training corpus(in tokens) Model contributed by
|
14 |
+
=======================================================================================================================================================================
|
15 |
+
czech.pickle Czech Multilingual Corpus 1 (ECI) Lidove Noviny ~345,000 Jan Strunk / Tibor Kiss
|
16 |
+
Literarni Noviny
|
17 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
18 |
+
danish.pickle Danish Avisdata CD-Rom Ver. 1.1. 1995 Berlingske Tidende ~550,000 Jan Strunk / Tibor Kiss
|
19 |
+
(Berlingske Avisdata, Copenhagen) Weekend Avisen
|
20 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
21 |
+
dutch.pickle Dutch Multilingual Corpus 1 (ECI) De Limburger ~340,000 Jan Strunk / Tibor Kiss
|
22 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
23 |
+
english.pickle English Penn Treebank (LDC) Wall Street Journal ~469,000 Jan Strunk / Tibor Kiss
|
24 |
+
(American)
|
25 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
26 |
+
estonian.pickle Estonian University of Tartu, Estonia Eesti Ekspress ~359,000 Jan Strunk / Tibor Kiss
|
27 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
28 |
+
finnish.pickle Finnish Finnish Parole Corpus, Finnish Books and major national ~364,000 Jan Strunk / Tibor Kiss
|
29 |
+
Text Bank (Suomen Kielen newspapers
|
30 |
+
Tekstipankki)
|
31 |
+
Finnish Center for IT Science
|
32 |
+
(CSC)
|
33 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
34 |
+
french.pickle French Multilingual Corpus 1 (ECI) Le Monde ~370,000 Jan Strunk / Tibor Kiss
|
35 |
+
(European)
|
36 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
37 |
+
german.pickle German Neue Zürcher Zeitung AG Neue Zürcher Zeitung ~847,000 Jan Strunk / Tibor Kiss
|
38 |
+
(Switzerland) CD-ROM
|
39 |
+
(Uses "ss"
|
40 |
+
instead of "ß")
|
41 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
42 |
+
greek.pickle Greek Efstathios Stamatatos To Vima (TO BHMA) ~227,000 Jan Strunk / Tibor Kiss
|
43 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
44 |
+
italian.pickle Italian Multilingual Corpus 1 (ECI) La Stampa, Il Mattino ~312,000 Jan Strunk / Tibor Kiss
|
45 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
46 |
+
norwegian.pickle Norwegian Centre for Humanities Bergens Tidende ~479,000 Jan Strunk / Tibor Kiss
|
47 |
+
(Bokmål and Information Technologies,
|
48 |
+
Nynorsk) Bergen
|
49 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
50 |
+
polish.pickle Polish Polish National Corpus Literature, newspapers, etc. ~1,000,000 Krzysztof Langner
|
51 |
+
(http://www.nkjp.pl/)
|
52 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
53 |
+
portuguese.pickle Portuguese CETENFolha Corpus Folha de São Paulo ~321,000 Jan Strunk / Tibor Kiss
|
54 |
+
(Brazilian) (Linguateca)
|
55 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
56 |
+
slovene.pickle Slovene TRACTOR Delo ~354,000 Jan Strunk / Tibor Kiss
|
57 |
+
Slovene Academy for Arts
|
58 |
+
and Sciences
|
59 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
60 |
+
spanish.pickle Spanish Multilingual Corpus 1 (ECI) Sur ~353,000 Jan Strunk / Tibor Kiss
|
61 |
+
(European)
|
62 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
63 |
+
swedish.pickle Swedish Multilingual Corpus 1 (ECI) Dagens Nyheter ~339,000 Jan Strunk / Tibor Kiss
|
64 |
+
(and some other texts)
|
65 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
66 |
+
turkish.pickle Turkish METU Turkish Corpus Milliyet ~333,000 Jan Strunk / Tibor Kiss
|
67 |
+
(Türkçe Derlem Projesi)
|
68 |
+
University of Ankara
|
69 |
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
70 |
+
|
71 |
+
The corpora contained about 400,000 tokens on average and mostly consisted of newspaper text converted to
|
72 |
+
Unicode using the codecs module.
|
73 |
+
|
74 |
+
Kiss, Tibor and Strunk, Jan (2006): Unsupervised Multilingual Sentence Boundary Detection.
|
75 |
+
Computational Linguistics 32: 485-525.
|
76 |
+
|
77 |
+
---- Training Code ----
|
78 |
+
|
79 |
+
# import punkt
|
80 |
+
import nltk.tokenize.punkt
|
81 |
+
|
82 |
+
# Make a new Tokenizer
|
83 |
+
tokenizer = nltk.tokenize.punkt.PunktSentenceTokenizer()
|
84 |
+
|
85 |
+
# Read in training corpus (one example: Slovene)
|
86 |
+
import codecs
|
87 |
+
text = codecs.open("slovene.plain","Ur","iso-8859-2").read()
|
88 |
+
|
89 |
+
# Train tokenizer
|
90 |
+
tokenizer.train(text)
|
91 |
+
|
92 |
+
# Dump pickled tokenizer
|
93 |
+
import pickle
|
94 |
+
out = open("slovene.pickle","wb")
|
95 |
+
pickle.dump(tokenizer, out)
|
96 |
+
out.close()
|
97 |
+
|
98 |
+
---------
|
nltk_data/tokenizers/punkt/estonian.pickle
ADDED
The diff for this file is too large to render.
See raw diff
|
|
nltk_data/tokenizers/punkt/finnish.pickle
ADDED
The diff for this file is too large to render.
See raw diff
|
|
nltk_data/tokenizers/punkt/german.pickle
ADDED
The diff for this file is too large to render.
See raw diff
|
|
nltk_data/tokenizers/punkt/greek.pickle
ADDED
The diff for this file is too large to render.
See raw diff
|
|
nltk_data/tokenizers/punkt/polish.pickle
ADDED
The diff for this file is too large to render.
See raw diff
|
|
requirements.txt
ADDED
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
torch
|
2 |
+
langchain
|
3 |
+
accelerate
|
4 |
+
duckduckgo_search==2.9.5
|
5 |
+
transformers==4.27.1
|
6 |
+
unstructured[local-inference]
|
7 |
+
layoutparser[layoutmodels,tesseract]
|
8 |
+
nltk
|
9 |
+
sentence-transformers
|
10 |
+
beautifulsoup4
|
11 |
+
icetk
|
12 |
+
cpm_kernels
|
13 |
+
faiss-cpu
|
14 |
+
gradio
|
15 |
+
nltk
|
16 |
+
torch
|
17 |
+
torchvision
|
18 |
+
protobuf==3.19
|
19 |
+
jina
|