当前位置: 首页 > article >正文

AI应用开发利器:基于Docker Compose的一体化本地部署方案

1. 项目概述一个为AI应用量身定制的“开箱即用”工具箱最近在折腾一些AI相关的本地化部署和实验发现一个挺普遍的问题每次想跑个新模型或者搭个实验环境都得花大量时间在环境配置、依赖安装和基础服务搭建上。从Python版本冲突到CUDA驱动不匹配再到各种中间件服务的部署这些“脏活累活”极大地消耗了开发热情。直到我发现了M3phist0s/ai-ready这个项目它就像是为AI开发者准备的一个“瑞士军刀”工具箱或者说一个预配置好的“AI应用开发底座”。简单来说ai-ready是一个开源项目它通过容器化技术主要是Docker和Docker Compose将运行AI应用所需的一整套基础环境和服务打包好。你不需要从零开始安装Python、配置CUDA、部署数据库或者消息队列。项目作者已经把这些组件都编排好了你只需要一条docker-compose up -d命令就能拉起一个包含模型服务、向量数据库、API网关、任务队列等核心组件的完整AI后端环境。它的核心价值在于“Ready”——即用性。无论是想快速验证一个想法搭建一个内部使用的AI工具还是作为生产环境的起点它都能帮你跳过最繁琐的基础设施搭建阶段让你能立刻把精力聚焦在模型推理、业务逻辑和应用开发上。对于独立开发者、小团队或者教育研究场景这能节省数天甚至数周的初始化时间。2. 核心架构与设计思路拆解2.1 为什么选择“一体化”容器栈在深入代码之前我们先聊聊这个项目的设计哲学。当前AI应用开发尤其是涉及大语言模型LLM的早已不是单一Python脚本能搞定的事情。一个典型的应用栈可能包括模型服务层如Ollama、vLLM或Transformers的推理API负责加载和运行模型。应用后端层用FastAPI、Flask等框架编写的业务逻辑处理用户请求。向量数据库层如Chroma、Qdrant、Weaviate用于存储和检索嵌入向量实现RAG检索增强生成等高级功能。缓存与消息队列如Redis用于缓存中间结果、管理会话状态或作为Celery的消息代理。关系型数据库如PostgreSQL存储用户、配置等结构化数据。对象存储如MinIO用于存储模型文件、文档等大型二进制对象。传统做法是开发者需要为每一个组件寻找安装包、编写配置、解决依赖、处理端口冲突并确保它们能在同一台机器上协同工作。这个过程极易出错且环境难以复现。ai-ready的解决方案是用Docker Compose定义并编排所有服务。每个核心组件都是一个独立的容器它们通过Docker Compose定义的网络进行通信。这样做的好处显而易见环境隔离每个服务如PostgreSQL、Redis运行在自己的容器中依赖互不干扰彻底杜绝了“在我的机器上能运行”的问题。一键部署一个配置文件docker-compose.yml定义了所有服务及其关系一行命令即可启动或销毁整个环境。版本固化与可复现所有服务的镜像版本在配置中锁定确保任何时候拉起的环境都是一致的便于团队协作和CI/CD。资源管理清晰可以方便地为每个容器分配CPU、内存限制避免某个服务耗尽主机资源。2.2 项目核心组件选型解析打开项目的docker-compose.yml文件我们可以看到作者精心挑选的一套“技术栈组合拳”。这不是简单的软件堆砌每一款组件的选择都反映了当前AI工程实践中的主流和最佳选择。模型服务Ollama这是项目的核心之一。Ollama因其极简的模型管理和本地推理能力而广受欢迎。相比于直接使用Transformers库Ollama提供了统一的REST API默认端口11434支持拉取、运行和管理多种开源模型如Llama 3、Mistral、Gemma等。在ai-ready中集成Ollama意味着你启动服务后就立即拥有了一个功能完善的本地模型API服务器可以直接通过HTTP请求进行对话、生成等操作。向量数据库Chroma在RAG架构中向量数据库是关键。Chroma是一个轻量级、嵌入优先的向量数据库特别适合AI应用。它提供了简单的Python/JavaScript API并且将持久化存储和检索功能封装得很好。在容器中运行Chroma使得为你的AI应用添加“长期记忆”或知识库功能变得轻而易举。缓存与消息代理RedisRedis几乎是现代Web和AI应用的标配。在AI场景下它可以用于缓存昂贵的模型推理结果特别是对于常见问题、管理用户会话状态、或者作为后台任务队列如Celery的消息存储。它的高性能内存特性非常适合这些任务。关系型数据库PostgreSQL虽然NoSQL在某些AI场景下很流行但一个稳健的关系型数据库对于管理用户、权限、应用配置、操作日志等结构化数据仍然是不可或缺的。PostgreSQL以其强大的功能、稳定性和JSONB等扩展类型成为许多严肃项目的首选。对象存储MinIOMinIO是一个高性能的、与Amazon S3 API兼容的对象存储。在AI项目中你可能需要存储训练好的模型权重、用户上传的文档用于RAG、生成的图片或音频等。使用MinIO可以让你在本地就拥有一个类似S3的存储服务方便管理和访问这些大型文件。应用框架FastAPI (通常存在于示例或扩展中)虽然基础Compose文件可能不直接启动一个FastAPI应用但项目的设计通常围绕FastAPI这样的现代异步框架展开。FastAPI能自动生成API文档与Pydantic数据验证无缝集成并且性能优异非常适合构建AI应用的API层。ai-ready提供的环境正是为运行这样的应用而准备的。这种选型体现了一种“务实且主流”的架构思想。没有选用最前沿但可能不稳定的技术而是选择了经过社区大量验证、文档丰富、易于集成的组件。这大大降低了使用者的学习和调试成本。3. 快速上手指南与核心配置详解3.1 环境准备与一键启动假设你已经在开发机上安装好了Docker和Docker Compose这是唯一的前提条件那么让ai-ready运行起来只需要几步。首先克隆项目代码git clone https://github.com/M3phist0s/ai-ready.git cd ai-ready接下来最激动人心的时刻——启动所有服务docker-compose up -d这条命令会执行以下操作从Docker Hub拉取所有配置好的镜像如postgres:15,redis:7,chromadb/chroma,minio/minio,ollama/ollama等。根据docker-compose.yml中的定义创建独立的容器网络。按依赖顺序启动每个容器并将它们的端口映射到宿主机上。-d参数表示在后台运行。启动完成后你可以使用docker-compose ps命令查看所有服务的状态确保它们都是Up状态。3.2 核心服务访问与验证服务启动后以下关键端点就可以访问了Ollama (模型服务):http://localhost:11434你可以访问http://localhost:11434/api/tags来查看已拉取的模型列表初始为空。通过API拉取一个模型例如Llama 3 8Bcurl -X POST http://localhost:11434/api/pull -d {name: llama3:8b}。这需要一定时间取决于你的网络和磁盘速度。Chroma (向量数据库):http://localhost:8000Chroma提供了一个简单的Dashboard如果镜像支持和API。其核心API通常在http://localhost:8000/api/v1。MinIO (对象存储):http://localhost:9000默认访问密钥和密码通常在docker-compose.yml或环境变量文件中定义如MINIO_ROOT_USERminioadmin,MINIO_ROOT_PASSWORDminioadmin。登录后可以创建存储桶Bucket。PostgreSQL:localhost:5432使用你配置的用户名、密码和数据库名通过任何PostgreSQL客户端如pgAdmin, DBeaver或代码进行连接。Redis:localhost:6379可以使用redis-cli或任何Redis客户端进行连接测试。注意首次启动时Ollama容器内没有模型Chroma和PostgreSQL数据库是空的MinIO需要创建存储桶。这些都需要根据你的应用需求进行初始化。ai-ready提供的是“空”的、但已互联互通的基础设施。3.3 Docker Compose配置深度定制docker-compose.yml文件是这个项目的灵魂。理解并学会修改它才能真正让ai-ready为你所用。我们来看几个关键的定制点1. 资源限制与GPU支持对于Ollama这样的模型服务GPU是刚需。你需要在Compose文件中为Ollama服务添加GPU支持。services: ollama: image: ollama/ollama:latest container_name: ollama deploy: # 使用deploy资源限制更现代 resources: reservations: devices: - driver: nvidia count: all # 使用所有GPU或指定count: 1 capabilities: [gpu] # 或者使用旧的runtime方式部分版本Docker # runtime: nvidia # environment: # - NVIDIA_VISIBLE_DEVICESall同时确保宿主机已安装NVIDIA Container Toolkit。对于内存和CPU也可以全局或单独限制deploy: resources: limits: memory: 16G # 限制容器最大内存 cpus: 4.0 # 限制容器最大CPU核数2. 数据持久化默认配置中PostgreSQL、Redis、MinIO的数据通常通过volumes映射到了宿主机确保容器重启后数据不丢失。但Ollama拉取的模型默认存储在容器内部。如果你希望模型数据也持久化避免每次重新下载可以添加一个卷映射services: ollama: volumes: - ./ollama_data:/root/.ollama # 将容器内的模型存储目录映射到本地的ollama_data文件夹这样即使删除并重建Ollama容器之前拉取的模型依然存在。3. 网络与依赖关系Compose文件中的depends_on定义了启动顺序但注意它只控制“启动顺序”不保证服务“就绪状态”。对于需要数据库初始化完成才能启动的应用你可能需要在应用启动命令中添加等待脚本或者使用healthcheck配置。services: my-ai-app: # 你的自定义应用 build: . depends_on: postgres: condition: service_healthy # 等待postgres健康检查通过 redis: condition: service_started你可以在PostgreSQL服务定义中添加健康检查postgres: image: postgres:15 healthcheck: test: [CMD-SHELL, pg_isready -U postgres] interval: 10s timeout: 5s retries: 54. 基于ai-ready构建你的第一个AI应用有了运行起来的基础设施我们如何利用它构建一个真正的应用呢这里以一个简单的“智能文档问答”后端为例演示如何将各个组件串联起来。4.1 应用架构设计我们的应用将实现以下流程用户上传一个PDF文档到MinIO。后端服务将PDF文本提取出来分割成片段。使用一个嵌入模型通过Ollama或本地SentenceTransformer为每个文本片段生成向量。将这些向量及其元数据文本内容、来源存储到Chroma向量数据库中。当用户提问时将问题也转换成向量在Chroma中进行相似性检索找到最相关的文本片段。将问题和检索到的文本片段组合成提示词Prompt发送给Ollama中的大语言模型如Llama 3进行生成。将模型生成的答案返回给用户。在这个流程中我们将用到MinIO存储原始PDF。PostgreSQL记录文档上传记录、用户信息如果扩展。Chroma存储文本向量实现快速检索。Ollama运行嵌入模型如nomic-embed-text和生成模型如llama3:8b。Redis缓存文档处理任务的状态或缓存常见问题的答案。4.2 核心代码实现片段我们使用FastAPI来构建后端。首先你需要创建一个新的Python项目并安装依赖fastapi,uvicorn,chromadb,pyminio,sqlalchemy,redis,pypdf2等。1. 服务连接与初始化在应用启动时初始化所有客户端的连接。得益于Docker Compose的网络我们可以直接使用服务名作为主机名进行连接。# config.py import os from chromadb import HttpClient from minio import Minio import redis from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker # 从环境变量读取配置或在代码中硬编码不推荐生产环境 CHROMA_HOST os.getenv(CHROMA_HOST, chroma) # 注意在容器内连接时主机名是服务名‘chroma’ CHROMA_PORT os.getenv(CHROMA_PORT, 8000) MINIO_ENDPOINT os.getenv(MINIO_ENDPOINT, minio:9000) MINIO_ACCESS_KEY os.getenv(MINIO_ACCESS_KEY, minioadmin) MINIO_SECRET_KEY os.getenv(MINIO_SECRET_KEY, minioadmin) REDIS_URL os.getenv(REDIS_URL, redis://redis:6379/0) DATABASE_URL os.getenv(DATABASE_URL, postgresql://postgres:yourpasswordpostgres:5432/ai_db) # 初始化客户端 chroma_client HttpClient(hostCHROMA_HOST, portCHROMA_PORT) minio_client Minio(MINIO_ENDPOINT, access_keyMINIO_ACCESS_KEY, secret_keyMINIO_SECRET_KEY, secureFalse) # 容器内通常为HTTP redis_client redis.from_url(REDIS_URL) engine create_engine(DATABASE_URL) SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) # 确保MinIO存储桶存在 bucket_name documents if not minio_client.bucket_exists(bucket_name): minio_client.make_bucket(bucket_name)2. 文档处理与向量入库创建一个FastAPI端点来处理文件上传、文本提取和向量化。# main.py from fastapi import FastAPI, File, UploadFile, BackgroundTasks import PyPDF2 import io from chromadb.utils import embedding_functions import asyncio from .config import chroma_client, minio_client, SessionLocal, bucket_name app FastAPI() # 假设使用Ollama提供的嵌入函数Chroma客户端可以集成 # 或者使用本地的sentence-transformers # 这里示例使用Ollama的嵌入API OLLAMA_EMBED_URL http://ollama:11434/api/embeddings app.post(/upload-doc/) async def upload_document(file: UploadFile File(...), background_tasks: BackgroundTasks None): # 1. 上传文件到MinIO file_bytes await file.read() minio_client.put_object(bucket_name, file.filename, io.BytesIO(file_bytes), len(file_bytes)) # 2. 提取文本 pdf_reader PyPDF2.PdfReader(io.BytesIO(file_bytes)) text for page in pdf_reader.pages: text page.extract_text() \n # 3. 文本分割简单按句分割 from langchain.text_splitter import RecursiveCharacterTextSplitter # 需要安装langchain text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) chunks text_splitter.split_text(text) # 4. 将处理任务加入后台避免阻塞请求 if background_tasks: background_tasks.add_task(process_and_store_chunks, chunks, file.filename) return {message: fFile {file.filename} uploaded and processing started.} else: # 同步处理不推荐用于大文件 await process_and_store_chunks(chunks, file.filename) return {message: fFile {file.filename} processed and stored.} async def process_and_store_chunks(chunks: list, source: str): 异步处理文本块并存入向量数据库 collection chroma_client.get_or_create_collection(namedocuments) # 为每个chunk生成嵌入向量这里调用Ollama API import aiohttp async with aiohttp.ClientSession() as session: embeddings [] for i, chunk in enumerate(chunks): async with session.post(OLLAMA_EMBED_URL, json{model: nomic-embed-text, prompt: chunk}) as resp: if resp.status 200: data await resp.json() embeddings.append(data[embedding]) else: # 错误处理 embeddings.append([0]*768) # 假设维度为768 # 准备元数据和ID metadatas [{source: source, chunk_index: i} for i in range(len(chunks))] ids [f{source}_{i} for i in range(len(chunks))] # 存入Chroma collection.add( embeddingsembeddings, documentschunks, metadatasmetadatas, idsids )3. 问答检索与生成创建另一个端点接收用户问题检索相关文档并调用LLM生成答案。app.post(/ask/) async def ask_question(question: str): # 1. 将问题转换为向量 import aiohttp async with aiohttp.ClientSession() as session: async with session.post(OLLAMA_EMBED_URL, json{model: nomic-embed-text, prompt: question}) as resp: if resp.status 200: data await resp.json() query_embedding data[embedding] else: return {error: Failed to embed question} # 2. 在Chroma中检索最相似的文本块 collection chroma_client.get_collection(namedocuments) results collection.query( query_embeddings[query_embedding], n_results3 # 返回最相关的3个片段 ) # 3. 构建Prompt context \n\n.join(results[documents][0]) # 获取检索到的文档文本 prompt f基于以下上下文信息回答用户的问题。如果上下文信息不足以回答问题请直接说“根据提供的信息我无法回答这个问题”。 上下文 {context} 问题{question} 答案 # 4. 调用Ollama生成答案 async with aiohttp.ClientSession() as session: async with session.post(http://ollama:11434/api/generate, json{model: llama3:8b, prompt: prompt, stream: False}) as resp: if resp.status 200: data await resp.json() answer data.get(response, No response generated.) return {question: question, answer: answer, context_sources: results[metadatas][0]} else: return {error: Failed to generate answer from LLM}将这个FastAPI应用也容器化并添加到docker-compose.yml中让它与ai-ready的其他服务在同一个网络中运行。这样一个完整的、基于ai-ready基础设施的AI应用后端就搭建完成了。5. 高级用法与生产环境考量5.1 扩展服务添加监控与日志一个用于生产或严肃开发的环境监控和日志收集是必不可少的。我们可以轻松地扩展docker-compose.yml来集成这些组件。添加Prometheus和Grafana监控services: prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml # 配置文件需自行创建 - prometheus_data:/prometheus command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus - --web.console.libraries/etc/prometheus/console_libraries - --web.console.templates/etc/prometheus/consoles - --storage.tsdb.retention.time200h - --web.enable-lifecycle ports: - 9090:9090 networks: - ai-network grafana: image: grafana/grafana:latest container_name: grafana volumes: - grafana_data:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning # 仪表盘配置 environment: - GF_SECURITY_ADMIN_PASSWORDadmin ports: - 3000:3000 depends_on: - prometheus networks: - ai-network你需要配置prometheus.yml来抓取Ollama、Redis、PostgreSQL等服务的指标如果它们暴露了/metrics端点。Grafana则可以连接Prometheus数据源创建漂亮的监控仪表盘。集中式日志管理ELK/PLG栈 对于日志可以添加Loki日志聚合、Promtail日志收集和Grafana用于展示的组合。loki: image: grafana/loki:latest container_name: loki command: -config.file/etc/loki/local-config.yaml ports: - 3100:3100 networks: - ai-network promtail: image: grafana/promtail:latest container_name: promtail volumes: - /var/log:/var/log # 挂载宿主机日志目录 - ./promtail-config.yaml:/etc/promtail/config.yaml command: -config.file/etc/promtail/config.yaml depends_on: - loki networks: - ai-network然后在Grafana中添加Loki数据源就可以在Grafana界面中统一查询所有容器的日志了。5.2 性能调优与安全加固性能调优Ollama模型加载使用Ollama的ollama pull命令预加载常用模型到持久化卷中避免每次启动时下载。对于生产环境考虑使用--num-gpu参数指定GPU数量或使用vLLM等更高性能的推理服务器替代Ollama进行部署。Chroma优化Chroma默认使用内存存储对于大量数据需要配置持久化路径并关注内存使用。可以考虑使用chroma/ chroma镜像的持久化模式或者评估Qdrant、Weaviate等支持分布式和更多高级功能的向量数据库。Redis缓存策略为AI推理结果设置合理的TTL生存时间避免缓存无限增长。对于高频且结果固定的查询如某些知识库问答缓存可以显著提升响应速度。网络优化确保所有服务都在同一个自定义的Docker网络中如ai-ready中定义的网络使用容器名进行通信避免经过宿主机网络栈带来的延迟。安全加固修改默认密码这是最重要的一步在docker-compose.yml或配套的.env文件中务必修改PostgreSQL、Redis、MinIO等服务的默认密码和用户名。永远不要使用默认凭证公开部署。使用环境变量文件将敏感信息密码、API密钥存储在.env文件中并在docker-compose.yml中通过env_file指令引入。确保.env文件被添加到.gitignore中避免泄露。services: postgres: image: postgres:15 env_file: - .env.postgres # 在此文件中定义POSTGRES_PASSWORD等变量限制端口暴露在docker-compose.yml中只将必要的服务端口映射到宿主机。例如数据库PostgreSQL, Redis通常不需要映射到宿主机只需让应用容器在内部网络访问即可。只将API服务如你的FastAPI应用端口8000和必要的管理界面如MinIO的9000暴露出来。services: postgres: # ... 其他配置 ports: - # 注释掉或删除这一行不映射5432到宿主机 api: # 你的应用 ports: - 8000:8000 # 只暴露API端口启用TLS/HTTPS对于暴露给公网的服务务必配置反向代理如Nginx并启用HTTPS。可以在Docker Compose中添加一个Nginx服务配置SSL证书代理到后端API。5.3 从开发到生产CI/CD与编排对于生产环境仅靠docker-compose up可能不够。你需要考虑使用生产级编排工具如Kubernetes (K8s) 或 Docker Swarm。你需要将docker-compose.yml转换为K8s的部署文件Deployment, Service, ConfigMap, Secret, PersistentVolumeClaim等。ai-ready项目作为一个本地开发环境是理解服务依赖关系的绝佳起点为编写K8s编排文件提供了清晰的蓝图。配置管理将配置如数据库连接字符串、API密钥与镜像分离使用K8s的ConfigMap和Secret或Docker Swarm的配置。健康检查与就绪探针在生产编排文件中为每个服务定义详细的健康检查liveness/readiness probes确保系统能自动处理故障。日志与监控集成将上面提到的Prometheus/Loki等监控栈也部署到生产集群中并配置告警规则。6. 常见问题与故障排查实录在实际使用ai-ready或基于它构建应用的过程中你肯定会遇到一些问题。以下是我踩过的一些坑和解决方案。6.1 服务启动与连接问题问题1docker-compose up时某个服务不断重启或无法启动。排查首先使用docker-compose logs [service_name]查看具体服务的日志。最常见的原因是端口冲突或依赖服务未就绪。案例PostgreSQL启动失败日志显示FATAL: could not map anonymous shared memory: Cannot allocate memory。原因Linux内核共享内存参数shmmax或shmall设置过小。解决在宿主机上临时调整sudo sysctl -w kernel.shmmax17179869184(16GB) 和sudo sysctl -w kernel.shmall4194304。永久修改需编辑/etc/sysctl.conf。案例应用容器启动时连接PostgreSQL超时。原因应用在PostgreSQL服务完全初始化接受连接之前就启动了。depends_on只保证容器启动不保证服务就绪。解决在应用启动命令中添加等待脚本如wait-for-it.sh或dockerize或者像前面提到的在PostgreSQL服务中配置healthcheck并在应用服务的depends_on中使用condition: service_healthy。问题2容器内服务无法通过服务名互相访问如应用无法连接postgres:5432。排查进入应用容器内部进行测试docker-compose exec [app_service_name] bash然后尝试ping postgres或curl http://chroma:8000/api/v1/heartbeat。原因服务可能没有连接到同一个自定义网络。Docker Compose默认会为项目创建一个网络但检查docker-compose.yml中所有服务是否都在networks部分声明了相同的网络。解决确保所有服务的网络配置一致。最简单的做法是删除所有服务的networks配置让Docker Compose使用默认网络。6.2 Ollama模型相关问题3Ollama拉取模型速度极慢或失败。原因网络连接Docker Hub或模型仓库不稳定。解决配置镜像加速器对于国内用户可以在宿主机配置Docker镜像加速器如阿里云、中科大镜像源但这通常只加速镜像拉取。Ollama拉取模型走的是自己的渠道。使用离线模型文件先从其他途径下载好模型文件如.gguf格式然后通过Ollama的ollama create命令从本地文件创建模型。或者将模型文件放入持久化卷中。耐心等待或重试大型模型如70B参数下载可能需要数小时确保网络稳定。问题4Ollama在GPU容器中无法识别GPU。排查进入Ollama容器运行ollama run llama3:8b观察输出是否提到“GPU”或“CUDA”。或者查看日志docker-compose logs ollama。原因宿主机未安装NVIDIA驱动和NVIDIA Container Toolkit。Docker Compose配置中未正确声明GPU资源。使用的Ollama镜像版本不支持GPU但官方镜像通常支持。解决在宿主机运行nvidia-smi确认驱动安装正确。运行docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi测试Docker GPU支持。确保docker-compose.yml中Ollama服务配置了deploy.resources.reservations.devices或runtime: nvidia。6.3 资源与性能问题问题5运行大模型时系统卡顿或OOM内存不足被杀。排查使用docker stats命令实时查看各容器的CPU、内存使用情况。解决限制资源在docker-compose.yml中为Ollama等服务设置合理的mem_limit和cpus。避免单个容器耗尽所有资源。模型量化使用量化版本的模型如llama3:8b-q4_K_M可以显著减少内存占用和提升推理速度精度损失通常可接受。调整Ollama参数通过Ollama的API运行模型时可以指定num_ctx上下文长度、num_predict生成令牌数等参数来控制资源消耗。升级硬件对于参数较大的模型如70B16GB内存可能勉强32GB或以上会更稳妥。GPU显存是关键8B模型通常需要8GB以上显存。问题6向量检索速度随着数据量增大而变慢。原因Chroma默认的扁平索引在数据量很大时如超过10万条检索效率会下降。解决使用更高效的索引Chroma支持HNSW等近似最近邻搜索索引可以在创建集合时指定。collection client.create_collection(namemy_collection, metadata{hnsw:space: cosine})。注意这可能会增加内存使用。数据分片根据业务逻辑将数据分散到多个集合中。考虑专业向量数据库如果数据量极大百万级以上考虑迁移到专为大规模设计的向量数据库如Qdrant、Weaviate或Milvus它们提供了更丰富的索引类型和分布式架构。6.4 数据持久化与备份问题7删除容器后数据丢失。原因数据存储在容器内部未使用volumes或bind mounts进行持久化。解决检查docker-compose.yml中的volumes配置。确保PostgreSQL、Redis、MinIO、Ollama模型数据等有状态服务的数据目录都映射到了宿主机路径或命名的Docker卷。定期备份这些宿主机上的目录。问题8如何备份和恢复整个AI环境备份停止服务docker-compose down。备份所有挂载到宿主机的数据卷目录如./postgres_data,./redis_data,./minio_data,./ollama_data。备份docker-compose.yml和.env等配置文件。恢复在新机器上安装Docker和Docker Compose。复制配置文件和数据卷目录到相应位置。启动服务docker-compose up -d。 由于所有数据都在持久化卷中服务会恢复到备份时的状态。M3phist0s/ai-ready项目真正强大的地方在于它不仅仅提供了一组可运行的容器更是提供了一个经过思考的、现代化的AI应用基础设施范式。它让你能跳过最痛苦的“从零到一”的基建阶段直接进入“从一到N”的应用构建和迭代阶段。无论是用于个人学习、快速原型验证还是作为中小型项目的基础它都是一个极具价值的起点。当然正如上面所讨论的将其用于生产环境需要你在安全、监控、性能和编排上做更多的工作。但无论如何这个项目已经为你铺好了最坚实的第一块砖。

