Langchain-Chatchat[三、知识库管理的 RAG]

文章目录

  • 前言
  • [一、知识库管理的 RAG流程图](#一、知识库管理的 RAG流程图)
  • 二、流程核心部分说明
  • 三、核心类说明
    • [1.base.py 管理知识库基础类](#1.base.py 管理知识库基础类)
      • [1.1 class KBService(ABC):](#1.1 class KBService(ABC):)
        • [Function Def save_vector_store(self)](#Function Def save_vector_store(self))
        • [Function Def create_kb(self)](#Function Def create_kb(self))
        • [Function Def add_doc(self, kb_file, docs)](#Function Def add_doc(self, kb_file, docs))
      • [1.2 class KBServiceFactory:](#1.2 class KBServiceFactory:)
    • [2. class PGKBService(KBService):](#2. class PGKBService(KBService):)
      • [Function Def _load_pg_vector(self)](#Function Def _load_pg_vector(self))
      • [Function Def get_doc_by_ids(self, ids)](#Function Def get_doc_by_ids(self, ids))
      • [Function Def del_doc_by_ids(self, ids)](#Function Def del_doc_by_ids(self, ids))
      • [Function Def do_init(self)](#Function Def do_init(self))
      • [Function Def do_create_kb(self)](#Function Def do_create_kb(self))
      • [Function Def vs_type(self)](#Function Def vs_type(self))
      • [Function Def do_drop_kb(self)](#Function Def do_drop_kb(self))
      • [Function Def do_search(self, query, top_k, score_threshold)](#Function Def do_search(self, query, top_k, score_threshold))
      • [Function Def do_add_doc(self, docs)](#Function Def do_add_doc(self, docs))
      • [Function Def do_delete_doc(self, kb_file)](#Function Def do_delete_doc(self, kb_file))
      • [Function Def do_clear_vs(self)](#Function Def do_clear_vs(self))

前言

Langchain-Chatchat基于知识库管理 代码解析

知识库管理如图:
新创建知识库【智慧城市 (pg @ text-embedding-v1)】

前提
Langchain-Chatchat[一、本地开发环境部署]

PyCharm 配置debug调试参数:start -a


一、知识库管理的 RAG流程图

图一:

图二:

二、流程核心部分说明

1.文本和元数据embeddings后,添加到向量库

vectorstores.py#def add_texts

代码如下(片断):

python@abstractmethod 复制代码
def add_texts(
	self,
	texts: Iterable[str],
	metadatas: Optional[List[dict]] = None,
	**kwargs: Any,
) -> List[str]:

说明:抽象方法,将文本和元数据embeddings后,添加到向量库,由遵循此标准的类(如 FAISS向量库类、Milvus向量库类、PG向量库类等)实现

实现类:PG向量库类

pgvector.py#def add_texts

python 复制代码
  def add_texts(
        self,
        texts: Iterable[str],
        metadatas: Optional[List[dict]] = None,
        ids: Optional[List[str]] = None,
        **kwargs: Any,
    ) -> List[str]:
        """Run more texts through the embeddings and add to the vectorstore.

        Args:
            texts: Iterable of strings to add to the vectorstore.
            metadatas: Optional list of metadatas associated with the texts.
            kwargs: vectorstore specific parameters

        Returns:
            List of ids from adding the texts into the vectorstore.
        """
        embeddings = self.embedding_function.embed_documents(list(texts))
        return self.add_embeddings(
            texts=texts, embeddings=embeddings, metadatas=metadatas, ids=ids, **kwargs
        )

说明:PG向量库类将文本和元数据embeddings后添加到向量库

1.1 文本加强

embedding_function.embed_documents(list(texts))

说明:文本加强,由大模型加强模型embedding models实现,如BaichuanTextEmbeddings、ZhipuAIEmbeddings,返回embeddings对象

1.2 批量插入embeddings对象到数据库

python 复制代码
def add_embeddings(
        self,
        texts: Iterable[str],
        embeddings: List[List[float]],
        metadatas: Optional[List[dict]] = None,
        ids: Optional[List[str]] = None,
        **kwargs: Any,
    ) -> List[str]:
        """Add embeddings to the vectorstore.
        Args:
            texts: Iterable of strings to add to the vectorstore.
            embeddings: List of list of embedding vectors.
            metadatas: List of metadatas associated with the texts.
            kwargs: vectorstore specific parameters
        """
        if ids is None:
            ids = [str(uuid.uuid4()) for _ in texts]

        if not metadatas:
            metadatas = [{} for _ in texts]

        with Session(self._bind) as session:  # type: ignore[arg-type]
            collection = self.get_collection(session) # 获取当前操作的集合对象
            if not collection:
                raise ValueError("Collection not found")
            documents = []
            for text, metadata, embedding, id in zip(texts, metadatas, embeddings, ids):
                # 每个文档创建ORM 模型实例
                embedding_store = self.EmbeddingStore(
                    embedding=embedding,
                    document=text,
                    cmetadata=metadata,
                    custom_id=id,
                    collection_id=collection.uuid,
                )
                documents.append(embedding_store)
            #批量插入到数据库
            session.bulk_save_objects(documents)
            session.commit()

        return ids

三、核心类说明

1.base.py 管理知识库基础类

复制代码
  位置:knowledge_base/kb_service/base.py,KBService 类定义系列方法用于管理知识库,包括创建知识库 、
   删除知识库、向知识库添加文档、从知识库删除文档、更新知识库信息、文档搜索等。它是一个抽象基类(ABC)
 , 通过继承它的子类来实现具体的功能。允许不同类型的知识库服务(如Faiss、Milvus、Elasticsearch等)实现
 相同的接口,从而提供一致的操作方式。
    KBService 类在项目中被多个子类继承,每个子类代表一种特定类型的知识库服务,例如`FaissKBService`、
    `MilvusKBService`等。这些子类实现了KBService类中定义的抽象方法.

此外,KBService 类还与KBServiceFactory类相关联,KBServiceFactory类提供了get_serviceget_service_by_name方法,用于根据知识库名称和向量存储类型动态创建相应的知识库服务实例。

1.1 class KBService(ABC):

python 复制代码
class KBService(ABC):
     # 初始化KBService类的实例
    def __init__(
        self,
        knowledge_base_name: str,
        kb_info: str = None,
        embed_model: str = get_default_embedding(),      
    ):
        self.kb_name = knowledge_base_name
        self.kb_info = kb_info or Settings.kb_settings.KB_INFO.get(
            knowledge_base_name, f"关于{knowledge_base_name}的知识库"
        )
        self.embed_model = embed_model  #嵌入模型
        self.kb_path = get_kb_path(self.kb_name)
        self.doc_path = get_doc_path(self.kb_name)
        self.do_init()
     
     ......

Function Def save_vector_store(self)

save_vector_store : 此函数的功能是保存向量库。 参数 : 此函数没有参数。
代码描述:将向量库的数据持久化保存。根据不同的向量库类型(如FAISS、Milvus等)采取不同的保存策略。例如Milvus类型的向量库,数据则会被保存到数据库中。

在项目中,save_vector_store函数被多个地方调用,以确保在进行文档的上传、删除、更新或向量库重建等操作后,向量库的状态能够被正确地保存。这些调用场景包括:

  • 文档上传(upload_docs):在上传文档并进行向量化处理后,根据not_refresh_vs_cache参数的值决定是否立即保存向量库。
  • 文档删除(delete_docs):在删除指定的文档后,根据not_refresh_vs_cache参数的值决定是否立即保存向量库。
  • 文档更新(update_docs):在更新文档内容并进行向量化处理后,根据not_refresh_vs_cache参数的值决定是否立即保存向量库。
  • 向量库重建(recreate_vector_storeoutput方法):在重建向量库的过程中,完成所有文档的向量化处理后,根据not_refresh_vs_cache参数的值决定是否立即保存向量库。
  • 数据库文档清理(prune_db_docs):在从数据库中删除不存在于本地文件夹中的文档后,保存向量库以确保向量库与数据库的一致性。

Function Def create_kb(self)

create_kb : 此函数的功能是创建知识库。 参数: 此函数没有参数。

代码描述 : 负责知识库的创建流程。该方法首先检查指定的文档路径是否存在,如果不存在,则创建该路径。接着,调用 do_create_kb 方法,这是一个预留给开发者的扩展点,允许在知识库创建的基础流程中插入自定义逻辑。之后,该方法会调用 add_kb_to_db 函数,将知识库的名称、简介、向量库类型和嵌入模型等信息添加到数据库中。add_kb_to_db 函数的执行结果(状态)会被返回,表示知识库创建操作的成功与否。

注意:

  • do_create_kb 方法默认不执行任何操作,需要在继承 KBService 类的子类中根据具体需求重写此方法。

输出示例: 返回一个布尔值,表示知识库创建操作的成功与否。


Function Def add_doc(self, kb_file, docs)

add_doc: 此函数用于向知识库添加文件。

参数:

  • kb_file: KnowledgeFile类型的对象,表示要添加到知识库的文件。
  • docs: Document类型的列表,默认为空列表。这些是要添加到知识库的文档。
  • **kwargs: 接收额外的关键字参数,这些参数将传递给内部方法。

代码描述 :

调用kb_filefile2text方法将文件内容转换为文档列表。

调用delete_doc方法删除知识库中与kb_file相对应的旧文档。

调用do_add_doc方法将文档添加到知识库中,该方法需要在子类中具体实现,返回(doc_infos)。

调用add_file_to_db函数,将文件信息(doc_infos)添加到数据库中

最后,函数根据操作结果返回一个状态值,如果文档列表为空,则直接返回False

输出示例:返回值主要用于指示操作是否成功。

1.2 class KBServiceFactory:

复制代码
    提供一个静态方法工厂,用于根据不同的参数创建并返回不同类型的知识库服务实例。

属性:该类没有定义属性,所有功能都通过静态方法实现。

代码描述:提供三个静态方法,分别用于根据不同的条件获取知识库服务实例。

  1. get_service 方法接受知识库名称(kb_name)、向量存储类型(vector_store_type)、嵌入模型名称(embed_model)作为参数。该方法首先会检查向量存储类型是否为字符串,如果是,则将其转换为 SupportedVSType 枚举类型。根据向量存储类型的不同,方法会动态导入并返回对应的知识库服务实例,如 FaissKBService、PGKBService、MilvusKBService 等,这些服务实例都继承自 KBService 基类。

  2. get_service_by_name 方法接受知识库名称(kb_name)作为参数,通过调用数据库加载函数 load_kb_from_db 来获取知识库的向量存储类型和嵌入模型名称,然后调用 get_service 方法来获取对应的知识库服务实例。

  3. get_default 方法不接受任何参数,直接返回一个默认向量存储类型为 SupportedVSType.DEFAULT 的知识库服务实例。

在项目中KBServiceFactory 被多个模块调用,用于创建、删除、更新、搜索知识库中的文档,以及上传和下载文档等操作。例如,在 knowledge_base_chat.py 中,通过 KBServiceFactory 获取知识库服务实例来搜索知识库中的文档;在 kb_api.py 中,通过 KBServiceFactory 创建新的知识库或删除现有知识库。

输出示例

返回的知识库服务实例根据不同的向量存储类型,将具有不同的方法和属性,用于执行知识库的相关操作。

2. class PGKBService(KBService):

复制代码
  KBService子类,通过 PostgreSQL 实现父类KBService知识库服务的具体方法。
  位置:knowledge_base/kb_service/pg_kb_service.py 
Html 复制代码
**属性**:
- `engine`: 通过 SQLAlchemy 创建的连接引擎,用于与 PostgreSQL 数据库进行交互。
- `pg_vector`: 用于存储和检索嵌入向量的 PGVector 实例。

**代码描述**:
	PGKBService 类继承自 KBService 类,提供了与 PostgreSQL 数据库交互的具体实现。
	它使用 SQLAlchemy 作为 ORM 工具,通过 `engine` 属性与数据库建立连接。
	此类主要负责初始化向量存储、文档的增删查改、知识库的创建和删除等操作。
 `_load_pg_vector` 方法用于加载 PGVector 实例,该实例负责嵌入向量的存储和检索。
- `get_doc_by_ids` 方法通过文档 ID 获取文档内容和元数据。
- `del_doc_by_ids` 方法删除指定 ID 的文档,实际调用基类的同名方法。
- `do_init` 方法在类初始化时被调用,用于加载 PGVector 实例。
- `do_create_kb` 方法是创建知识库的具体实现,当前为空实现。
- `vs_type` 方法返回支持的向量存储类型,即 PostgreSQL。
- `do_drop_kb` 方法删除知识库,包括数据库中的相关记录和文件系统上的知识库路径。
- `do_search` 方法实现了基于查询的文档搜索功能,返回与查询最相关的文档列表。
- `do_add_doc` 方法向知识库添加文档,并返回添加的文档信息。
- `do_delete_doc` 方法从知识库删除指定的文档。
- `do_clear_vs` 方法清空向量存储中的所有内容,并重新创建集合。

**注意**:
- 使用 PGKBService 类前确保 PostgreSQL 数据库已经正确配置,位置: kb_settings.yaml文件
- `kbs_config` 中 `pg` 配置。
- 在调用 `do_add_doc` 和 `do_delete_doc` 等方法修改数据库内容时,需要确保传入的参数符合预期格式,
- 以避免执行错误或数据损坏。

**输出示例**:
```python
# 假设调用 get_doc_by_ids 方法查询 ID 为 ['doc1', 'doc2'] 的文档
docs = pgkb_service.get_doc_by_ids(['doc1', 'doc2'])
# 可能的返回值为
[
    Document(page_content="文档1的内容", metadata={"author": "作者1"}),
    Document(page_content="文档2的内容", metadata={"author": "作者2"})
]

此示例展示了通过文档 ID 获取文档内容和元数据的过程及其可能的返回值。

Function Def _load_pg_vector(self)

_load_pg_vector: 此函数的功能是加载PostgreSQL向量空间搜索引擎。

参数: 此函数没有显式参数,但它依赖于类实例的多个属性。

代码描述 : _load_pg_vector函数负责初始化一个PGVector实例,该实例用于在PostgreSQL数据库中进行向量空间搜索。这个过程包括以下几个关键步骤:

  1. 使用EmbeddingsFunAdapter类创建一个嵌入函数适配器。这个适配器基于类实例的embed_model属性,用于将文本转换为向量表示。EmbeddingsFunAdapter支持同步和异步两种文本嵌入方式,适用于不同的应用场景。

  2. 指定向量空间搜索的集合名称,这里使用类实例的kb_name属性作为集合名称。

  3. 设置距离策略为欧几里得距离(DistanceStrategy.EUCLIDEAN),用于计算向量之间的距离。

  4. 使用PGKBService.engine作为数据库连接。这是一个类属性,表示与PostgreSQL数据库的连接引擎。

  5. 通过kbs_config.get("pg").get("connection_uri")获取数据库连接字符串,这个字符串包含了数据库的地址、端口、用户名、密码等信息,用于建立数据库连接。

通过这些步骤,_load_pg_vector函数配置了一个用于向量空间搜索的PGVector实例,并将其保存在类实例的pg_vector属性中。这使得类的其他方法可以利用这个PGVector实例来执行向量空间搜索操作,例如查找与给定文本向量最相似的文档。

注意:

  • 在调用_load_pg_vector函数之前,需要确保类实例的embed_modelkb_name属性已经被正确设置。这些属性对于初始化PGVector实例至关重要。
  • PGKBService.engine需要预先配置好,确保能够成功连接到PostgreSQL数据库。
  • 数据库连接字符串应该保密处理,避免泄露数据库的敏感信息。

此函数是在do_init方法中被调用的,do_init方法负责执行类的初始化操作,包括加载PostgreSQL向量空间搜索引擎。这表明_load_pg_vector函数是类初始化过程的一个重要组成部分,确保了向量空间搜索功能的可用性。


Function Def get_doc_by_ids(self, ids)

get_doc_by_ids: 此函数的功能是根据提供的ID列表查询并返回相应的文档列表。

参数:

  • ids: 一个字符串列表,包含需要查询的文档的ID。

代码描述 :
get_doc_by_ids 函数接受一个字符串列表 ids 作为参数,这个列表包含了需要查询的文档的ID。函数内部首先使用 Session 上下文管理器创建一个会话,通过这个会话与数据库进行交互。接着,定义了一个SQL查询语句 stmt,这个语句用于从名为 langchain_pg_embedding 的表中选取 documentcmetadata 字段,条件是 collection_id 字段的值包含在参数 ids 提供的ID列表中。

通过执行这个查询语句并传入 ids 参数,函数会从数据库中检索出匹配的记录。每条记录都会被用来创建一个 Document 对象,这个对象包含了检索到的文档内容(page_content)和元数据(metadata)。所有这些 Document 对象随后被收集到一个列表中,并作为函数的返回值。

注意:

  • 确保传入的ID列表 ids 不为空,且每个ID都是有效的,以确保查询能够正确执行。
  • 此函数依赖于数据库表 langchain_pg_embedding 的结构,特别是它查询的字段。如果数据库结构发生变化,可能需要相应地更新此函数。

输出示例 :

假设数据库中有两条记录的 collection_id 匹配给定的ID列表,函数可能返回如下的列表:

python 复制代码
[
    Document(page_content="文档内容1", metadata={"作者": "张三", "发布日期": "2023-01-01"}),
    Document(page_content="文档内容2", metadata={"作者": "李四", "发布日期": "2023-02-01"})
]

这个列表包含了两个 Document 对象,每个对象都包含了从数据库检索到的文档内容和元数据。


Function Def del_doc_by_ids(self, ids)

del_doc_by_ids: 此函数的功能是根据提供的ID列表删除文档。

参数:

  • ids: 一个字符串列表,包含要删除的文档的ID。

代码描述 :
del_doc_by_ids 函数接受一个字符串列表 ids 作为参数,这个列表包含了需要从数据库中删除的文档的ID。函数通过调用其父类的 del_doc_by_ids 方法来实现删除操作,并将 ids 参数传递给该方法。这表明实际的删除逻辑被封装在父类的方法中,而当前函数主要负责将删除请求转发给父类处理。

注意:

  • 确保传递给此函数的 ids 参数包含有效的文档ID,否则可能不会有任何文档被删除。
  • 此函数返回一个布尔值,表示删除操作是否成功。但是,具体的成功与否依赖于父类方法的实现细节。
  • 在使用此函数之前,应当了解父类中 del_doc_by_ids 方法的具体实现,以及它对于不同情况下删除操作的处理方式。

输出示例 :

调用 del_doc_by_ids(['doc1', 'doc2']) 可能会返回 True,表示指定ID的文档已成功删除。如果操作失败,可能会返回 False。请注意,实际的返回值取决于父类方法的具体实现。


Function Def do_init(self)

do_init: 此函数的功能是初始化PGKBService类的实例。

参数: 此函数没有参数。

代码描述 : do_init方法是PGKBService类的一个初始化方法,它通过调用_load_pg_vector方法来加载PostgreSQL向量空间搜索引擎。这个过程是类实例化过程中的一个重要步骤,确保了类的实例能够正确地进行向量空间搜索操作。

do_init方法中,通过调用_load_pg_vector方法,完成了以下几个关键的初始化步骤:

  1. 创建一个嵌入函数适配器EmbeddingsFunAdapter,该适配器基于类实例的embed_model属性,用于将文本转换为向量表示。
  2. 指定向量空间搜索的集合名称,使用类实例的kb_name属性作为集合名称。
  3. 设置距离策略为欧几里得距离,用于计算向量之间的距离。
  4. 使用类属性PGKBService.engine作为数据库连接,这表示与PostgreSQL数据库的连接引擎。
  5. 获取数据库连接字符串,用于建立数据库连接。

通过这些步骤,_load_pg_vector方法配置了一个用于向量空间搜索的PGVector实例,并将其保存在类实例的pg_vector属性中。这样,类的其他方法就可以利用这个PGVector实例来执行向量空间搜索操作,例如查找与给定文本向量最相似的文档。

注意:

  • 在调用do_init方法之前,不需要进行特别的准备工作,因为它是类实例化过程中自动调用的初始化方法。
  • 需要确保embed_modelkb_name属性在调用_load_pg_vector之前已经被正确设置,因为这些属性对于初始化PGVector实例至关重要。
  • PGKBService.engine需要预先配置好,以确保能够成功连接到PostgreSQL数据库。
  • 数据库连接字符串应该保密处理,避免泄露数据库的敏感信息。

总的来说,do_init方法通过调用_load_pg_vector方法,完成了PGKBService类实例的初始化,为后续的向量空间搜索操作做好了准备。


Function Def do_create_kb(self)

do_create_kb: 此函数的功能是创建知识库。

参数: 此函数没有参数。

代码描述 : do_create_kb 函数是 PGKBService 类的一个方法,负责创建知识库的具体逻辑。目前,此函数的实现为空(使用了 pass 语句),这意味着它不执行任何操作。在实际应用中,开发者需要在此函数中添加创建知识库的代码逻辑,例如连接数据库、执行数据库操作等。

注意 : 虽然当前 do_create_kb 函数的实现为空,但在将来的开发中,当添加具体的实现逻辑时,需要确保数据库连接的正确性和操作的安全性。此外,考虑到知识库可能包含大量数据,还需要注意性能优化和错误处理。


Function Def vs_type(self)

vs_type: vs_type函数的功能是返回当前知识库服务支持的向量存储类型。

参数: 该函数不接受任何参数。

代码描述: vs_type函数是PGKBService类的一个方法,它的主要作用是标识该知识库服务实例支持的向量存储类型。在这个具体实现中,vs_type方法通过返回SupportedVSType.PG,明确指出PostgreSQL(简称PG)是该服务实例使用的向量存储类型。SupportedVSType是一个枚举类,它定义了项目中支持的所有向量存储类型,包括但不限于FAISS、MILVUS、ZILLIZ、Elasticsearch(ES)、ChromaDB等,以及PG。通过返回SupportedVSType中的一个枚举值,vs_type方法为知识库服务的配置和实例化提供了必要的信息。这种设计使得知识库服务的管理和扩展更加灵活和方便,因为可以根据需要动态选择和切换不同的向量存储服务。

注意:

  • 在使用PGKBService类及其vs_type方法时,应当了解SupportedVSType枚举类中定义的向量存储类型,以确保正确理解和使用该方法返回的向量存储类型信息。
  • 由于vs_type方法返回的是一个枚举成员,因此在处理返回值时,应当注意枚举类型的使用方法,例如通过枚举成员的name或value属性获取具体的信息。

输出示例: 假设调用PGKBService实例的vs_type方法,可能的返回值为:

复制代码
'pg'

这表示当前知识库服务实例使用PostgreSQL作为其向量存储服务。


Function Def do_drop_kb(self)

do_drop_kb: 此函数的功能是删除与指定知识库名称相关联的数据库记录和文件系统中的知识库目录。

参数 : 此函数没有显式参数,但它依赖于self.kb_nameself.kb_path这两个实例变量。

代码描述 :
do_drop_kb函数是PGKBService类的一个方法,用于删除特定知识库相关的数据。该方法首先通过SQL语句删除数据库中与知识库相关联的记录,然后删除文件系统中对应的知识库目录。具体步骤如下:

  1. 使用Session上下文管理器创建一个数据库会话,确保数据库操作在一个会话中完成,并且在操作结束后自动关闭会话。
  2. 在会话中执行SQL删除操作。首先,删除langchain_pg_embedding表中所有collection_idlangchain_pg_collection表中name字段匹配self.kb_name的记录的uuid相匹配的记录。这意味着,所有与指定知识库名称相关联的嵌入信息将被删除。
  3. 接着,删除langchain_pg_collection表中name字段与self.kb_name匹配的记录。这一步骤将删除知识库的集合记录。
  4. 执行session.commit()提交数据库事务,确保上述删除操作被保存到数据库中。
  5. 使用shutil.rmtree函数删除文件系统中的知识库目录。self.kb_path变量指定了知识库目录的路径,该函数将递归删除该目录及其所有内容。

注意:

  • 在执行此函数之前,确保self.kb_nameself.kb_path已经正确设置,分别指向要删除的知识库的名称和路径。
  • 该操作不可逆,一旦执行,相关的数据库记录和文件系统中的目录将被永久删除。因此,在调用此函数之前,请确保已经做好相应的备份或确认不再需要这些数据。
  • 由于直接操作数据库和文件系统,确保执行此操作的用户具有相应的权限。

Function Def do_search(self, query, top_k, score_threshold)

do_search: 此函数的功能是执行文本查询,并根据给定的分数阈值和返回的文档数量上限筛选出相似度最高的文档。

参数:

  • query: 需要查询的文本,数据类型为字符串。
  • top_k: 返回的文档数量上限,数据类型为整数。
  • score_threshold: 分数阈值,用于筛选相似度高于此阈值的文档,数据类型为浮点数。

代码描述 :
do_search函数首先通过EmbeddingsFunAdapter类的实例embed_func,调用embed_query方法将查询文本query转换为嵌入向量。这一步骤是通过将文本转换为向量化表示,以便后续进行相似度搜索。

接着,函数使用self.pg_vectorsimilarity_search_with_score_by_vector方法,传入上一步得到的嵌入向量和top_k参数,执行相似度搜索。此方法返回一个包含文档及其相似度分数的列表,列表中的文档是根据与查询向量的相似度排序的。

最后,函数调用score_threshold_process方法,传入score_thresholdtop_k和相似度搜索的结果,根据分数阈值筛选出符合条件的文档,并返回前top_k个文档。这一步骤确保了返回的文档不仅与查询文本相似度高,而且其相似度分数超过了指定的阈值。

注意:

  • 确保传入的query是有效的字符串,top_k是正整数,score_threshold是非负浮点数。
  • EmbeddingsFunAdapterscore_threshold_process是此函数依赖的关键组件,确保它们的实现与预期一致。
  • 此函数的性能和准确性依赖于嵌入模型的质量和相似度搜索算法的效率。

输出示例 :

假设调用do_search函数,传入查询文本"示例查询",top_k为3,score_threshold为0.5,可能的返回值为:

复制代码
[("文档1", 0.8), ("文档3", 0.7), ("文档5", 0.6)]

这表示在所有文档中,有三个文档的相似度分数满足大于等于0.5的条件,并且是相似度最高的前三个文档。


Function Def do_add_doc(self, docs)

do_add_doc: 此函数的功能是向数据库中添加文档,并返回包含文档ID和元数据的信息列表。

参数:

  • docs: 需要添加到数据库中的文档列表,每个文档都是一个Document对象。
  • **kwargs: 接受可变数量的关键字参数,这些参数可以根据需要传递给底层数据库操作。

代码描述 :
do_add_doc函数首先调用pg_vector对象的add_documents方法,将docs列表中的文档添加到数据库中。add_documents方法返回一个包含每个文档ID的列表。然后,函数遍历这些ID和原始的docs列表,使用列表推导式创建一个新的列表doc_infos。这个新列表的每个元素都是一个字典,包含两个键:idmetadataid键对应于文档的ID,metadata键对应于文档的元数据。最后,函数返回doc_infos列表。

注意:

  • 确保传递给do_add_doc函数的docs参数是一个Document对象的列表,且每个Document对象都应该有有效的元数据。
  • 传递给**kwargs的关键字参数将直接影响底层数据库操作,因此请谨慎使用,确保了解这些参数的影响。

输出示例 :

假设我们向do_add_doc函数传递了两个文档,且这两个文档成功添加到数据库中,函数可能返回如下列表:

python 复制代码
[
    {"id": "doc1_id", "metadata": {"title": "Document 1 Title", "author": "Author Name"}},
    {"id": "doc2_id", "metadata": {"title": "Document 2 Title", "author": "Another Author Name"}}
]

这个列表包含了每个文档的ID和元数据,可以用于进一步的处理或显示。


Function Def do_delete_doc(self, kb_file)

do_delete_doc: 此函数用于从数据库中删除与指定知识文件相关联的文档向量。

参数:

  • kb_file: KnowledgeFile对象,代表需要删除其文档向量的知识库文件。
  • **kwargs: 接收额外的关键字参数,以便在未来的版本中扩展功能而不影响现有接口。

代码描述 :
do_delete_doc函数首先通过kb_file参数获取知识库文件的完整路径。为了确保数据库查询语句中的文件路径字符串格式正确,它将路径中的所有反斜杠(\)替换为双反斜杠(\\)。这是因为在SQL查询中,反斜杠是一个特殊字符,需要进行转义。

接着,函数使用Session上下文管理器创建一个数据库会话,并执行一个SQL DELETE语句。这个DELETE语句的目的是从langchain_pg_embedding表中删除所有cmetadata字段(以JSONB格式存储)中source键对应的值与给定文件路径匹配的记录。这里,cmetadata::jsonb @> '{"source": "filepath"}'::jsonb是一个PostgreSQL的JSONB查询表达式,用于查找cmetadata中包含特定source键值对的记录。

在执行删除操作后,函数通过session.commit()提交更改,确保删除操作被保存到数据库中。

注意:

  • 使用此函数时,需要确保传入的kb_file对象有效,且其filepath属性正确反映了文件在磁盘上的位置。
  • 此函数直接操作数据库,执行删除操作。因此,在调用此函数之前,应确保已经对要删除的数据进行了适当的备份或确认,以防意外数据丢失。
  • 由于此函数涉及数据库操作,其执行效率和影响范围可能会受到数据库当前状态和配置的影响。在处理大量数据或高负载情况下,建议监控数据库性能,以避免潜在的性能问题。

Function Def do_clear_vs(self)

do_clear_vs: 此函数的功能是清除并重新创建向量空间。

参数: 此函数不接受任何参数。

代码描述 : do_clear_vs 函数是 PGKBService 类的一个方法,用于管理向量空间的清除和重建过程。在这个函数中,首先调用 self.pg_vector.delete_collection() 方法来删除当前的向量空间集合。这一步骤是为了清除所有现有的数据,确保向量空间是空的。紧接着,通过调用 self.pg_vector.create_collection() 方法来重新创建一个新的向量空间集合。这样做的目的是为了在删除旧数据之后,提供一个全新的环境以便后续的数据插入和管理。

注意 : 使用 do_clear_vs 函数时需要谨慎,因为这会导致所有现有的向量空间数据被永久删除,无法恢复。因此,在执行此操作之前,请确保已经做好了充分的数据备份或确认不再需要这些数据。此外,重新创建向量空间集合后,需要重新配置任何相关的设置或索引,以确保向量空间的正常使用和性能优化。


复制代码
---
相关推荐
无限进步_13 分钟前
C++从入门到类和对象完全指南
开发语言·c++·windows·git·后端·github·visual studio
浪客川29 分钟前
高效日志分离器:一键筛选关键信息
开发语言·windows·c#
7***998737 分钟前
Redis——Windows安装
数据库·windows·redis
love530love1 小时前
【ComfyUI/SD环境管理指南(二)】:如何避免插件安装导致的环境崩溃与“外科手术式”修复
人工智能·windows·python·stable diffusion·github·aigc·comfyui
聪明努力的积极向上1 小时前
【WINDOWS】电脑外接显示屏突然无效(戴尔Inspiron 15 3511)
windows·电脑
陈聪.1 小时前
MySQL全平台安装指南:Windows与Linux详细教程
linux·windows·mysql
Boop_wu1 小时前
[Java EE] 多线程进阶(3) [线程安全集合类]
开发语言·windows·python
GHL2842710902 小时前
win32给进程设置图标、修改图标
c++·windows
就叫飞六吧2 小时前
Redis 安装为 Windows 服务开机后台自启
数据库·windows·redis