文章目录
前言
上一篇文章介绍了怎么通过使用在线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这个类,它继承的是KBService2)在往下看,里面有两个相似的的 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包的层级非常多,看代码的时候需要耐心。看熟悉了,后面再想查找问题,就会简单的多。