相关文章:

AI应用开发利器:基于Docker Compose的一体化本地部署方案

1. 项目概述:一个为AI应用量身定制的“开箱即用”工具箱最近在折腾一些AI相关的本地化部署和实验,发现一个挺普遍的问题:每次想跑个新模型或者搭个实验环境,都得花大量时间在环境配置、依赖安装和基础服务搭建上。从Python版本冲突…...

Vim插件备份恢复终极指南:Vundle.vim确保配置永不丢失

Vim插件备份恢复终极指南:Vundle.vim确保配置永不丢失 【免费下载链接】Vundle.vim Vundle, the plug-in manager for Vim 项目地址: https://gitcode.com/gh_mirrors/vu/Vundle.vim Vundle.vim作为Vim的插件管理器,不仅能帮助用户轻松管理各类插…...

8线程Python网站离线下载器:打造你的永久数字档案库

8线程Python网站离线下载器:打造你的永久数字档案库 【免费下载链接】WebSite-Downloader 项目地址: https://gitcode.com/gh_mirrors/web/WebSite-Downloader WebSite-Downloader是一款基于Python开发的高效网站离线下载工具,能够将整个网站完整…...

解放你的耳朵:用Open-Lyrics为任何音频生成精准字幕

解放你的耳朵:用Open-Lyrics为任何音频生成精准字幕 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT,Claude等)来转录、翻译你的音频为字幕文件。 项目地…...

