本教程将从零开始,带你构建一个支持 WebSocket 流式响应、用户登录、模型选择、Docker 一键部署的本地 AI 对话系统。
当前大模型应用如雨后春笋,但很多用户对云端模型(如 GPT、Claude)存在数据隐私和成本担忧。Ollama 提供了本地运行主流大模型的能力,而 Django 是稳定、可扩展的 Web 框架。结合两者,我们可以打造一套完全离线、可控、安全的 AI 对话系统。
组件 | 作用 | 优点 |
---|---|---|
Django | 后端框架 | 全栈支持、ORM、认证系统齐全、适合中大型项目 |
Ollama | 大模型运行平台 | 本地部署、支持多模型、统一 API、开箱即用 |
Channels | WebSocket 实现组件 | Django 官方推荐、兼容性强 |
DRF | 构建 RESTful API 接口 | 与前端分离良好,方便接口扩展 |
Docker | 环境隔离与一键部署 | 本地开发方便、生产部署一致 |
Ollama 是一个轻量级的本地大模型运行平台,核心能力包括:
curl
、Python requests
或 WebSocket
接口访问
请求:
{
"model": "llama3",
"prompt": "你好,介绍一下你自己",
"stream": true
}
响应(流式 JSON 每行返回):
{"response": "你好,"}
{"response": "我是一个本地运行的大模型..."}
django-admin startproject ollama_chat
cd ollama_chat
python manage.py startapp chat
pip install django djangorestframework channels aiohttp
修改 settings.py
:
INSTALLED_APPS = [
...
'rest_framework',
'chat',
'channels',
]
ASGI_APPLICATION = 'ollama_chat.asgi.application'
添加 asgi.py
支持:
# ollama_chat/asgi.py
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from chat.routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ollama_chat.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": URLRouter(websocket_urlpatterns),
})
# chat/consumers.py
import aiohttp
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()
async def disconnect(self, _):
pass
async def receive(self, text_data):
data = json.loads(text_data)
prompt = data['prompt']
model = data.get('model', 'llama3')
async with aiohttp.ClientSession() as session:
async with session.post(
"http://localhost:11434/api/generate",
json={"model": model, "prompt": prompt, "stream": True}
) as resp:
async for line in resp.content:
if not line:
continue
try:
content = json.loads(line.decode())
await self.send(json.dumps({'response': content.get('response', '')}))
except:
pass
# chat/routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/$', consumers.ChatConsumer.as_asgi()),
]
<!-- templates/chat.html -->
<!DOCTYPE html>
<html>
<head><title>Ollama Chat</title></head>
<body>
<h2>与 Ollama 聊天</h2>
<textarea id="prompt"></textarea>
<button onclick="send()">发送</button>
<pre id="response"></pre>
<script>
const socket = new WebSocket("ws://" + window.location.host + "/ws/chat/");
socket.onmessage = function(event) {
document.getElementById("response").textContent += event.data.replace(/^"|"$/g, '');
};
function send() {
const prompt = document.getElementById("prompt").value;
socket.send(JSON.stringify({prompt: prompt}));
}
</script>
</body>
</html>
# chat/models.py
from django.contrib.auth.models import User
from django.db import models
class ChatHistory(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
prompt = models.TextField()
response = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["daphne", "ollama_chat.asgi:application"]
version: '3'
services:
django:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- ollama
ollama:
image: ollama/ollama
ports:
- "11434:11434"
volumes:
- ollama:/root/.ollama
volumes:
ollama:
这套 Django + Ollama 架构适用于以下场景:
如果你正在寻找一个从 0 到 1 的大模型应用开发实践,这将是一个非常扎实的起点。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有