(11)函数reinit_model的功能是尝试重新初始化模型配置,以提供给对话系统使用。在尝试重新加载模型配置时,如果出现异常,它将返回一个包含错误信息的历史列表。如果成功重新加载模型,它将返回一个包含成功信息的历史列表,表明可以开始对话。函数reinit_model接收三个参数:large_language_model(大型语言模型)、embedding_model(嵌入模型)和 history(对话历史)。
def reinit_model(large_language_model, embedding_model, history):
try:
knowladge_based_chat_llm.init_model_config(
large_language_model=large_language_model,
embedding_model=embedding_model)
model_status = """模型已成功重新加载,可以开始对话"""
except Exception as e:
model_status = """模型未成功重新加载,请点击重新加载模型"""
return history + [[None, model_status]]
(12)函数init_vector_store用于初始化知识向量存储,此函数接收一个文件对象 file_obj作为参数,并利用knowladge_based_chat_llm对象的 init_knowledge_vector_store方法来生成一个包含文件对象名称的知识向量存储。然后,返回这个知识向量存储。
def init_vector_store(file_obj):
vector_store = knowladge_based_chat_llm.init_knowledge_vector_store(
file_obj.name)
return vector_store
(13)函数predict用于预测用户输入的问题,并返回相应的答案。首先,它检查历史记录是否为 None,如果是,则将其设置为空列表。然后,根据是否使用网络搜索,获取网络内容。接下来,调用 knowladge_based_chat_llm 对象的 get_knowledge_based_answer 方法,传入相应的参数,以获取基于知识的答案。最后,将问题和对应的答案添加到历史记录中,并返回空字符串作为响应,以及更新后的历史记录。
def predict(input,
use_web,
top_k,
history_len,
temperature,
top_p,
history=None):
if history == None:
history = []
if use_web == 'True':
web_content = search_web(query=input)
else:
web_content = ''
resp = knowladge_based_chat_llm.get_knowledge_based_answer(
query=input,
web_content=web_content,
top_k=top_k,
history_len=history_len,
temperature=temperature,
top_p=top_p,
history=history)
history.append((input, resp['result']))
return '', history, history
函数predict接收多个参数,包括输入的问题 input、是否使用网络搜索 use_web、检索知识的数量 top_k、历史记录的长度 history_len、温度 temperature、top-p 参数 top_p,以及可选的历史记录 history。
(14)下面这部分代码是一个 Gradio 应用程序的配置部分,主要功能是创建一个 Web 用户界面,以便用户可以与基于知识的 ChatLLM 进行交互。首先,定义了一个 Gradio 的 Blocks 对象 block,并在其中定义了应用程序的布局和各种交互元素。界面由模型选择、模型参数配置、文件上传、文本输入框、历史记录清除按钮和发送按钮等组成。
model_status = init_model()
if __name__ == "__main__":
block = gr.Blocks()
with block as demo:
gr.Markdown("""<h1><center>LangChain-ChatLLM-Webui</center></h1>
<center><font size=3>
本项目基于LangChain和大型语言模型系列模型, 提供基于本地知识的自动问答应用. <br>
目前项目提供基于<a href='https://github.com/THUDM/ChatGLM-6B' target="_blank">ChatGLM-6B </a>的LLM和包括GanymedeNil/text2vec-large-chinese、nghuyong/ernie-3.0-base-zh、nghuyong/ernie-3.0-nano-zh在内的多个Embedding模型, 支持上传 txt、docx、md、pdf等文本格式文件. <br>
后续将提供更加多样化的LLM、Embedding和参数选项供用户尝试, 欢迎关注<a href='https://github.com/thomas-yanxin/LangChain-ChatGLM-Webui' target="_blank">Github地址</a>.
</center></font>
""")
model_status = gr.State(model_status)
with gr.Row():
with gr.Column(scale=1):
model_choose = gr.Accordion("模型选择")
with model_choose:
large_language_model = gr.Dropdown(
llm_model_list,
label="large language model",
value=init_llm)
embedding_model = gr.Dropdown(list(
embedding_model_dict.keys()),
label="Embedding model",
value=init_embedding_model)
load_model_button = gr.Button("重新加载模型")
model_argument = gr.Accordion("模型参数配置")
with model_argument:
top_k = gr.Slider(1,
10,
value=6,
step=1,
label="vector search top k",
interactive=True)
history_len = gr.Slider(0,
5,
value=3,
step=1,
label="history len",
interactive=True)
temperature = gr.Slider(0,
1,
value=0.01,
step=0.01,
label="temperature",
interactive=True)
top_p = gr.Slider(0,
1,
value=0.9,
step=0.1,
label="top_p",
interactive=True)
file = gr.File(label='请上传知识库文件',
file_types=['.txt', '.md', '.docx', '.pdf'])
init_vs = gr.Button("知识库文件向量化")
use_web = gr.Radio(["True", "False"],
label="Web Search",
value="False")
with gr.Column(scale=4):
chatbot = gr.Chatbot([[None, model_status.value]],
label='ChatLLM').style(height=750)
message = gr.Textbox(label='请输入问题')
state = gr.State()
with gr.Row():
clear_history = gr.Button("🧹 清除历史对话")
send = gr.Button("🚀 发送")
load_model_button.click(
reinit_model,
show_progress=True,
inputs=[large_language_model, embedding_model, chatbot],
outputs=chatbot,
)
init_vs.click(
init_vector_store,
show_progress=True,
inputs=[file],
outputs=[],
)
send.click(predict,
inputs=[
message, use_web, top_k, history_len, temperature,
top_p, state
],
outputs=[message, chatbot, state])
clear_history.click(fn=clear_session,
inputs=[],
outputs=[chatbot, state],
queue=False)
message.submit(predict,
inputs=[
message, use_web, top_k, history_len,
temperature, top_p, state
],
outputs=[message, chatbot, state])
gr.Markdown("""提醒:<br>
1. 使用时请先上传自己的知识文件,并且文件中不含某些特殊字符,否则将返回error. <br>
2. 有任何使用问题,请通过[Github Issue区](https://github.com/thomas-yanxin/LangChain-ChatGLM-Webui/issues)进行反馈. <br>
""")
#用于处理请求的线程
demo.queue(concurrency_count=3) \
.launch(server_name='0.0.0.0', #监听的 IP 地址,0.0.0.0 表示接受所有入站流量,127.0.0.1 表示本地入站
server_port=7860, # 监听的端口号
show_api=False, # 是否显示 API 文档
share=False, # 是否注册公共 URL
inbrowser=False) # 是否自动打开浏览器
上述代码创建了一个基于 Gradio 框架的 Web 用户界面,允许用户与 ChatLLM 进行交互。具体实现流程如下所示:
- 初始化模型状态:调用 init_model() 函数初始化模型,并将状态存储在 model_status 变量中。
- 定义 Gradio 应用程序界面
- 创建了一个 gr.Blocks() 对象,命名为 demo。
- 使用 gr.Markdown() 定义了界面的标题和项目介绍信息。
- 创建了模型选择、模型参数配置、文件上传、聊天界面等交互元素,并使用不同的布局方式进行排列。
- 通过按钮的点击事件,用户可以重新加载模型、初始化知识库文件向量化、发送消息、清除历史记录等。
- 设置按钮点击事件
- load_model_button 按钮点击事件调用 reinit_model() 函数重新加载模型。
- init_vs 按钮点击事件调用 init_vector_store() 函数初始化知识库文件向量化。
- send 按钮点击事件调用 predict() 函数进行消息预测。
- clear_history 按钮点击事件调用 clear_session() 函数清除会话历史。
- 设置消息提交事件:message 文本框通过 submit() 方法,实现用户输入消息后自动调用 predict() 函数进行预测。
- 启动 Gradio 应用程序
- 通过 demo.queue().launch()方法将应用程序部署到 Web 服务器上,监听指定的 IP 地址和端口号。
- 设置需要的参数,包括并发处理请求数、是否显示 API 文档、是否注册公共 URL、是否自动打开浏览器等。
- 这样,用户可以通过访问部署的 Web 页面与 ChatLLM 模型进行交互,提出问题并获取回答。
注意:到目前为止,LangChain 实现了以下核心功能:
- 基于预训练语言模型的自然语言处理功能,包括文本生成、文本分类、文本相似度计算等。
- 基于预训练语言模型的问答系统功能,能够根据用户的提问,在给定的知识库中检索相关信息并进行回答。
- 文本嵌入功能,能够将文本转换为语义空间中的向量表示,便于进行语义匹配和检索。
- 支持多种预训练语言模型和嵌入模型,用户可以根据需求选择合适的模型进行应用。
- 整合了外部搜索引擎的功能,可以在用户提问时进行网络检索,获取额外的信息来辅助回答用户的问题。
上述功能使得 LangChain 成为一个强大的自然语言处理工具,可以用于各种文本处理和语义理解的任务中。