保姆级教程:解决ORB-SLAM2_with_pointcloud_map编译报错(PCL版本冲突、段错误闪退)

ORB-SLAM2点云地图构建实战:从编译报错到稳定运行的完整指南 在三维视觉SLAM领域,ORB-SLAM2因其出色的实时性和鲁棒性成为众多研究者和开发者的首选框架。但当我们将目光投向更具实用价值的稠密点云地图构建时,高翔博士的ORB-SLAM2_with_poin…...

CookieCutter扩展开发终极指南:自定义Jinja2过滤器与函数

CookieCutter扩展开发终极指南:自定义Jinja2过滤器与函数 【免费下载链接】cookiecutter A cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects. 项目地址: https://…...

3步解锁HS2完整体验:专业汉化补丁终极指南

3步解锁HS2完整体验:专业汉化补丁终极指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的日文界面感到困惑?HS2…...

独立开发者如何利用Taotoken构建具备多模型切换能力的AI应用

独立开发者如何利用Taotoken构建具备多模型切换能力的AI应用 对于独立开发者而言,在小型应用中集成AI功能时,常常面临一个核心矛盾:既要提供稳定、强大的智能能力,又要控制成本并适应不同用户的偏好。直接对接单一模型供应商&…...

Flink实时数据处理终极指南:从零构建企业级流处理系统

