ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Open-Assistant REST Backend 开发实战:从本地数据库搭建到数据导出的完整指南

Open-Assistant REST Backend 开发实战:从本地数据库搭建到数据导出的完整指南 Open-Assistant REST Backend 开发实战从本地数据库搭建到数据导出的完整指南【免费下载链接】Open-AssistantOpenAssistant is a chat-based assistant that understands tasks, can interact with third-party systems, and retrieve information dynamically to do so.项目地址: https://gitcode.com/gh_mirrors/op/Open-Assistant导读本文以 Open-Assistant 仓库的 backend/README.md 为骨架系统讲解其 REST 后端的完整开发流程如何用 Docker Compose 拉起本地 PostgreSQL、安装 Python 依赖并以热重载模式启动 FastAPI 服务、通过.env配置数据库与 Redis、借助 Alembic 管理数据库迁移、启动 Celery Worker 处理毒性检测与特征提取等异步任务以及用export.py把对话消息树导出为可用于模型训练的数据集。读完本文你将能独立搭建一套可运行的 Open-Assistant 后端开发环境并掌握其配置体系与数据导出管线的底层原理。一、后端开发环境搭建Open-Assistant 的 REST 后端位于 backend/ 目录是一个基于 FastAPI 的 Python 服务负责任务分发、消息树管理、用户统计与数据导出。下面从零开始搭建本地开发环境。1.1 启动本地数据库Docker Compose在仓库根目录执行以下命令即可启动一套带backend-devprofile 的依赖服务docker compose --profile backend-dev up --build --attach-dependencies该命令的核心逻辑定义在根目录 docker-compose.yaml 中。与后端开发相关的服务包括dbPostgreSQL 数据库使用ghcr.io/laion-ai/open-assistant/oasst-postgres镜像环境变量为POSTGRES_USERpostgres、POSTGRES_PASSWORDpostgres、POSTGRES_DBpostgres映射宿主端口5432:5432并通过pg_isready做健康检查docker-compose.yaml。redis用于缓存与限流映射端口6379:6379加载仓库根目录的 redis.confdocker-compose.yaml。redis-insightsRedis 可视化监控面板映射端口8001。adminer轻量级数据库管理工具映射端口8089:8080可手动检查 web 与 backend 两套数据库。注意Apple Silicon / M1 芯片若在 MacOS M1 上运行需要显式指定平台架构DB_PLATFORMlinux/x86_64 docker compose ...后端的默认配置已经按localhost:5432连接数据库见 config.py 中POSTGRES_HOSTlocalhost、POSTGRES_PORT5432等默认值因此数据库启动后无需额外改动即可连通。1.2 Python 版本与虚拟环境后端要求Python 3.10仓库根目录的.python-version文件声明了版本推荐使用pyenv管理进入仓库目录后 pyenv 会自动识别并切换到对应版本。1.3 安装 Python 依赖按顺序执行以下三步安装全部依赖pip install -r backend/requirements.txt pip install -e ./oasst-shared/. pip install -e ./oasst-data/.backend/requirements.txt是后端主依赖FastAPI、SQLModel、Celery、Redis 等oasst-shared以可编辑模式安装提供跨模块共享的协议 schema 与异常定义oasst-shared/oasst-data以可编辑模式安装提供导出数据格式ExportMessageTree、LabelAvgValue等与读写工具oasst-data/。安装完成后运行./scripts/backend-development/run-local.sh后端服务即会在http://localhost:8080启动。该脚本实际执行的是run-local.shuvicorn main:app --reload --port 8080 --host 0.0.0.0--reload开启热重载任何代码改动都会自动重启服务非常适合开发调试。1.4 本地开发脚本族scripts/backend-development/ 目录提供了一整套开发辅助脚本脚本作用run-local.sh以热重载模式启动后端默认跳过毒性/嵌入计算传hf参数则启用真实 HuggingFace 调用run-local-no-limit.sh关闭限流后启动本地后端start-docker.sh等价于docker compose --profile backend-dev up --build --attach-dependenciesstart-worker.sh在 backend 目录下启动 Celery worker含 Beat 调度器stop-worker.sh停止 Celery workerstart-mock-server.sh/stop-mock-server.sh启动/停止 mock 服务二、REST 服务器配置.env与核心环境变量2.1 生成.env配置文件复制 backend/.env.example 为.env并按要求修改# backend/.env.example 的内容 HUGGING_FACE_API_KEYHF API KEY DATABASE_URIpostgresql://username:passwordhost/database_name BACKEND_CORS_ORIGINS[http://localhost, http://localhost:4200, http://localhost:3000, http://localhost:8080, ...] REDIS_HOSTlocalhost REDIS_PORT6379其中DATABASE_URI必须设置为本地数据库地址例如postgresql://postgres:postgreslocalhost:5432/postgres。2.2 环境变量的底层解析逻辑所有环境变量最终由 backend/oasst_backend/config.py 中的Settings(BaseSettings)统一解析基于 pydantic 的BaseSettings读取当前目录下的.env文件大小写不敏感。几个关键点数据库连接若未显式设置DATABASE_URIpydantic validator 会根据POSTGRES_HOST、POSTGRES_PORT、POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB自动拼接出postgresql://连接串config.py。CORS既支持BACKEND_CORS_ORIGINS列表也支持用BACKEND_CORS_ORIGINS_CSV以逗号分隔字符串传入config.py。Redis 与限流RATE_LIMIT默认True、REDIS_HOST、REDIS_PORT控制 FastAPI 限流器。服务启动时会连接 Redis 并初始化FastAPILimitermain.py。DEBUG 系列开关DEBUG_SKIP_EMBEDDING_COMPUTATION与DEBUG_SKIP_TOXICITY_CALCULATION控制是否跳过 HuggingFace 的嵌入向量与毒性计算本地无 API Key 时置True可加速DEBUG_USE_SEED_DATA会在启动时把backend/test_data/realistic/realistic_seed_data.json的种子数据灌入数据库方便本地联调main.py。认证相关AUTH_*系列字段用于解密前端 NextAuth.js 生成的 JWT必须与website的认证配置保持一致OFFICIAL_WEB_API_KEY用于启动时自动创建官方 Web API 客户端main.py。Prometheus 指标ENABLE_PROM_METRICS默认True会在/metrics暴露监控指标main.py。2.3 主服务启动入口后端入口为 backend/main.py。除了uvicorn启动它还提供了几个实用 CLI 参数main.pypython main.py --host 0.0.0.0 --port 8080 # 常规启动 python main.py --print-openapi-schema # 将 OpenAPI schema 打印到 stdout python main.py --retry-scoring # 重试打分失败的消息树后退出服务启动时会执行一系列 startup 事件自动升级 Alembic 到最新版本UPDATE_ALEMBIC开启时、创建官方 Web API 客户端、初始化 Prometheus 与限流器、检查/恢复消息树状态TreeManager.ensure_tree_states()、按周期更新日/周/月/总排行榜缓存统计、每小时清理过期任务等main.py。三、Alembic数据库迁移管理修改 SQL 模型位于 backend/oasst_backend/models/后需要在backend目录下生成迁移脚本cd backend alembic revision --autogenerate -m 描述你做的改动生成后务必人工检查并编辑新创建的迁移文件再执行alembic upgrade head应用到数据库。仓库中已有的迁移脚本全部位于 backend/alembic/versions/例如add_message_revisions.py、add_text_search.py等可作为编写迁移的参考范本。后端启动时若UPDATE_ALEMBICTrue默认开启会自动把数据库升级到head避免手工执行main.py。四、API 文档本地 docs 与 OpenAPI 导出后端启动后默认 API 文档地址为http://localhost:8080/docsSwagger UI由 FastAPI 自动生成openapi_url为/api/v1/openapi.json见 main.py。如果需要把 OpenAPI 规范同步到仓库docs/目录以便其他人无需搭建环境即可查看 API 定义可以执行wget localhost:8080/api/v1/openapi.json -O docs/docs/api/backend-openapi.json导出的文件即 docs/docs/api/backend-openapi.json。该文件预期由test-api-contract.yamlCI 工作流自动更新README 中标注为 TODO。五、Celery Worker异步任务与周期调度5.1 职责划分Celery 在后端体系中承担两类工作异步 HuggingFace 调用如消息毒性检测toxicity与嵌入特征提取feature extraction / embedding computation周期任务Celery Beat如用户连续签到天数user streak重置。Celery 应用定义在 backend/oasst_backend/celery_worker.pybroker 与 result backend 默认均为redis://localhost:6379/0可用CELERY_BROKER_URL/CELERY_RESULT_BACKEND覆盖。内置的 beat 调度表celery_worker.py任务名调度周期说明periodic_user_streak_reset每 4 小时重置用户连续签到update_search_vectors每 20 分钟批量更新全文搜索向量batch_size1000周期任务的具体实现位于 backend/oasst_backend/scheduled_tasks.py通过include[oasst_backend.scheduled_tasks]引入。5.2 本地运行 Worker按 README 的指引在 backend/oasst_backend/config.py 中把HUGGING_FACE_API_KEY设置为正确的 API Key在 scripts/backend-development/run-local.sh 中确认export DEBUG_SKIP_TOXICITY_CALCULATIONFalse export DEBUG_SKIP_EMBEDDING_COMPUTATIONFalse在backend目录运行 worker 启动脚本start-worker.sh./scripts/backend-development/start-worker.sh # 等价于: celery -A oasst_backend.celery_worker worker -l INFO -B其中-B表示把 Beat 调度器内嵌进 worker 进程。查看日志tail -f celery.log tail -f celery.beat.log5.3 CI / Docker 环境运行 Worker在 CI或 docker-compose 环境中在根目录 docker-compose.yaml 里设置DEBUG_SKIP_TOXICITY_CALCULATIONFalse与DEBUG_SKIP_EMBEDDING_COMPUTATIONFalsebackend 服务已默认如此配置见 docker-compose.yaml会创建两个 Docker 实例backend-workercelery -A oasst_backend.celery_worker worker -l info -E与backend-worker-beatcelery -A oasst_backend.celery_worker beat -l INFO两者均依赖 db 与 redis 健康检查docker-compose.yaml日志与普通 Docker 容器一样通过docker logs查看。六、数据导出export.py详解6.1 基本用法数据在数据库中积累后可用 backend/export.py 导出。它直接连接数据库复用后端的.env配置因此需要与后端相同的 Python 环境。导出所有通过评审的英文消息树python export.py --lang en --export-file output.jsonl完整选项列表可用python export.py --help查看。6.2 参数语义与源码级说明结合 export.py 的 argparse 定义各参数含义如下参数默认行为说明--export-file输出到 STDOUT导出文件名文件名含.gz时自动启用 gzip 压缩--include-deleted排除包含已删除消息--deleted-only—仅导出已删除消息隐含--include-deleted--include-spam排除包含未评审或评审为负的消息review_result不限定为 True--spam-only—仅导出评审为负的消息隐含--include-spam--include-synthetic排除包含合成消息--synthetic-only—仅导出合成消息--user UUID—仅导出指定用户参与的消息与--state互斥--state stateready_for_export消息树状态过滤all、prompt_lottery_waiting、growing、ready_for_export、aborted_low_grade、halted_by_moderator、backlog_ranking--lang code全部按 BCP 47 语言码过滤如en--prompts-only—仅导出初始 prompt 消息列表--export-labels—附带消息的平均文本标签值含各标签的 count--export-events—附带用户的 emoji、评分rating、排序ranking事件--limit N全部最多导出的消息树数量--anonymizer-seed int不匿名匿名化随机种子不指定则不做匿名化几个值得注意的实现细节默认过滤链若不传--state默认只导出READY_FOR_EXPORT状态的树review_result默认限定为True即必须通过评审--include-spam会放宽该限制export.py。匿名化传入--anonymizer-seed时使用oasst_shared.utils.Anonymizer对用户 ID 等敏感信息做确定性匿名化不传则打印警告并原样导出export.py。导出格式正常树导出时使用tree_export.build_export_tree组装成ExportMessageTree结构消息树 标签均值 事件并使用oasst_data的 writer 写入文件export.py按用户过滤或过滤不完整树时则扁平化为消息列表导出。数据来源导出时对Message、MessageTreeState、MessageEmoji、MessageReaction、TextLabels等表进行聚合查询按TextLabel枚举逐一计算avg(labels[l])与count(labels[l])export.py。6.3 常见问题Why isnt my export working?README 指出最常见的原因是消息尚未通过评审流程导致消息树未达到可导出状态。此时可加上--include-spam参数将review_result限制放宽为不限从而导出尚未通过评审的树export.py。七、总结Open-Assistant 的 REST 后端是一个典型的FastAPI SQLModel PostgreSQL Redis Celery技术栈环境就绪docker compose --profile backend-dev up --build --attach-dependencies一条命令拉起数据库与 Redis服务启动pip install三个依赖后运行 run-local.shuvicorn热重载模式监听8080配置驱动所有行为数据库、Redis、限流、DEBUG 开关、种子数据、Prometheus均由.env环境变量经 config.py 统一驱动迁移与文档Alembic 管理 schema 演进启动时自动升级/docs提供交互式 API 文档wget可同步 OpenAPI 规范到 docs/docs/api/backend-openapi.json异步任务Celery Worker Beat 处理毒性检测、嵌入计算与周期任务本地与 CI/Docker 两种运行模式均有配套脚本数据出口export.py 提供高度可配置的消息树导出能力语言、状态、评审结果、匿名化、压缩等是 Open-Assistant 数据飞轮的关键一环。按照上述步骤你即可获得一套完整的本地开发环境并深入理解该后端从数据采集到数据集导出的全链路设计。【免费下载链接】Open-AssistantOpenAssistant is a chat-based assistant that understands tasks, can interact with third-party systems, and retrieve information dynamically to do so.项目地址: https://gitcode.com/gh_mirrors/op/Open-Assistant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表