【图解】langchain-chatchat启动流程以及qwen-api模型调用原理


前言

之前我们写了一篇文章在低性能机器上启动langchain-chatchat,我们通过debug看看在这种模式下是如何调用qwen-pai模型的,顺便一起来了解下langchain-chatchat的启动流程
https://blog.csdn.net/kljyrx/article/details/138218738


一、配置

我们这里debug的程序的model_config配置是按照这篇文档配置的
https://blog.csdn.net/kljyrx/article/details/138218738

二、debug流程

1.入口

当我们执行python startup.py -a --lite的时候,实际上第一步就是执行了这里。
大概意思是先判断python版本是否小于3.10,然后决定使用哪个函数来开启异步事件
然后调用 start_main_server 函数
在这里插入图片描述

2.start_main_server函数

2.1 创建多进程并开始参数解析和拼装

这段代码涉及 Python 中的多进程处理。

mp.set_start_method("spawn"):这一行代码设置了多进程启动的方式为 “spawn”。这意味着在创建新的进程时,将会使用子进程来执行。“spawn” 是 Python 中的一个启动方法,它会在创建新进程时启动一个新的 Python 解释器进程,然后在该进程中执行指定的代码。这通常用于避免在创建新进程时出现一些与共享资源相关的问题。
manager = mp.Manager():这一行代码创建了一个 multiprocessing.Manager 对象,用于创建共享的对象,如共享的列表、字典等。在多进程编程中,由于每个进程都有自己独立的内存空间,无法直接共享数据。使用 Manager 对象可以在多个进程之间共享数据,从而实现进程间的通信和同步。
在这里插入图片描述

2.2 进入parse_args函数

这个函数就是帮我们初始化参数的过程。每一个parser.add_argument 都是在建立一个参数,并给初始值。
在这里插入图片描述
以下面这段为例,它的意思是 添加一个参数–all-webui,如果启动命令里有 -a的话那 --all-webui 的值是 true,反之是false。在这个函数的最后一行args = parser.parse_args() 会读取这个参数和参数值。执行下面这句话,我们就可以通过args.all_webui 得到这个参数的值(来自dest)

parser.add_argument(
        "-a",
        "--all-webui",
        action="store_true",
        help="run fastchat's controller/openai_api/model_worker servers, run api.py and webui.py",
        dest="all_webui",
    )

2.3 继续调整一些参数值。执行到后面将args.model_worker赋值为False ,run_mode赋值 为 lite

在这里插入图片描述

2.4 判断是否是 openai_api模式

如果是的话,就执行下面这段
在这里插入图片描述
这段代码是使用 Python 的 multiprocessing 模块创建了两个子进程,每个子进程都执行了一个特定的函数(run_controller 和 run_openai_api)。

具体作用如下:
1) 创建 controller 进程:该进程的任务是运行名为 run_controller 的函数,函数的参数通过 kwargs 参数传递。这里设置了进程的名称为 “controller”,并将进程设置为守护进程(daemon=True)。同时,将创建的进程对象保存在一个字典 processes 中,以便稍后管理。
2) 创建 openai_api 进程:该进程的任务是运行名为 run_openai_api 的函数,这里没有传递任何参数。同样地,设置了进程的名称为 “openai_api”,并将进程设置为守护进程(daemon=True)。也将创建的进程对象保存在 processes 字典中。

2.4 获取模型

这一段中 args.model_name 来自上面参数拼装的代码里,大家可以回过去看下。
这里args.model_name的值是 [‘qwen-api’]
因此第一次循环中 model_name 赋值为 qwen-api。根据这个值,在model_config.py 里找到 qwen-api的配置。
同样的套路,产生一个新进程运行run_model_worker函数,把获取的模型信息以不定参的形式传递给它
在这里插入图片描述

2.5 产生新进程,运行run_api_server和run_webui

看到这一段,大家就会很熟悉了
在这里插入图片描述

2.6 启动processes字典里保存的进程

按照我们的配置,这里会启动controller进程(run_controller),openai_api(run_openai_api),online_api(run_model_worker)在这里插入图片描述

3. run_model_worker

本文只研究 model的启动流程,所以我们直接跳到 run_model_worker
红框里可以看到,我们给它传递来的参数
在这里插入图片描述

3.1 拼装参数

获取配置文件里的参数,也就是我们给 qwen-api配置的那一堆参数

在这里插入图片描述
要说明一点的是 通过get_model_worker_config,取到了worker_class,它是通过如下的provider取到的。这个决定了后面要引入 server.model_workers.qwen.QwenWorker 这个class
在这里插入图片描述

3.2 执行create_model_worker_app

将参数传递给它
在这里插入图片描述

4. create_model_worker_app

因为我们前面传递了 worker_class ,所以会走这一段判断逻辑。它会把参数传递给上面代码里实例化的 worker_class,也就是 server.model_workers.qwen.QwenWorker
在这里插入图片描述

5. QwenWorker类

地址 server/model_workers/qwen.py
第4步,会进入这个类。
它主要是拼装参数,然后调用 super (也就是 ApiModelWorker)的初始化方法
在这里插入图片描述

6.ApiModelWorker类

再次拼装参数,提供了一些新参数 例如 worker_id 等。然后再调用 super (BaseModelWorker)
在这里插入图片描述

7.BaseModelWorker

这一步有个有意思的地方,就是它预埋了一段给ai的对话
在这里插入图片描述

8. 跳转回 startup.py

通过上面的步骤组装好了 一个 worker
在这里插入图片描述

然后把worker传递给app._worker就完成了 在这里插入图片描述

9. 回到run_model_worker

第8步执行create_model_worker_app后的结果保存在app变量里,并进入uvicorn.run(app, host=host, port=port, log_level=log_level.lower())
在这里插入图片描述
这段代码使用了 uvicorn 库来运行一个基于 ASGI(Asynchronous Server Gateway Interface)的应用程序(app)。uvicorn 是一个 ASGI 服务器,用于运行异步的 Python Web 应用程序。

具体作用如下:

uvicorn.run(): 这是 uvicorn 提供的一个函数,用于运行 ASGI 应用程序。它接受几个参数:
app: ASGI 应用程序对象,通常是一个 FastAPI、Starlette 或者其他兼容 ASGI 协议的框架创建的应用程序对象。
host: 服务器绑定的主机名或 IP 地址,默认为 localhost。
port: 服务器监听的端口号,默认为 8000。
log_level: 日志级别,用于控制输出的日志信息的详细程度,通常是一个字符串,如 ‘info’、‘debug’、‘warning’ 等。
这句代码的作用是启动一个 uvicorn 服务器,用指定的主机名和端口号监听请求,并将请求交给指定的 ASGI 应用程序处理。

10. 做完第9步,就启动了一个model_worker 应用程序

三、debug对话流程

我们上面是启动了worker进程,还没有反应如何与在线模型交互的。这部分是在与大模型交互的过程中体现的

1.

server/model_workers/base.py
在这里插入图片描述

2. 执行do_chat

代码位置 server/model_workers/qwen.py

入下图所示,
1)获取qwen-api的配置,组装参数
2)实例化 qwen-api官方的sdk dashscope
3)执行call方法,调用api
在这里插入图片描述
4)千问api返回数据。要注意的是 response不是一个字符串,而是一个实例,每次循环都能通过它取到部分数据。
在这里插入图片描述


  • 36
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值