Flink实时数据处理终极指南:从零构建企业级流处理系统 【免费下载链接】InterviewGuide 🔥🔥「InterviewGuide」是阿秀从校园->职场多年计算机自学过程的记录以及学弟学妹们计算机校招&秋招经验总结文章的汇总,包括但不限于…...

5步在PC上运行任天堂Switch游戏:Ryujinx模拟器完全指南

5步在PC上运行任天堂Switch游戏:Ryujinx模拟器完全指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上畅玩《塞尔达传说:王国之泪》,却不…...

3分钟解锁Android TV遥控器新姿势:免费虚拟鼠标工具终极指南

3分钟解锁Android TV遥控器新姿势:免费虚拟鼠标工具终极指南 【免费下载链接】matvt Virtual Mouse for Android TV that can be controlled via remote itself. 项目地址: https://gitcode.com/gh_mirrors/ma/matvt 还在为Android TV上那些难以点击的小按钮…...

彻底搞懂最小生成树算法:从概念到实战的完整指南

彻底搞懂最小生成树算法:从概念到实战的完整指南 【免费下载链接】algo 数据结构和算法必知必会的50个代码实现 项目地址: https://gitcode.com/gh_mirrors/alg/algo 最小生成树(Minimum Spanning Tree,简称MST)是图论中最…...

