当前位置:   article > 正文

本地知识库技术下结构设计自我总结一

本地知识库

首先先了解什么是docker

Docker 是一种用于开发、交付和运行应用程序的开源平台。它利用容器的概念,将应用程序及其依赖项打包在容器中,从而实现了应用程序在不同环境中的快速部署和移植。它里面有三个核心概念:

1、镜像(Image):镜像是一个只读文件,包含运行应用程序的所有内容,如代码、环境、库、依赖。可以通过docker镜像来创建、启动容器。

2、容器(Container):容器是Docker中运行镜像的实例,类似于一个轻量级的、独立的虚拟环境,容器包含了应用程序及其运行环境,可以被快速启动,停止,删除等操作。每个容器都是相互隔离的,所以各个应用程序可以在独立的运行环境中进行部署和运行(类似于Anaconda)

3、仓库(Repository):仓库是存储Docker镜像的位置,可以在仓库中查找、下载和上传镜像。Docker Hub是Docker官方提供的公共仓库,可以在里面找你需要镜像。除了公共仓库,用户也可以搭建私有仓库,用于存储自己的镜像。

如何从零开始及利用docker来构建一个完整项目?

第一步创建一个dockerfile文件,在里面使用docker build命令构建镜像(包括基础镜像选择、安装依赖、拷贝代码),最终生成一个包含项目代码和依赖项的镜像。

通过docker run命令运行容器,在运行容器时,可以指定端口映射、环境变量配置等参数。

如果未来项目中设计涉及到数据存储,可以通过docker数据卷或者挂载外部存储的方式,确保数据不会在容器删除后丢失。

根据项目需求配置容器网络,可以使得容器之间相互通信,同时可以实现容器与外部的通信。

此外,根据项目负载情况,可以通过Docker Compose或者Docker Swarm等工具来实现容器的水平拓展与负载均衡。

也可以通过Docker提供的监控工具和日志功能,可以监控容器的运行状态,及时排查问题。

若想把完整项目部署到Docker中,则需要以下几步:

将项目的源码放入Docker镜像中,准备好项目所需的库、框架、环境等依赖项。将项目需要的配置文件(如环境变量配置,数据库配置)放入Docker镜像中。在项目中生成的日志文件可以输出到容器内部或者挂载到宿主机,以便后续分析与监控。其他静态资源如图片、样式表、前端框架等静态文件也要一并打包到Docker镜像中,确保项目启动后能够正常访问资源。

如果使用容器编排工具(如Docker Compose、Kubermetes等),也可以将对应的配置文件也包含在Docker中,方便在集群中快速部署和拓展项目。

以下是一个完整项目的例子以作为参考:

整体结构:

详细

1、其中golang用goframe框架,主要考虑到高并发与快速部署。

2、搜索库MeiliSearch,基于Rust语言开发的开源搜索引擎。可以存一些文档

3、向量数据库Milvus (除了这个还有Faiss、Annoy等)是一个开源向量相似度搜索引擎,旨在提供高效的向量检索和相似度搜索服务。它支持大规模向量检索,可用于各种应用领域,如推荐系统、图像搜索、文本搜索等。Milvus可以存储用于表示向量数据的embedding。

首先先来介绍一下embedding,embedding指的是将高纬数据映射到低维空间的过程,将离散的数据表示为连续的向量表示。这种过程叫做”嵌入“,因为它将数据嵌入到一个更加紧凑的表示空间中,更适合模型学习和数据处理。在深度学习模型中,“embedding”通常是通过Embedding层来实现,用于表示学习和表示数据之间的关系。

在Milvus中,向量数据被存储为向量集合,并且通过索引结构进行高效的相似度搜索。这样的设计使得Milvus特别适用于存储embedding数据,如 Word Embedding、Image Embedding、Item Embedding 等。

4、使用 fastchat 部署ChatGLM3服务,启动8bit的worker,可以运行openai_api服务和web界面方便进行测试。还支持embeddings 接口。

FastChat是一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台。其核心功能包括:最先进模型的权重、训练代码和评估代码(例如Vicuna、FastChat-T5)。基于分布式多模型的服务系统,具有Web界面和与OpenAI兼容的RESTful API。可以参考以下:

FastChat——一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台-腾讯云开发者社区-腾讯云 (tencent.com)

fastchat切实可以分开部署,分为CPU版本和GPU版本,这样在生产环境更灵活。其中worker可以支持多机器部署:(以下是写了两个dockerfile )

GPU镜像:

5、最后整个的docker compose文件。包括,mysql、seilisearch、milvus、fastchat的ChatGLM3,BGE-zh。把所有相关的依赖的中间件放在里头。类似于这样(以下代码仅用来学习):

拿这个为例,在Docker Compose中配置Mysql服务通常需要编写一个YAML文件,在这个示例中我们定义了一个名为db的mysql服务,并指定mysql镜像版本为5.7。在enviroment部分,我们设置了mysql的root用户密码MYSQL_ROOT_PASSWORD数据库名称MYSQL_DATABASE、用户名MYSQL_USER和密码MYSQL_PASSWORD

