【debug图解】langchain-chatchat如何调用在线Embedding

本文详细描述了Langchain-Chatchat中如何通过点击“向量更新接口”进行在线Embedding的调试过程,涉及从添加至向量库的各个函数调用,包括KBService、FaissKBService、QwenWorker等类的实现和交互。
摘要由CSDN通过智能技术生成


前言

上一篇文章介绍了怎么通过使用在线llm和在线Embedding
https://blog.csdn.net/kljyrx/article/details/138218738
这篇文章想给大家debug的方式演示langchain-chatchat是如何使用在线Embedding的


一、我们从重新添加至向量库入手

因为这个按钮可以重复点击,每次点击都会调用Embedding,所以大家可以用来反复debug(最好测试文档里的字少一点,不然会浪费很多的免费Embedding额度)。
在这里插入图片描述

二、debug步骤

1.“向量更新接口”注册

程序地址:
server/api.py
它的作用是把/knowledge_base/update_docs注册到update_docs这个函数上
在这里插入图片描述

2.进入update_docs函数

代码地址:server/knowledge_base/kb_doc_api.py

实际执行的代码如下:
1)传递知识库信息
在这里插入图片描述
我的知识库如下所示,所以这里的kb实例化的是FaissKBService这个类,它继承的是KBService在这里插入图片描述2)在往下看,里面有两个相似的的 kb.update_doc 因为我们这里是通过制定doc来执行,所以应该是执行上面 红框里这段在这里插入图片描述

3.进入KBService的update_doc 方法

代码地址
server/knowledge_base/kb_service/base.py
这一段的 大概意思是 监测到如果上传的doc文档文件存在的话,就执行KBService的delete_doc 再执行 KBService的add_doc方法。也就是update是先删再重新添加。所以如果是新添加的就直接执行KBService的add_doc方法了
在这里插入图片描述

4.进入KBService的add_doc 方法

server/knowledge_base/kb_service/base.py
add_doc也没有过多的封装,直接调用了 do_add_doc方法。要注意的是这个方法是个构造函数,它是在继承KBService的类里要重新实现的。
在这里插入图片描述
构造函数如下

    @abstractmethod
    def do_add_doc(self,
                   docs: List[Document],
                   **kwargs,
                   ) -> List[Dict]:
        """
        向知识库添加文档子类实自己逻辑
        """
        pass

5.进入FaissKBService的add_doc 方法

server/knowledge_base/kb_service/faiss_kb_service.py
大家可能奇怪,为什么会进到这里。
1)首先,这个类继承了KBService
2)其次,如上所述在第2步的 kb.update_doc里的kb实际上是FaissKBService
在这里插入图片描述

6.进入KBService的_docs_to_embeddings方法

地址 server/knowledge_base/kb_service/base.py
它只做了一件事,就是调用embed_documents
在这里插入图片描述

7.进入embed_documents方法

地址 server/embeddings_api.py
1)执行embed_texts
在这里插入图片描述
2) embed_texts函数
这一步就值得看了:
它先判断,我们取的embed_model 是否在本地Embedding配置里。我们配置的是 qwen-api,很显然不在本地Embedding配置里。
然后判断是否在api列表里。这里要注意的是langchain-chatchat没有专门为Embedding写一个在线的配置,它是直接读的在线llm配置。
在这张图里可以看到传进来的embed_mode 是 qwen-api
接下来就走到34行

resp = worker.do_embeddings(params)

在这里插入图片描述
仔细看这三句话,它通过 qwen-api取到了worker_class,然后再实例化它

config = get_model_worker_config(embed_model)
            worker_class = config.get("worker_class")
            embed_model = config.get("embed_model")
            worker = worker_class() 

它实际上是读的这段配置里的provider,这个provider对应的就是要实例化的类QwenWorker
在这里插入图片描述

8.进入QwenWorker类

server/model_workers/qwen.py
看到这里大家就恍然大悟了,这里是它真正调用千问api接口的地方
在这里插入图片描述


总结

langchain-chatchat包的层级非常多,看代码的时候需要耐心。看熟悉了,后面再想查找问题,就会简单的多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值