Lime3DS游戏截图与录像功能:高质量游戏内容创作终极指南

Lime3DS游戏截图与录像功能:高质量游戏内容创作终极指南 【免费下载链接】Lime3DS An open-source 3DS emulator project based on Citra. 项目地址: https://gitcode.com/gh_mirrors/li/Lime3DS Lime3DS作为一款基于Citra的开源3DS模拟器,不仅能…...

Next.js全栈开发最佳实践:从TypeScript到Tailwind CSS的完整工具链

1. 项目概述:一个现代全栈开发的“瑞士军刀”如果你最近在寻找一个能快速启动Next.js全栈项目的模板,大概率会在GitHub上看到jpedroschmitz/typescript-nextjs-starter这个仓库。它不是一个简单的“Hello World”示例,而是一个经过精心配置、…...

终极指南:Vue3后台管理系统状态管理进阶——复杂业务逻辑的优雅处理方案

终极指南:Vue3后台管理系统状态管理进阶——复杂业务逻辑的优雅处理方案 【免费下载链接】vue-manage-system Vue3、Element Plus、typescript后台管理系统 项目地址: https://gitcode.com/gh_mirrors/vu/vue-manage-system 在现代Web开发中,后台…...

Docker Compose环境管理:从原理到实战的自动化部署指南

