一起看langchain-chatchat代码 - 不同模型类的引入方法


前言

了解了langchain-chatchat代码的必备知识之后,我们看代码轻松了许多,从这一期开始,我们正式开始看langchain-chatchat的代码。这一篇我们要讲的是langchain-chatchat是如何找到并实例化模型类的


一、疑惑的地方

一般我们都不会太去关注 ① 的代码,觉得只是取配置文件的信息,就直接往下走到 ②
在这里插入图片描述
进入②的函数,在如下的地方就会产生两个疑惑:
1)这个worker_class 到底是什么,是字符串吗?
2) 为什么它可以直接传值,变成一个 worker对象呢
在这里插入图片描述

二、回退之前的代码

1. 回退到run_model_worker

这个worker_class 只能是通过 下图 ① 产生的
在这里插入图片描述

2. 进入 get_model_worker_config

我们可以看到worker_class 是通过getattr(model_workers, provider) 产生的。
在这里插入图片描述
provider 之前的文章里介绍过,它来自配置文件 里的对应模型配置的 provider属性
在这里插入图片描述
那前面的 model_workers呢?
可以看到,它来自下面这句话

from server import model_workers

它是model_workers模块

3. getattr(model_workers, provider) 到底怎么运作的

我们可以写一段代码来测试下

if __name__ == "__main__":


    import server.model_workers as model_workers

    model = getattr(model_workers, "QwenWorker")
    # 获取model的类名
    print(model.__name__)

放到langchain-chatchat的根目录里,用debug模式运行它
第一步:可以看到 引入的model_workers模块实际上包含了它目录下面全部的类
在这里插入图片描述
第二步:可以看到通过 getattr 筛选了 QwenWorker这个类
在这里插入图片描述

4. 解析

1) 在model_workers模块下有一个 init.py 程序,它的代码是这样。

.base 里的 . 指的是 当前目录 也就是 当前目录里的 base.py 文件。以下以此类推。
那为什么其他的都是 明确类名,.base 引入的是 * 呢,因为base.py 里有多个类

通过import server.model_workers as model_workers得到一个包含多个类的实例的模块。因为文件特别多,所以我们能感觉到代码有一段时间的延迟

from .base import *
from .zhipu import ChatGLMWorker
from .minimax import MiniMaxWorker
from .xinghuo import XingHuoWorker
from .qianfan import QianFanWorker
from .fangzhou import FangZhouWorker
from .qwen import QwenWorker
from .baichuan import BaiChuanWorker
from .azure import AzureWorker
from .tiangong import TianGongWorker
from .gemini import GeminiWorker

2)getattr(model_workers, “QwenWorker”) 获取 属性名为 QwenWorker的实例


总结

现在我们就能看懂这段代码了。我们看代码的时候可以更细节一些,遇到不明白的函数和流程最好不要囫囵吞枣的绕过去了。可以查查资料,弄明白。

对了还要补一小段。下面这种写法会在 pop之后,键"a"就被删掉了。langchain-chatchat特别喜欢用这个写法。所以如果还想往其他函数传kwargs ,我们就要特别注意是不是在上一个函数里被pop掉了

kwargs = {"a": 1, "b": 2}
print(kwargs.pop("a"))
  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值