知识库的创建(3) - 知识库上传入口update_docs

2024-06-19 08:44

本文主要是介绍知识库的创建(3) - 知识库上传入口update_docs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、添加了注释的源码
  • 二、 参数说明
  • 三、 功能说明
  • 四、 返回值
  • 总结


前言

langchain-chatchat用到的底层函数很多,为了大家思路更清晰,我们换个顺序,先从上传文档+更新、保存向量库的入口 update_docs 开始看起。

update_docs 是一个用于更新知识库文档的函数。这个函数能够处理多个文件,并将它们转换为知识库文档,还可以处理自定义的文档并将其向量化。以下是对该函数的详细介绍:

一、添加了注释的源码

def update_docs(knowledge_base_name: str = Body(..., description="知识库名称", examples=["samples"]),file_names: List[str] = Body(..., description="文件名称,支持多文件", examples=[["file_name1", "text.txt"]]),chunk_size: int = Body(CHUNK_SIZE, description="知识库中单段文本最大长度"),chunk_overlap: int = Body(OVERLAP_SIZE, description="知识库中相邻文本重合长度"),zh_title_enhance: bool = Body(ZH_TITLE_ENHANCE, description="是否开启中文标题加强"),override_custom_docs: bool = Body(False, description="是否覆盖之前自定义的docs"),docs: Json = Body({}, description="自定义的docs,需要转为json字符串",examples=[{"test.txt": [Document(page_content="custom doc")]}]),not_refresh_vs_cache: bool = Body(False, description="暂不保存向量库(用于FAISS)"),
) -> BaseResponse:"""更新知识库文档"""# 验证知识库名称是否合法if not validate_kb_name(knowledge_base_name):return BaseResponse(code=403, msg="Don't attack me")# 获取对应的知识库服务kb = KBServiceFactory.get_service_by_name(knowledge_base_name)if kb is None:return BaseResponse(code=404, msg=f"未找到知识库 {knowledge_base_name}")failed_files = {}  # 记录加载失败的文件kb_files = []  # 需要处理的知识库文件列表# 生成需要加载文档的文件列表for file_name in file_names:file_detail = get_file_detail(kb_name=knowledge_base_name, filename=file_name)# 如果文件之前使用了自定义文档,根据参数决定略过或覆盖if file_detail.get("custom_docs") and not override_custom_docs:continueif file_name not in docs:try:kb_files.append(KnowledgeFile(filename=file_name, knowledge_base_name=knowledge_base_name))except Exception as e:# 记录加载文档时的错误信息msg = f"加载文档 {file_name} 时出错:{e}"logger.error(f'{e.__class__.__name__}: {msg}',exc_info=e if log_verbose else None)failed_files[file_name] = msg# 从文件生成文档,并进行向量化for status, result in files2docs_in_thread(kb_files,chunk_size=chunk_size,chunk_overlap=chunk_overlap,zh_title_enhance=zh_title_enhance):if status:# 如果成功,更新知识库文档kb_name, file_name, new_docs = resultkb_file = KnowledgeFile(filename=file_name,knowledge_base_name=knowledge_base_name)kb_file.splited_docs = new_docskb.update_doc(kb_file, not_refresh_vs_cache=True)else:# 如果失败,记录错误信息kb_name, file_name, error = resultfailed_files[file_name] = error# 将自定义的文档进行向量化for file_name, v in docs.items():try:v = [x if isinstance(x, Document) else Document(**x) for x in v]kb_file = KnowledgeFile(filename=file_name, knowledge_base_name=knowledge_base_name)kb.update_doc(kb_file, docs=v, not_refresh_vs_cache=True)except Exception as e:# 记录自定义文档添加时的错误信息msg = f"为 {file_name} 添加自定义docs时出错:{e}"logger.error(f'{e.__class__.__name__}: {msg}',exc_info=e if log_verbose else None)failed_files[file_name] = msg# 保存向量库if not not_refresh_vs_cache:kb.save_vector_store()# 返回处理结果return BaseResponse(code=200, msg=f"更新文档完成", data={"failed_files": failed_files})

二、 参数说明

  1. knowledge_base_name (str):

    • 描述: 知识库的名称。
    • 示例: “samples”。
    • 用法: 必填参数,用于指定需要更新的知识库。
  2. file_names (List[str]):

    • 描述: 需要更新的文件名列表,支持多文件。
    • 示例: [“file_name1”, “text.txt”]。
    • 用法: 必填参数,用于指定需要处理的文件。
  3. chunk_size (int):

    • 描述: 知识库中单段文本的最大长度。
    • 默认值: CHUNK_SIZE。
    • 用法: 可选参数,用于指定文本分块的大小。
  4. chunk_overlap (int):

    • 描述: 知识库中相邻文本重合的长度。
    • 默认值: OVERLAP_SIZE。
    • 用法: 可选参数,用于指定文本分块时的重叠部分长度。
  5. zh_title_enhance (bool):

    • 描述: 是否开启中文标题加强功能。
    • 默认值: ZH_TITLE_ENHANCE。
    • 用法: 可选参数,用于指定是否增强中文标题。
  6. override_custom_docs (bool):

    • 描述: 是否覆盖之前自定义的文档。
    • 默认值: False。
    • 用法: 可选参数,用于指定是否覆盖已经存在的自定义文档。
  7. docs (Json):

    • 描述: 自定义的文档,需要转换为JSON字符串。
    • 示例: {“test.txt”: [Document(page_content=“custom doc”)]}。
    • 用法: 可选参数,用于传入自定义的文档内容。
  8. not_refresh_vs_cache (bool):

    • 描述: 暂不保存向量库(用于FAISS)。
    • 默认值: False。
    • 用法: 可选参数,用于指定是否保存向量库缓存。

三、 功能说明

该函数主要完成以下任务:

  1. 验证知识库名称

    • 首先调用 validate_kb_name 函数验证知识库名称是否有效。如果无效,返回403错误。
  2. 获取知识库服务

    • 使用 KBServiceFactory.get_service_by_name 函数获取知识库服务实例。如果未找到对应的知识库,返回404错误。
  3. 生成需要加载文档的文件列表

    • 对传入的文件名列表进行遍历,生成需要加载文档的文件列表。如果文件之前使用了自定义文档,根据参数决定略过或覆盖。
  4. 从文件生成文档并进行向量化

    • 调用 files2docs_in_thread 函数将文件生成文档,并在多线程中进行处理。对于处理成功的文件,更新知识库文档;对于处理失败的文件,记录错误信息。
  5. 处理自定义文档并进行向量化

    • 对传入的自定义文档进行处理,将其转换为 Document 对象,并更新到知识库中。如果处理失败,记录错误信息。
  6. 保存向量库

    • 如果未指定 not_refresh_vs_cache 参数,则保存向量库。

四、 返回值

该函数返回一个 BaseResponse 对象,包含以下信息:

  • code: 状态码,200表示成功。
  • msg: 消息,更新文档完成。
  • data: 数据,包含处理失败的文件信息。

总结

通过上述步骤,update_docs 函数能够有效地更新知识库中的文档,并提供处理失败的详细信息,以便于后续的调试和处理。

这篇关于知识库的创建(3) - 知识库上传入口update_docs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074542

相关文章

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P