1. 项目概述与核心价值最近在折腾一个挺有意思的项目,叫abdousamb2002/temine。乍一看这个标题,可能有点摸不着头脑,它不像常见的docker-compose.yml或者awesome-list那样直白。但恰恰是这种看似模糊的命名,背后往往隐藏着一个非常…...

终极移动端设计调试指南:VisBug如何在不同设备尺寸下完美适配

终极移动端设计调试指南:VisBug如何在不同设备尺寸下完美适配 【免费下载链接】ProjectVisBug FireBug for designers › Edit any webpage, in any state https://a.nerdy.dev/gimme-visbug 项目地址: https://gitcode.com/gh_mirrors/pr/ProjectVisBug Vis…...

医学影像分割终极指南:如何用MedSAM快速实现精准器官识别

医学影像分割终极指南:如何用MedSAM快速实现精准器官识别 【免费下载链接】MedSAM Segment Anything in Medical Images 项目地址: https://gitcode.com/gh_mirrors/me/MedSAM 在医学影像分析领域,精准的器官和组织分割是临床诊断和研究的关键步骤…...

简单快速的KrkrzExtract:终极krkrz引擎XP3资源解包工具完全指南

简单快速的KrkrzExtract:终极krkrz引擎XP3资源解包工具完全指南 【免费下载链接】KrkrzExtract The next generation of KrkrExtract 项目地址: https://gitcode.com/gh_mirrors/kr/KrkrzExtract KrkrzExtract是一款专门为krkrz游戏引擎设计的下一代XP3资源解…...

