Django在国内一直有一个很奇特的生态位置有人觉得它重、不够“现代”有人却用它撑起大量内容平台、内部管理系统和 API 后端。最近围绕 Django 社区的一个讨论点很有意思——Django 专家 Paolo Melchiorre 在公开分享中把 AI 和开源放在一起谈核心不是“Django 要被 AI 取代”而是“Django 应用如何更舒服地接入 AI 能力”。这类观点对后端开发者有直接参考价值尤其是用 Django 做产品后端、想在现有系统里加语义搜索或内容理解能力的人。这篇文章不会逐字转写访谈内容而是把 Paolo 在开源与 AI 方向上的几个公开观点整理成一套可以在本地跑通的 Django PostgreSQL pgvector 语义搜索实践。你会看到 Django 创建项目、创建 app、接入向量字段、暴露搜索 API 的完整过程也会看到批量任务、资源占用、常见坑和开源合规边界。文章以中文为主关键术语附英文方便对照官方文档。如果你关心的是这些问题Django 现在还值不值得学、AI 功能能不能用最朴素的方式接到 Django 项目里、开源模型和开源框架在法律上到底要注意什么这篇可以收藏后慢慢看。1. 核心话题速览Django、AI 与开源的交汇点先给一张速览表把 Paolo 这场公开分享里最相关的几个话题列出来后文会围绕这些点展开。话题英文对照实际内容Django 在 AI 时代的位置Django in the AI eraDjango 依然是 Web 框架AI 是能力层不是替代层开源框架与开源模型Open source framework open modelsDjango 本身开源AI 模型也强调开源、可本地部署语义搜索实现Semantic search用 PostgreSQL pgvector 让 Django 具备向量检索能力社区与国际会议Community conferencesDjangoCon Europe、EuroPython 等场合的公开讨论边界与合规License, privacy, compliance开源模型不等于任意商用数据隐私是底线从公开分享内容看Paolo 更关注的是“怎么让 Django 开发者用已有的技术栈去接 AI”而不是让大家丢掉 Django 去追新框架。这个态度对国内后端开发者很实用项目已经用 Django 了没必要为了一个搜索功能重写整个系统。另一个值得注意的点是Paolo 多次强调开源生态对 AI 的支撑作用。Django 是开源项目PostgreSQL 是开源数据库pgvector 是开源扩展Embedding 模型现在也有很多开源选择。也就是说从 Web 层到数据层再到向量化层整条链路可以做到完全开源、本地可控。2. Python Django 国内使用现状与适用场景很多人问“python django 国内使用广泛么”。从搜索引擎热词和社区讨论来看Django 在国内的使用量没有 Flask 那么“轻量普及”但在企业级后端、内容管理系统、电商后台、数据平台接口层里Django 一直很稳定。尤其是需要自带 Admin 管理后台、ORM 足够成熟、权限体系现成的项目Django 反而是效率最高的选择之一。2.1 Django 适合解决的场景内容类网站新闻、博客、文档站Django 的 ORM 和模板系统很成熟。内部管理系统Admin 后台帮了大忙几分钟就能生成可用的数据管理界面。API 后端配合 Django REST Framework可以快速提供 JSON 接口。AI 应用的服务端Django 作为 Web 层调用本地模型或第三方模型 API。NAS 或小服务器部署像“飞牛 NAS 搭建 Django 网站”这类需求本质上就是 Django SQLite/PostgreSQL 反向代理的常规操作。2.2 Django 不适合的场景极高并发、海量长连接的实时推送不是 Django 的强项。纯前端页面为主、后端极简的小服务用 Django 会显得重。团队对 Python 生态不熟又要强求低资源占用也不适合硬上 Django。对想接 AI 的团队来说Django 的定位很清晰它负责接收请求、管理数据、调度任务、输出结果模型推理可以放在本地 Python 进程里也可以走远程 API。别把 AI 想成独立系统它就是 Django 项目里的一个模块。3. 环境准备Django PostgreSQL pgvector 的 AI 开发前置条件要验证“Django 应用接入 AI 能力”我建议走一套最小路径Django PostgreSQL pgvector Embedding 模型。这套组合不依赖复杂的 AI 框架主要验证的是怎么在 Django 的 ORM 里存储向量怎么用向量做相似度检索。3.1 操作系统与软件要求组件建议版本说明操作系统Linux / macOS / Windows生产环境推荐 LinuxPython3.10 或更高新项目建议 3.11 / 3.12PostgreSQL14 或更高需要支持 pgvector 扩展pgvector0.5.0 以上向量存储与检索扩展Django4.2 LTS 或 5.xLTS 更稳Django REST Framework3.15 左右提供 API 能力如果你本机没有 PostgreSQL可以用 Docker 快速启动一个带 pgvector 的数据库实例# 拉取 pgvector 镜像具体版本以官方镜像为准 docker run --name pgvector-demo \ -e POSTGRES_USERpostgres \ -e POSTGRES_PASSWORDpostgres \ -e POSTGRES_DBai_demo \ -p 5432:5432 \ -d pgvector/pgvector:pg16这里不把某个镜像版本写死因为不同环境的镜像 tag 更新速度不一样。启动后进入容器创建扩展docker exec -it pgvector-demo psql -U postgres -d ai_demo -c CREATE EXTENSION IF NOT EXISTS vector;3.2 Python 虚拟环境与依赖安装Django 项目一定要用虚拟环境避免系统 Python 环境被搞乱python -m venv .venv source .venv/bin/activate # Windows 下使用 .venv\Scripts\activate pip install django psycopg[binary] pgvector djangorestframeworkpgvector这个 Python 包负责给 Django ORM 提供VectorField字段psycopg[binary]是 PostgreSQL 驱动。装完依赖开始建项目。4. 创建 Django 项目与应用最小 AI 后端骨架很多人搜“django 创建 app”这里顺手把标准流程演示一遍后续所有 AI 功能都在 app 里实现。4.1 创建项目与 appdjango-admin startproject my_ai_backend cd my_ai_backend python manage.py startapp search创建完成后search这个 app 用来放文档模型、向量检索逻辑和 API 视图。4.2 修改 settings.py打开my_ai_backend/settings.py至少做三处修改注册 app、配置 PostgreSQL 数据库、如果要用 DRF 就把rest_framework加进去。# settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, rest_framework, search, ] DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: ai_demo, USER: postgres, PASSWORD: postgres, HOST: 127.0.0.1, PORT: 5432, } }注意这里的数据库参数是我的测试配置你需要按本地环境改。生产环境不要用弱密码。4.3 配置时区与语言Django 默认语言是英文时区是 UTC。中文项目可以改成LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai USE_TZ True改完以后执行数据库迁移python manage.py migrate这一步会把 Django 内置的 auth、session 等表建好同时验证 PostgreSQL 连接是否正常。如果这里报错先检查数据库容器有没有启动、端口和密码是否一致。5. 在 Django 中实现向量语义搜索Paolo 在分享里提到的一个核心思路是AI 能力不一定要做成独立服务它可以作为数据库和 ORM 的一部分天然融入 Web 框架。pgvector 就是这种思路的典型代表向量字段像普通字段一样存进 PostgreSQLDjango 的 ORM 可以像查普通字段一样查向量。5.1 定义带向量字段的模型在search/models.py里写一个文档模型from django.db import models from pgvector.django import VectorField class Document(models.Model): title models.CharField(max_length255) content models.TextField() embedding VectorField(dimensions1024) created_at models.DateTimeField(auto_now_addTrue) class Meta: ordering [-created_at] def __str__(self): return self.titledimensions1024不是固定值它必须和你使用的 Embedding 模型输出维度保持一致。比如 OpenAI 的text-embedding-ada-002是 1536 维阿里巴巴的text-embedding-v3是 1024 维开源模型bge-m3也是 1024 维左右。用哪个模型就填哪个维度不能随便编。5.2 生成并保存向量你可以用开源 Embedding 模型本地生成向量也可以调用远程 API。下面是一个通用逻辑示例重点是“把文本转成向量再存进 Django ORM”from django.core.management.base import BaseCommand from search.models import Document from search.embedding import get_embedding # 你的向量生成函数 class Command(BaseCommand): help 为没有向量的文档批量生成 embedding def handle(self, *args, **options): docs Document.objects.filter(embedding__isnullTrue) for doc in docs.iterator(): doc.embedding get_embedding(doc.content) doc.save(update_fields[embedding]) self.stdout.write(self.style.SUCCESS(fdone: {docs.count()} docs))这个代码块里我写了from search.embedding import get_embedding实际的get_embedding函数需要你根据自己选的模型去实现。如果本地模型就是model.encode(text)如果远程 API就是client.embeddings.create(...)。5.3 向量检索查询pgvector 提供了多种距离函数Django 的pgvector.django包把它们封装成了 ORM 表达式from pgvector.django import CosineDistance from search.models import Document def semantic_search(query_embedding, top_k10): return ( Document.objects .annotate(distanceCosineDistance(embedding, query_embedding)) .order_by(distance)[:top_k] )这里用余弦距离排序距离越小表示语义越接近。查询时你要先把用户输入的问题转换成 embedding再传给这个函数。5.4 建立向量索引数据量小的时候全表扫描也能接受。数据量到十万级、百万级以后必须建向量索引。pgvector 支持 HNSW 和 IVFFlat 两种索引-- 在 psql 中执行注意表名换成你实际的 Django 表名 CREATE INDEX CONCURRENTLY document_embedding_hnsw_idx ON search_document USING hnsw (embedding vector_cosine_ops);如果你的数据量不大用CONCURRENTLY反而会慢可以先不加这个关键字。索引不是越多越好尤其是高维向量建索引会显著增加存储和写入开销。5.5 实际验证推荐用 Django shell 做一次手动验证python manage.py shellfrom search.models import Document from search.embedding import get_embedding # 插入一条测试数据 doc Document.objects.create( titleDjango 与 AI, contentDjango 可以作为 AI 应用的服务端框架配合向量数据库实现语义搜索。, ) doc.embedding get_embedding(doc.content) doc.save() # 查询 query Django 能做 AI 后端吗 query_embedding get_embedding(query) results semantic_search(query_embedding, top_k5) for r in results: print(r.title, r.distance)如果输出的第一条就是刚才插入的文档说明语义搜索链路已经跑通。6. 用 DRF 暴露语义搜索 API 并支持批量任务装 Django REST Framework 不只是为了出 JSON更重要的是把检索能力开放给前端、小程序、爬虫或其他后端服务。6.1 序列化器在search/serializers.py里写from rest_framework import serializers from search.models import Document class DocumentSerializer(serializers.ModelSerializer): distance serializers.FloatField(read_onlyTrue, requiredFalse) class Meta: model Document fields [id, title, content, distance]6.2 视图集在search/views.py里写一个只读视图集from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from search.models import Document from search.serializers import DocumentSerializer from search.embedding import get_embedding from search.query import semantic_search class DocumentViewSet(viewsets.ReadOnlyModelViewSet): queryset Document.objects.all() serializer_class DocumentSerializer action(detailFalse, methods[get]) def search(self, request): q request.query_params.get(q, ) if not q: return Response({error: missing q}, statusstatus.HTTP_400_BAD_REQUEST) query_embedding get_embedding(q) results semantic_search(query_embedding, top_k10) return Response(self.get_serializer(results, manyTrue).data)6.3 路由在my_ai_backend/urls.py里注册路由from django.urls import path, include from rest_framework.routers import DefaultRouter from search.views import DocumentViewSet router DefaultRouter() router.register(documents, DocumentViewSet, basenamedocument) urlpatterns [ path(api/, include(router.urls)), ]启动服务python manage.py runserver 127.0.0.1:8000用 curl 测试接口curl http://127.0.0.1:8000/api/documents/search/?qDjango%20%E8%83%BD%E5%81%9A%20AI%20%E5%90%8E%E7%AB%AF%E5%90%97接口能返回 JSON 数组里面包含文档标题、内容和距离就说明 API 通了。之后前端可以直接调这个接口后端只需要维护向量数据。6.4 批量任务与失败重试批量场景主要分两类一是初始化数据时给大量历史文档生成 embedding二是定时把新增文档同步到向量索引。简单方案是写 Django management command配合iterator()分批次处理# search/management/commands/generate_embeddings.py from django.core.management.base import BaseCommand from search.models import Document from search.embedding import get_embedding class Command(BaseCommand): help 批量生成 embedding带失败重试 def add_arguments(self, parser): parser.add_argument(--batch-size, typeint, default100) parser.add_argument(--max-retries, typeint, default3) def handle(self, *args, **options): batch_size options[batch_size] max_retries options[max_retries] docs Document.objects.filter(embedding__isnullTrue) pending_retry [] for doc in docs.iterator(chunk_sizebatch_size): for attempt in range(max_retries): try: doc.embedding get_embedding(doc.content) doc.save(update_fields[embedding]) break except Exception as exc: self.stderr.write(fattempt {attempt 1} failed: {exc}) if attempt max_retries - 1: pending_retry.append(doc.id)如果文档量很大建议把任务交给 Celery 或 Django Q 这类异步任务队列避免阻塞 Web 请求。队列设计要保持简单任务入队、worker 消费、失败重试、日志记录。7. 资源占用与性能观察Django pgvector 的语义搜索资源瓶颈通常不在 Django 本身而在向量维度、Embedding 模型和数据库索引。7.1 显存与 CPU如果使用本地开源 Embedding 模型比如bge-small-zh、m3e-small这类小模型CPU 即可运行内存占用通常只有几百 MB 到 2GB 左右不强制 GPU。如果使用 7B 以上的大模型做 embedding 或生成任务才需要考虑 GPU 显存。实际显存占用必须以你选择的模型和推理参数为准不能一概而论。如果使用远程 Embedding API比如 OpenAI、阿里云 DashScope、百度千帆等本机资源占用很低但会按 token 计费并且数据会离开本地。对敏感数据这一点必须先想清楚。7.2 向量检索的性能观察向量维度越高存储越大检索越慢。1024 维和 1536 维的区别在高并发下会被放大。数据量小时是否建索引影响不大数据量上来以后HNSW 索引一般优于 IVFFlat。搜索时建议限制top_k不要一次取回几千条向量。Django 的 ORM 不要把所有 embedding 都加载到内存必须用iterator()做批量遍历。7.3 缓存与限流同一段文本的 embedding 结果可以缓存。Django 自带缓存框架可以配合 Redis 用from django.core.cache import cache def get_embedding_cached(text): key fembedding:{hash(text)} value cache.get(key) if value is not None: return value value get_embedding(text) cache.set(key, value, timeout86400) return value如果 API 要公网开放还要加限流避免有人恶意刷请求把 embedding API 的预算刷爆。DRF 自带Throttling机制可以直接配置。8. Django 接 AI 常见问题与排查方法问题现象可能原因排查方式解决方案pip install pgvector失败缺少 PostgreSQL 客户端头文件查看错误日志安装libpq-dev或对应系统依赖连不上 PostgreSQL容器没启动、端口不对、密码错误docker ps、psql连接测试修正 DATABASES 配置或重启容器VectorField维度不一致Embedding 模型换了输出维度不同打印embedding.shape统一模型或清空向量字段重建搜索返回结果为空没插入向量数据或向量索引未生效Django shell 查询Document.objects.count()先跑 embedding 生成命令迁移报vector类型不存在没有在数据库创建扩展psql -c CREATE EXTENSION IF NOT EXISTS vector;先建扩展再迁移API 返回 500视图里get_embedding报错或超时看 Django 日志和异常栈单独测试get_embedding函数批量任务卡住embedding API 超时或被限流看 worker 日志加超时、重试、退避策略runserver端口被占用端口和现有进程冲突lsof -i :8000或netstat -ano换端口或结束占用进程输出质量不稳定模型能力弱、文本太长、脏数据太多抽样对比输入输出换更大模型预处理文本清理重复数据排查时有一个原则先从最外层接口往内层逐层缩小范围。先看 Django 日志再看数据库查询最后看模型调用。不要一上来就怀疑 AI 模型很多时候问题出在数据没写进去或向量没生成。9. 开源与 AI 的边界许可证、版权与隐私Paolo 在讨论 AI 与开源时另一个反复出现的点是“边界”。这和国内很多开发者的痛点直接相关。9.1 开源模型不等于任意商用Django 用的是 BSD 许可证比较宽松可以商用。但 AI 模型的许可证五花八门有 MIT、Apache 2.0也有针对研究用途限制的 License还有要求遵守额外条款的模型。接模型之前必须先确认模型许可证是否允许商用、是否允许在特定国家/地区使用、是否要求保留出处声明。9.2 训练数据与生成内容的版权即使模型本身允许商用训练数据是否存在版权问题目前仍是一个争议很大的领域。用开源模型生成出来的内容版权归属也可能受到法律和政策影响。稳妥的做法是商用前做内容复核尤其是涉及人脸、商标、知名作品、第三方 IP 的场景。9.3 隐私与数据合规如果业务涉及用户个人信息、医疗数据、金融数据绝不能直接把这些数据发给第三方 API。优先考虑本地部署开源模型。如果必须用远程 API要做脱敏、加密、最小化传输并且在用户协议里明确告知数据处理方式。涉及人脸、声音、肖像等生物特征信息时应用层还必须做显式授权与合规审查。任何 AI 生成、替换、克隆类功能都要在法律允许的范围内测试和使用。10. 总结Django 开发者的 AI 下一步这场围绕“Django 专家谈 AI 与开源”的讨论最值得记住的一点是不要为了 AI 重构你的 Django 项目。AI 在 Django 世界里更像是一块新积木可以插在 ORM 层、API 层或任务队列层。先从语义搜索开始是成本最低、见效最快的方式。建议先做三件事第一搭一个 Django PostgreSQL pgvector 的最小项目把向量字段和余弦距离查询跑通第二写一个 management command用批量为历史数据生成 embedding加重试和日志第三用 DRF 暴露搜索接口让前端可以调用观察接口响应时间和数据库负载。这三步跑完你就能判断这个方案是否适合你的业务而不是停留在概念讨论层面。最容易踩的坑有两个一是向量维度不统一模型一换之前的数据全部要重建二是跳过数据库索引数据量一涨接口立刻变慢。把这两点控制好Django 接 AI 这条路就很稳了。后面如果你愿意继续深入可以再试 RAG检索增强生成、知识库问答、内容自动分类思路都是从这篇文章的最小骨架往外扩展。