将 MySQL 的数据目录 /var/lib/mysql 映射为一个卷 mysql_data,以确保数据库文件持久化存储。通过 ports 部分将容器内的 MySQL 端口 3306 映射到主机的 3306 端口,从而可以从外部访问 MySQL 服务。

最后,定义了一个名为 mysql_data 的卷,用于存储 MySQL 数据

将上面的示例内容保存为一个 docker-compose.yml 文件,然后在包含该文件的目录下使用 docker-compose up -d 命令来启动 MySQL 服务。如果需要修改 MySQL 的配置,可以根据实际需求调整 Docker Compose 文件中的参数设置。(正常来说docker-compose.yml包含所有中间件,一次性开启即可

etcd 服务。

etcd 是一种开源的分布式键值存储系统,最初由 CoreOS 开发并维护,后来成为 Cloud Native Computing Foundation(CNCF)的一部分。etcd 主要用于在分布式系统中存储配置数据、元数据和状态信息,以实现系统的一致性、可靠性和高可用性。

etcd 基于 Raft 一致性算法来确保数据的一致性和可靠性。它提供了简单而强大的 API,用户可以使用 HTTP 或 gRPC 接口与 etcd 进行交互,实现对分布式键值存储的读取、写入和监控等操作。etcd 的数据模型是类似于一个分层的键值对(key-value)存储结构,用户可以根据需要组织和存储数据。

etcd 被广泛应用于各种场景,如容器编排系统(比如 Kubernetes)、服务发现、配置管理、分布式锁等,以帮助构建可靠、高可用的分布式系统。etcd 的特性包括强一致性、高可用性、可扩展性和安全性,使得它成为许多云原生应用和系统的重要基础设施之一。

从上面代码可以看到

通过 restart 关键字always来定义etcd服务的重启行为,可以确保etcd服务遇到问题时会自动重新启动,以保持其可用性。还有on-failure(仅在推出代码非零时重启)或unless-stopped(除非手动停止,否则总是重启)

另外,在Docker Compose文件中,command关键字用于指定容器启动时要执行的命令。可以在服务配置中使用command来覆盖镜像中默认的启动命令,或者为容器指定额外的参数。例如以下(仅仅举例):

记住,在command字段中指定特定的命令,具体取决于运行的容器的应用需求。(我觉得command时最难写的)

可以去详细了解。

在 Docker 中,healthcheck 是一个在 Dockerfile 或 Docker Compose 文件中定义容器健康检查的指令,用于检查容器内部服务的健康状态。通过设置 healthcheck,您可以定期检查容器内部服务的运行情况,并根据检查结果来确定容器的健康状态。

healthcheck配置以下参数:

1、test:定义了健康检查的命令。这里使用了 CMD-SHELL 来执行一个 curl 命令来检查服务的运行情况。

2、interval:指定健康检查的间隔时间,这里是每隔 30 秒执行一次健康检查。

3、timeout:指定每次健康检查的超时时间,这里是 10 秒。
4、retries:指定在健康检查失败时尝试的次数,这里是最多尝试 3 次。

以上示例,定义了一个名为milvus的服务,是用来Milvus数据库的Docker镜像,并映射到了端口19530(用于查询)和19121(用于管理)到主机端口

ALLOW_ROOT_USER=true 参数允许以 root 用户身份启动 Milvus 服务。

使用 volumes 部分将 Milvus 数据目录以及配置文件目录映射到主机上的相应目录,以便数据的持久化保存和配置的持续性。

用 docker-compose up -d 命令来启动服务。

MinIO 是一个开源的对象存储服务器,兼容 Amazon S3 协议。通过部署 MinIO,用户可以搭建自己的私有云存储服务,存储各种类型的数据,如图片、视频、文档等,并通过标准的 S3 API 进行访问和管理。MinIO 旨在提供高性能、高可用性和可扩展性的对象存储解决方案。

Milvus Standalone 是 Milvus 数据库的一个部署选项,它是 Milvus 的单机模式部署方式。

在 Standalone 模式下,Milvus 将以单节点方式运行,适用于小规模数据集和快速原型验证等场景。虽然只有单节点,但仍然可以通过 Milvus 提供的 API 来进行向量数据的存储、索引和查询操作。这对于快速实验、学习以及小规模应用十分方便。

使用 depends_on 关键字可以定义服务之间的依赖关系。当一个服务依赖于另一个服务时,Docker 将确保被依赖的服务先于依赖的服务启动。这样可以确保在启动应用程序时,所有必要的服务都已经准备就绪。

比如依赖一些数据库,Milvus 需要与数据库进行交互

或者Milvus需要与消息队列(如RabbitMQ、Kafka等)或缓存服务(如 Redis、Memcached 等)进行集成

上面就不再赘述了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1010196
推荐阅读
相关标签
  

闽ICP备14008679号