Needle实战案例:TicTacToe项目依赖注入完整实现

Needle实战案例:TicTacToe项目依赖注入完整实现 【免费下载链接】needle Compile-time safe Swift dependency injection framework 项目地址: https://gitcode.com/gh_mirrors/need/needle Needle是一款为Swift开发者打造的编译时安全依赖注入框架&#xff…...

极简信息聚合器Nas4146/brief:用Python+Docker打造你的私人简报机器人

1. 项目概述:一个为“懒人”设计的极简信息聚合器最近在折腾个人知识管理和信息流优化时,我遇到了一个几乎所有内容创作者和重度信息消费者都会头疼的问题:信息过载与碎片化。每天,我需要关注十几个不同平台的更新——技术博客、行…...

River时间序列预测终极指南:从Holt-Winters到SNARIMAX的完整教程

River时间序列预测终极指南:从Holt-Winters到SNARIMAX的完整教程 【免费下载链接】river 🌊 Online machine learning in Python 项目地址: https://gitcode.com/gh_mirrors/river12/river River是一个强大的在线机器学习Python库,专为…...

如何用Cookiecutter快速搭建在线教育学习系统模板

如何用Cookiecutter快速搭建在线教育学习系统模板 【免费下载链接】cookiecutter A cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects. 项目地址: https://gitcode.com/gh_mir…...

