Spaces:
Runtime error
Runtime error
yanqiang
commited on
Commit
•
96cd96f
0
Parent(s):
feature@init
Browse files- .gitignore +1 -0
- README.md +16 -0
- clc/__init__.py +11 -0
- clc/config.py +18 -0
- clc/gpt_service.py +67 -0
- clc/langchain_application.py +65 -0
- clc/source_service.py +65 -0
- docs/added/马保国.txt +2 -0
- docs/姚明.txt +4 -0
- docs/王治郅.txt +4 -0
- docs/科比.txt +5 -0
- main.py +141 -0
- requirements.txt +9 -0
- tests/test_langchain.py +37 -0
.gitignore
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
.idea
|
README.md
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# chinese-langchain
|
2 |
+
|
3 |
+
> Chinese-LangChain:中文langchain,基于ChatGLM-6b+langchain实现本地化知识库检索与智能答案生成
|
4 |
+
|
5 |
+
## 特性
|
6 |
+
|
7 |
+
- 支持多种文档上传与内容解析:pdf、docx,ppt等
|
8 |
+
- 支持知识增量更新
|
9 |
+
|
10 |
+
[//]: # (- 支持检索结果与LLM生成结果对比)
|
11 |
+
|
12 |
+
## 引用
|
13 |
+
|
14 |
+
- webui参考:https://github.com/thomas-yanxin/LangChain-ChatGLM-Webui
|
15 |
+
- knowledge文档参考:https://github.com/imClumsyPanda/langchain-ChatGLM
|
16 |
+
- LLM模型:https://github.com/THUDM/ChatGLM-6B
|
clc/__init__.py
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: __init__.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
clc/config.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: config.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
12 |
+
|
13 |
+
|
14 |
+
class LangChainCFG:
|
15 |
+
llm_model_name = 'chatglm-6b' # 本地模型文件 or huggingface远程仓库
|
16 |
+
embedding_model_name = 'text2vec-large-chinese' # 检索模型文件 or huggingface远程仓库
|
17 |
+
vector_store_path = '.'
|
18 |
+
docs_path = './docs'
|
clc/gpt_service.py
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: generate.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
12 |
+
|
13 |
+
from typing import List, Optional
|
14 |
+
|
15 |
+
from langchain.llms.base import LLM
|
16 |
+
from langchain.llms.utils import enforce_stop_tokens
|
17 |
+
from transformers import AutoModel, AutoTokenizer
|
18 |
+
|
19 |
+
|
20 |
+
class ChatGLMService(LLM):
|
21 |
+
max_token: int = 10000
|
22 |
+
temperature: float = 0.1
|
23 |
+
top_p = 0.9
|
24 |
+
history = []
|
25 |
+
tokenizer: object = None
|
26 |
+
model: object = None
|
27 |
+
|
28 |
+
def __init__(self):
|
29 |
+
super().__init__()
|
30 |
+
|
31 |
+
@property
|
32 |
+
def _llm_type(self) -> str:
|
33 |
+
return "ChatGLM"
|
34 |
+
|
35 |
+
def _call(self,
|
36 |
+
prompt: str,
|
37 |
+
stop: Optional[List[str]] = None) -> str:
|
38 |
+
response, _ = self.model.chat(
|
39 |
+
self.tokenizer,
|
40 |
+
prompt,
|
41 |
+
history=self.history,
|
42 |
+
max_length=self.max_token,
|
43 |
+
temperature=self.temperature,
|
44 |
+
)
|
45 |
+
if stop is not None:
|
46 |
+
response = enforce_stop_tokens(response, stop)
|
47 |
+
self.history = self.history + [[None, response]]
|
48 |
+
return response
|
49 |
+
|
50 |
+
def load_model(self,
|
51 |
+
model_name_or_path: str = "THUDM/chatglm-6b"):
|
52 |
+
self.tokenizer = AutoTokenizer.from_pretrained(
|
53 |
+
model_name_or_path,
|
54 |
+
trust_remote_code=True
|
55 |
+
)
|
56 |
+
self.model = (
|
57 |
+
AutoModel.from_pretrained(
|
58 |
+
model_name_or_path,
|
59 |
+
trust_remote_code=True)
|
60 |
+
.half()
|
61 |
+
.cuda()
|
62 |
+
)
|
63 |
+
|
64 |
+
# if __name__ == '__main__':
|
65 |
+
# config=LangChainCFG()
|
66 |
+
# chatLLM = ChatGLMService()
|
67 |
+
# chatLLM.load_model(model_name_or_path=config.llm_model_name)
|
clc/langchain_application.py
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: model.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
12 |
+
|
13 |
+
from langchain.chains import RetrievalQA
|
14 |
+
from langchain.prompts.prompt import PromptTemplate
|
15 |
+
from clc.gpt_service import ChatGLMService
|
16 |
+
from clc.source_service import SourceService
|
17 |
+
|
18 |
+
|
19 |
+
class LangChainApplication(object):
|
20 |
+
def __init__(self, config):
|
21 |
+
self.config = config
|
22 |
+
self.llm_service = ChatGLMService()
|
23 |
+
self.llm_service.load_model(model_name_or_path=self.config.llm_model_name)
|
24 |
+
self.source_service = SourceService(config)
|
25 |
+
self.source_service.init_source_vector()
|
26 |
+
|
27 |
+
def get_knowledge_based_answer(self, query,
|
28 |
+
history_len=5,
|
29 |
+
temperature=0.1,
|
30 |
+
top_p=0.9,
|
31 |
+
chat_history=[]):
|
32 |
+
prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。
|
33 |
+
如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。
|
34 |
+
已知内容:
|
35 |
+
{context}
|
36 |
+
问题:
|
37 |
+
{question}"""
|
38 |
+
prompt = PromptTemplate(template=prompt_template,
|
39 |
+
input_variables=["context", "question"])
|
40 |
+
self.llm_service.history = chat_history[-history_len:] if history_len > 0 else []
|
41 |
+
|
42 |
+
self.llm_service.temperature = temperature
|
43 |
+
self.llm_service.top_p = top_p
|
44 |
+
|
45 |
+
knowledge_chain = RetrievalQA.from_llm(
|
46 |
+
llm=self.llm_service,
|
47 |
+
retriever=self.source_service.vector_store.as_retriever(
|
48 |
+
search_kwargs={"k": 2}),
|
49 |
+
prompt=prompt)
|
50 |
+
knowledge_chain.combine_documents_chain.document_prompt = PromptTemplate(
|
51 |
+
input_variables=["page_content"], template="{page_content}")
|
52 |
+
|
53 |
+
knowledge_chain.return_source_documents = True
|
54 |
+
|
55 |
+
result = knowledge_chain({"query": query})
|
56 |
+
return result
|
57 |
+
|
58 |
+
# if __name__ == '__main__':
|
59 |
+
# config = LangChainCFG()
|
60 |
+
# application = LangChainApplication(config)
|
61 |
+
# result = application.get_knowledge_based_answer('马保国是谁')
|
62 |
+
# print(result)
|
63 |
+
# application.source_service.add_document('/home/searchgpt/yq/Knowledge-ChatGLM/docs/added/马保国.txt')
|
64 |
+
# result = application.get_knowledge_based_answer('马保国是谁')
|
65 |
+
# print(result)
|
clc/source_service.py
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: search.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
12 |
+
|
13 |
+
import os
|
14 |
+
|
15 |
+
from langchain.document_loaders import UnstructuredFileLoader
|
16 |
+
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
|
17 |
+
from langchain.vectorstores import FAISS
|
18 |
+
|
19 |
+
|
20 |
+
class SourceService(object):
|
21 |
+
def __init__(self, config):
|
22 |
+
self.config = config
|
23 |
+
self.embeddings = HuggingFaceEmbeddings(model_name=self.config.embedding_model_name)
|
24 |
+
self.docs_path = self.config.docs_path
|
25 |
+
self.vector_store_path = self.config.vector_store_path
|
26 |
+
|
27 |
+
def init_source_vector(self):
|
28 |
+
"""
|
29 |
+
初始化本地知识库向量
|
30 |
+
:return:
|
31 |
+
"""
|
32 |
+
docs = []
|
33 |
+
for doc in os.listdir(self.docs_path):
|
34 |
+
if doc.endswith('.txt'):
|
35 |
+
print(doc)
|
36 |
+
loader = UnstructuredFileLoader(f'{self.docs_path}/{doc}', mode="elements")
|
37 |
+
doc = loader.load()
|
38 |
+
docs.extend(doc)
|
39 |
+
self.vector_store = FAISS.from_documents(docs, self.embeddings)
|
40 |
+
self.vector_store.save_local(self.vector_store_path)
|
41 |
+
|
42 |
+
def add_document(self, document_path):
|
43 |
+
loader = UnstructuredFileLoader(document_path, mode="elements")
|
44 |
+
doc = loader.load()
|
45 |
+
self.vector_store.add_documents(doc)
|
46 |
+
self.vector_store.save_local(self.vector_store_path)
|
47 |
+
|
48 |
+
def load_vector_store(self):
|
49 |
+
self.vector_store = FAISS.load_local(self.vector_store_path, self.embeddings)
|
50 |
+
return self.vector_store
|
51 |
+
|
52 |
+
# if __name__ == '__main__':
|
53 |
+
# config = LangChainCFG()
|
54 |
+
# source_service = SourceService(config)
|
55 |
+
# source_service.init_source_vector()
|
56 |
+
# search_result = source_service.vector_store.similarity_search_with_score('科比')
|
57 |
+
# print(search_result)
|
58 |
+
#
|
59 |
+
# source_service.add_document('/home/searchgpt/yq/Knowledge-ChatGLM/docs/added/科比.txt')
|
60 |
+
# search_result = source_service.vector_store.similarity_search_with_score('科比')
|
61 |
+
# print(search_result)
|
62 |
+
#
|
63 |
+
# vector_store=source_service.load_vector_store()
|
64 |
+
# search_result = source_service.vector_store.similarity_search_with_score('科比')
|
65 |
+
# print(search_result)
|
docs/added/马保国.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
马保国(1952年- ) [1] ,英国混元太极拳协会创始人,自称“浑元形意太极拳掌门人”。 [2-4]
|
2 |
+
2020年11月15日,马保国首度回应“屡遭恶搞剪辑”:“远离武林,已回归平静生活” [5] ;11月16日,马保国宣布将参演电影《少年功夫王》。 [6] 11月28日,人民日报客户端刊发评论《马保国闹剧,该立刻收场了》。 [7] 11月29日,新浪微博社区管理官方发布公告称,已解散马保国相关的粉丝群。 [8]
|
docs/姚明.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
姚明(Yao Ming),男,汉族,无党派人士,1980年9月12日出生于上海市徐汇区,祖籍江苏省苏州市吴江区震泽镇,前中国职业篮球运动员,司职中锋,现任亚洲篮球联合会主席、中国篮球协会主席、中职联公司董事长兼总经理, [1-3] 十三届全国青联副主席, [4] 改革先锋奖章获得者。 [5] 第十四届全国人大代表 [108] 。
|
2 |
+
1998年4月,姚明入选王非执教的国家队,开始篮球生涯。2001夺得CBA常规赛MVP,2002年夺得CBA总冠军以及总决赛MVP,分别3次当选CBA篮板王以及盖帽王,2次当选CBA扣篮王。在2002年NBA选秀中,他以状元秀身份被NBA的休斯敦火箭队选中,2003-09年连续6个赛季(生涯共8次)入选NBA全明星赛阵容,2次入选NBA最佳阵容二阵,3次入选NBA最佳阵容三阵。2009年,姚明收购上海男篮,成为上海久事大鲨鱼俱乐部老板。2011年7月20日,姚明宣布退役。
|
3 |
+
2013年,姚明当选为第十二届全国政协委员。2015年2月10日,姚明正式成为北京申办冬季奥林匹克运动会形象大使之一。2016年4月4日,姚明正式入选2016年奈史密斯篮球名人纪念堂,成为首位获此殊荣的中国人;10月,姚明成为中国“火星大使”;11月,当选CBA公司副董事长。 [6]
|
4 |
+
2017年10月20日,姚明已将上海哔哩哔哩俱乐部全部股权转让。 [7] 2018年9月,荣获第十届“中华慈善奖”慈善楷模奖项。 [8] 2019年10月28日,胡润研究院发布《2019胡润80后白手起家富豪榜》,姚明以22亿元排名第48。
|
docs/王治郅.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
王治郅,1977年7月8日出生于北京,前中国篮球运动员,司职大前锋/中锋,现已退役。 [1]
|
2 |
+
1991年12月,王治郅进入八一青年男子篮球队。1993年初入选中国少年特殊身材篮球队,并于同年入选中国青年男子篮球队,后加入八一男子篮球队。2001-05年曾效力于NBA独行侠、快船以及热火队。 [1]
|
3 |
+
2015年9月15日新赛季CBA注册截止日,八一队的球员注册名单上并没有出现38岁老将王治郅的名字,王治郅退役已成事实 [2] 。2016年7月5日,王治郅的退役仪式在北京奥体中心举行,在仪式上,王治郅正式宣布退役。 [3] 2018年7月,王治郅正式成为八一南昌队主教练。 [1] [4]
|
4 |
+
王治郅是中国篮球界进入NBA的第一人,被评选为中国篮坛50大杰出人物和中国申办奥运特使。他和姚明、蒙克·巴特尔一起,被称为篮球场上的“移动长城”。 [5]
|
docs/科比.txt
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
科比·布莱恩特(Kobe Bryant,1978年8月23日—2020年1月26日),全名科比·比恩·布莱恩特·考克斯(Kobe Bean Bryant Cox),出生于美国宾夕法尼亚州费城,美国已故篮球运动员,司职得分后卫/小前锋。 [5] [24] [84]
|
2 |
+
1996年NBA选秀,科比于第1轮第13顺位被夏洛特黄蜂队选中并被交易至洛杉矶湖人队,整个NBA生涯都效力于洛杉矶湖人队;共获得5次NBA总冠军、1次NBA常规赛MVP、2次NBA总决赛MVP、4次NBA全明星赛MVP、2次NBA赛季得分王;共入选NBA全明星首发阵容18次、NBA最佳阵容15次(其中一阵11次、二阵2次、三阵2次)、NBA最佳防守阵容12次(其中一阵9次、二阵3次)。 [9] [24]
|
3 |
+
2007年,科比首次入选美国国家男子篮球队,后帮助美国队夺得2007年美洲男篮锦标赛金牌、2008年北京奥运会男子篮球金牌以及2012年伦敦奥运会男子篮球金牌。 [91]
|
4 |
+
2015年11月30日,科比发文宣布将在赛季结束后退役。 [100] 2017年12月19日,湖人队为科比举行球衣退役仪式。 [22] 2020年4月5日,科比入选奈·史密斯篮球名人纪念堂。 [7]
|
5 |
+
美国时间2020年1月26日(北京时间2020年1月27日),科比因直升机事故遇难,享年41岁。 [23]
|
main.py
ADDED
@@ -0,0 +1,141 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python
|
2 |
+
# -*- coding:utf-8 _*-
|
3 |
+
"""
|
4 |
+
@author:quincy qiang
|
5 |
+
@license: Apache Licence
|
6 |
+
@file: main.py
|
7 |
+
@time: 2023/04/17
|
8 |
+
@contact: [email protected]
|
9 |
+
@software: PyCharm
|
10 |
+
@description: coding..
|
11 |
+
"""
|
12 |
+
|
13 |
+
import os
|
14 |
+
import shutil
|
15 |
+
|
16 |
+
import gradio as gr
|
17 |
+
|
18 |
+
from clc.langchain_application import LangChainApplication
|
19 |
+
|
20 |
+
|
21 |
+
# 修改成自己的配置!!!
|
22 |
+
class LangChainCFG:
|
23 |
+
llm_model_name = '../../pretrained_models/chatglm-6b' # 本地模型文件 or huggingface远程仓库
|
24 |
+
embedding_model_name = '../../pretrained_models/text2vec-large-chinese' # 检索模型文件 or huggingface远程仓库
|
25 |
+
vector_store_path = './cache'
|
26 |
+
docs_path = './docs'
|
27 |
+
|
28 |
+
|
29 |
+
config = LangChainCFG()
|
30 |
+
application = LangChainApplication(config)
|
31 |
+
|
32 |
+
|
33 |
+
def get_file_list():
|
34 |
+
if not os.path.exists("docs"):
|
35 |
+
return []
|
36 |
+
return [f for f in os.listdir("docs")]
|
37 |
+
|
38 |
+
|
39 |
+
file_list = get_file_list()
|
40 |
+
|
41 |
+
|
42 |
+
def upload_file(file):
|
43 |
+
if not os.path.exists("docs"):
|
44 |
+
os.mkdir("docs")
|
45 |
+
filename = os.path.basename(file.name)
|
46 |
+
shutil.move(file.name, "docs/" + filename)
|
47 |
+
# file_list首位插入新上传的文件
|
48 |
+
file_list.insert(0, filename)
|
49 |
+
application.source_service.add_document("docs/" + filename)
|
50 |
+
return gr.Dropdown.update(choices=file_list, value=filename)
|
51 |
+
|
52 |
+
|
53 |
+
def clear_session():
|
54 |
+
return '', None
|
55 |
+
|
56 |
+
|
57 |
+
def predict(input,
|
58 |
+
large_language_model,
|
59 |
+
embedding_model,
|
60 |
+
history=None):
|
61 |
+
print(large_language_model, embedding_model)
|
62 |
+
if history == None:
|
63 |
+
history = []
|
64 |
+
resp = application.get_knowledge_based_answer(
|
65 |
+
query=input,
|
66 |
+
history_len=5,
|
67 |
+
temperature=0.1,
|
68 |
+
top_p=0.9,
|
69 |
+
chat_history=history
|
70 |
+
)
|
71 |
+
print(resp)
|
72 |
+
history.append((input, resp['result']))
|
73 |
+
return '', history, history
|
74 |
+
|
75 |
+
|
76 |
+
block = gr.Blocks()
|
77 |
+
with block as demo:
|
78 |
+
gr.Markdown("""<h1><center>Chinese-LangChain</center></h1>
|
79 |
+
<center><font size=3>
|
80 |
+
</center></font>
|
81 |
+
""")
|
82 |
+
with gr.Row():
|
83 |
+
with gr.Column(scale=1):
|
84 |
+
embedding_model = gr.Dropdown([
|
85 |
+
"text2vec-base"
|
86 |
+
],
|
87 |
+
label="Embedding model",
|
88 |
+
value="text2vec-base")
|
89 |
+
|
90 |
+
large_language_model = gr.Dropdown(
|
91 |
+
[
|
92 |
+
"ChatGLM-6B-int4",
|
93 |
+
],
|
94 |
+
label="large language model",
|
95 |
+
value="ChatGLM-6B-int4")
|
96 |
+
|
97 |
+
with gr.Tab("select"):
|
98 |
+
selectFile = gr.Dropdown(file_list,
|
99 |
+
label="content file",
|
100 |
+
interactive=True,
|
101 |
+
value=file_list[0] if len(file_list) > 0 else None)
|
102 |
+
with gr.Tab("upload"):
|
103 |
+
file = gr.File(label="请上传知识库文件",
|
104 |
+
file_types=['.txt', '.md', '.docx', '.pdf']
|
105 |
+
)
|
106 |
+
|
107 |
+
file.upload(upload_file,
|
108 |
+
inputs=file,
|
109 |
+
outputs=selectFile)
|
110 |
+
with gr.Column(scale=4):
|
111 |
+
chatbot = gr.Chatbot(label='Chinese-LangChain').style(height=400)
|
112 |
+
message = gr.Textbox(label='请输入问题')
|
113 |
+
state = gr.State()
|
114 |
+
with gr.Row():
|
115 |
+
clear_history = gr.Button("🧹 清除历史对话")
|
116 |
+
send = gr.Button("🚀 发送")
|
117 |
+
|
118 |
+
# 发送按钮 提交
|
119 |
+
send.click(predict,
|
120 |
+
inputs=[
|
121 |
+
message, large_language_model,
|
122 |
+
embedding_model, state
|
123 |
+
],
|
124 |
+
outputs=[message, chatbot, state])
|
125 |
+
|
126 |
+
# 清空历史对话按钮 提交
|
127 |
+
clear_history.click(fn=clear_session,
|
128 |
+
inputs=[],
|
129 |
+
outputs=[chatbot, state],
|
130 |
+
queue=False)
|
131 |
+
|
132 |
+
# 输入框 回车
|
133 |
+
message.submit(predict,
|
134 |
+
inputs=[
|
135 |
+
message, large_language_model,
|
136 |
+
embedding_model, state
|
137 |
+
],
|
138 |
+
outputs=[message, chatbot, state])
|
139 |
+
with gr.Column(scale=2):
|
140 |
+
message = gr.Textbox(label='搜索结果')
|
141 |
+
demo.queue().launch(server_name='0.0.0.0', server_port=8008, share=False)
|
requirements.txt
ADDED
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
unstructured[local-inference]
|
2 |
+
layoutparser[layoutmodels,tesseract]
|
3 |
+
nltk
|
4 |
+
sentence-transformers
|
5 |
+
beautifulsoup4
|
6 |
+
icetk
|
7 |
+
cpm_kernels
|
8 |
+
faiss-cpu
|
9 |
+
gradio>=3.25.0
|
tests/test_langchain.py
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
|
3 |
+
from langchain.document_loaders import UnstructuredFileLoader
|
4 |
+
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
|
5 |
+
from langchain.vectorstores import FAISS
|
6 |
+
|
7 |
+
embedding_model_name = '/home/searchgpt/pretrained_models/ernie-gram-zh'
|
8 |
+
docs_path = 'docs'
|
9 |
+
embeddings = HuggingFaceEmbeddings(model_name=embedding_model_name)
|
10 |
+
|
11 |
+
docs = []
|
12 |
+
|
13 |
+
for doc in os.listdir(docs_path):
|
14 |
+
if doc.endswith('.txt'):
|
15 |
+
print(doc)
|
16 |
+
loader = UnstructuredFileLoader(f'{docs_path}/{doc}', mode="elements")
|
17 |
+
doc = loader.load()
|
18 |
+
docs.extend(doc)
|
19 |
+
|
20 |
+
vector_store = FAISS.from_documents(docs, embeddings)
|
21 |
+
vector_store.save_local('vector_store_local')
|
22 |
+
search_result = vector_store.similarity_search_with_score(query='科比', k=2)
|
23 |
+
print(search_result)
|
24 |
+
|
25 |
+
loader = UnstructuredFileLoader(f'{docs_path}/added/科比.txt', mode="elements")
|
26 |
+
doc = loader.load()
|
27 |
+
vector_store.add_documents(doc)
|
28 |
+
print(doc)
|
29 |
+
search_result = vector_store.similarity_search_with_score(query='科比·布莱恩特', k=2)
|
30 |
+
print(search_result)
|
31 |
+
|
32 |
+
|
33 |
+
"""
|
34 |
+
[(Document(page_content='王治郅,1977年7月8日出生于北京,前中国篮球运动员,司职大前锋/中锋,现已退役。 [1]', metadata={'source': 'docs/王治郅.txt', 'filename': 'docs/王治郅.txt', 'category': 'Title'}), 285.40765), (Document(page_content='王治郅是中国篮球界进入NBA的第一人,被评选为中国篮坛50大杰出人物和中国申办奥运特使。他和姚明、蒙克·巴特尔一起,被称为篮球场上的“移动长城”。 [5]', metadata={'source': 'docs/王治郅.txt', 'filename': 'docs/王治郅.txt', 'category': 'NarrativeText'}), 290.19086)]
|
35 |
+
[Document(page_content='科比·布莱恩特(Kobe Bryant,1978年8月23日—2020年1月26日),全名科比·比恩·布莱恩特·考克斯(Kobe Bean Bryant Cox),出生于美国宾夕法尼亚州费城,美国已故篮球运动员,司职得分后卫/小前锋。 [5] [24] [84]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'NarrativeText'}), Document(page_content='1996年NBA选秀,科比于第1轮第13顺位被夏洛特黄蜂队选中并被交易至洛杉矶湖人队,整个NBA生涯都效力于洛杉矶湖人队;共获得5次NBA总冠军、1次NBA常规赛MVP、2次NBA总决赛MVP、4次NBA全明星赛MVP、2次NBA赛季得分王;共入选NBA全明星首发阵容18次、NBA最佳阵容15次(其中一阵11次、二阵2次、三阵2次)、NBA最佳防守阵容12次(其中一阵9次、二阵3次)。 [9] [24]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'Title'}), Document(page_content='2007年,科比首次入选美国国家男子篮球队,后帮助美国队夺得2007年美洲男篮锦标赛金牌、2008年北京奥运会男子篮球金牌以及2012年伦敦奥运会男子篮球金牌。 [91]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'Title'}), Document(page_content='2015年11月30日,科比发文宣布将在赛季结束后退役。 [100] 2017年12月19日,湖人队为科比举行球衣退役仪式。 [22] 2020年4月5日,科比入选奈·史密斯篮球名人纪念堂。 [7]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'Title'}), Document(page_content='美国时间2020年1月26日(北京时间2020年1月27日),科比因直升机事故遇难,享年41岁。 [23]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'Title'})]
|
36 |
+
[(Document(page_content='科比·布莱恩特(Kobe Bryant,1978年8月23日—2020年1月26日),全名科比·比恩·布莱恩特·考克斯(Kobe Bean Bryant Cox),出生于美国宾夕法尼亚州费城,美国已故篮球运动员,司职得分后卫/小前锋。 [5] [24] [84]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'NarrativeText'}), 179.68744), (Document(page_content='2015年11月30日,科比发文宣布将在赛季结束后退役。 [100] 2017年12月19日,湖人队为科比举行球衣退役仪式。 [22] 2020年4月5日,科比入选奈·史密斯篮球名人纪念堂。 [7]', metadata={'source': 'docs/added/科比.txt', 'filename': 'docs/added/科比.txt', 'category': 'Title'}), 200.57565)]
|
37 |
+
"""
|