(25-5-03)基于本地知识库的自动问答系统(LangChain+ChatGLM+ModelScope/Huggingface部署):实现Web端的问答系统(3)

(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 进行交互。具体实现流程如下所示:

  1. 初始化模型状态:调用 init_model() 函数初始化模型,并将状态存储在 model_status 变量中。
  2. 定义 Gradio 应用程序界面
  • 创建了一个 gr.Blocks() 对象,命名为 demo。
  • 使用 gr.Markdown() 定义了界面的标题和项目介绍信息。
  • 创建了模型选择、模型参数配置、文件上传、聊天界面等交互元素,并使用不同的布局方式进行排列。
  • 通过按钮的点击事件,用户可以重新加载模型、初始化知识库文件向量化、发送消息、清除历史记录等。
  1. 设置按钮点击事件
  • load_model_button 按钮点击事件调用 reinit_model() 函数重新加载模型。
  • init_vs 按钮点击事件调用 init_vector_store() 函数初始化知识库文件向量化。
  • send 按钮点击事件调用 predict() 函数进行消息预测。
  • clear_history 按钮点击事件调用 clear_session() 函数清除会话历史。
  1. 设置消息提交事件:message 文本框通过 submit() 方法,实现用户输入消息后自动调用 predict() 函数进行预测。
  2. 启动 Gradio 应用程序
  • 通过 demo.queue().launch()方法将应用程序部署到 Web 服务器上,监听指定的 IP 地址和端口号。
  • 设置需要的参数,包括并发处理请求数、是否显示 API 文档、是否注册公共 URL、是否自动打开浏览器等。
  • 这样,用户可以通过访问部署的 Web 页面与 ChatLLM 模型进行交互,提出问题并获取回答。

注意:到目前为止,LangChain 实现了以下核心功能:

  1. 基于预训练语言模型的自然语言处理功能,包括文本生成、文本分类、文本相似度计算等。
  2. 基于预训练语言模型的问答系统功能,能够根据用户的提问,在给定的知识库中检索相关信息并进行回答。
  3. 文本嵌入功能,能够将文本转换为语义空间中的向量表示,便于进行语义匹配和检索。
  4. 支持多种预训练语言模型和嵌入模型,用户可以根据需求选择合适的模型进行应用。
  5. 整合了外部搜索引擎的功能,可以在用户提问时进行网络检索,获取额外的信息来辅助回答用户的问题。

上述功能使得 LangChain 成为一个强大的自然语言处理工具,可以用于各种文本处理和语义理解的任务中。

  • 35
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值