终极指南:揭秘spicetify-cli彩色终端输出的7个核心技术实现原理

终极指南:揭秘spicetify-cli彩色终端输出的7个核心技术实现原理 【免费下载链接】spicetify-cli Command-line tool to customize Spotify client. Supports Windows, macOS, and Linux. 项目地址: https://gitcode.com/gh_mirrors/sp/spicetify-cli spiceti…...

智能家居动画革命:如何用libpag打造物联网设备交互新体验

智能家居动画革命:如何用libpag打造物联网设备交互新体验 【免费下载链接】libpag The official rendering library for PAG (Portable Animated Graphics) files that renders After Effects animations natively across multiple platforms. 项目地址: https://…...

WarcraftHelper终极指南:让你的魔兽争霸3在现代电脑上重生

WarcraftHelper终极指南:让你的魔兽争霸3在现代电脑上重生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上的…...

如何用MTKClient拯救变砖的联发科设备:从诊断到修复的实战指南

如何用MTKClient拯救变砖的联发科设备:从诊断到修复的实战指南 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 当你的联发科设备突然黑屏、无限重启,或者刷机失败后…...

Go语言文件路径管理库afterpaths:告别硬编码,实现声明式路径与生命周期管理

1. 项目概述与核心价值如果你在开发一个Web应用,特别是那种需要处理大量用户上传文件、生成动态内容或者构建复杂工作流的项目,那么“文件存储”和“路径管理”这两个词,大概率是你日常开发中的“痛点”和“性能瓶颈”来源。传统的做法&#…...

如何保障fastbook实验可复现性:数据版本控制终极指南

如何保障fastbook实验可复现性:数据版本控制终极指南 【免费下载链接】fastbook The fastai book, published as Jupyter Notebooks 项目地址: https://gitcode.com/gh_mirrors/fa/fastbook fastbook作为fastai的官方教程项目,以Jupyter Notebook…...

ComfyUI IPAdapter Plus 终极指南:如何用图像参考实现精准AI绘画控制 [特殊字符]

ComfyUI IPAdapter Plus 终极指南:如何用图像参考实现精准AI绘画控制 🎨 【免费下载链接】ComfyUI_IPAdapter_plus 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_IPAdapter_plus ComfyUI IPAdapter Plus 是一个强大的AI图像生成插件&am…...