首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >💬 使用 Django + Ollama 打造本地私有化对话网站(全功能详解版)

💬 使用 Django + Ollama 打造本地私有化对话网站(全功能详解版)

原创
作者头像
IT蜗壳-Tango
发布2025-04-07 22:36:04
发布2025-04-07 22:36:04
7140
举报
文章被收录于专栏:机器学习机器学习

本教程将从零开始,带你构建一个支持 WebSocket 流式响应、用户登录、模型选择、Docker 一键部署的本地 AI 对话系统。


一、项目背景与技术选型

1.1 项目背景

当前大模型应用如雨后春笋,但很多用户对云端模型(如 GPT、Claude)存在数据隐私和成本担忧。Ollama 提供了本地运行主流大模型的能力,而 Django 是稳定、可扩展的 Web 框架。结合两者,我们可以打造一套完全离线、可控、安全的 AI 对话系统

1.2 技术选型优势

组件

作用

优点

Django

后端框架

全栈支持、ORM、认证系统齐全、适合中大型项目

Ollama

大模型运行平台

本地部署、支持多模型、统一 API、开箱即用

Channels

WebSocket 实现组件

Django 官方推荐、兼容性强

DRF

构建 RESTful API 接口

与前端分离良好,方便接口扩展

Docker

环境隔离与一键部署

本地开发方便、生产部署一致


二、使用架构的优势与劣势分析

2.1 优势

  1. 隐私安全:所有数据本地处理,适用于医疗、教育、政府等敏感场景。
  2. 本地部署灵活:模型自由更换,不依赖 API Key,响应速度可控。
  3. 扩展性强:可拓展用户系统、知识库、日志系统等模块。
  4. 前后端分离友好:支持 Vue、React 等前端对接。
  5. 支持流式响应:用户体验佳,生成内容实时显示。

2.2 不足

  1. 资源需求高:模型如 LLaMA3 至少需要 16G 内存 + 8G 显存。
  2. 复杂性增加:涉及模型管理、WebSocket、并发处理等。
  3. 调优困难:比起 GPT-4、Claude 等闭源模型,开源模型能力仍有差距。

三、Ollama 与 Django 基础知识

3.1 Ollama 快速了解

Ollama 是一个轻量级的本地大模型运行平台,核心能力包括:

  • ✅ 本地运行主流开源模型(如 LLaMA、Mistral、Gemma、Phi)
  • ✅ 支持 curlPython requestsWebSocket 接口访问
  • ✅ 支持流式输出(stream: true)
API 示例

请求:

代码语言:javascript
复制
{
  "model": "llama3",
  "prompt": "你好,介绍一下你自己",
  "stream": true
}

响应(流式 JSON 每行返回):

代码语言:javascript
复制
{"response": "你好,"}
{"response": "我是一个本地运行的大模型..."}

3.2 Django 简要知识

  • Model(模型):用于定义数据结构。
  • View(视图):处理请求逻辑。
  • Template(模板):渲染前端页面。
  • Channels:用于实现 WebSocket 交互。
  • DRF:构建 REST API 的核心工具集。

四、项目实战:搭建本地对话系统

4.1 初始化项目

代码语言:javascript
复制
django-admin startproject ollama_chat
cd ollama_chat
python manage.py startapp chat

4.2 安装依赖

代码语言:javascript
复制
pip install django djangorestframework channels aiohttp

修改 settings.py

代码语言:javascript
复制
INSTALLED_APPS = [
    ...
    'rest_framework',
    'chat',
    'channels',
]

ASGI_APPLICATION = 'ollama_chat.asgi.application'

添加 asgi.py 支持:

代码语言:javascript
复制
# 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),
})

五、实现核心功能

5.1 WebSocket 消费者(流式返回)

代码语言:javascript
复制
# 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

5.2 WebSocket 路由绑定

代码语言:javascript
复制
# chat/routing.py
from django.urls import re_path
from . import consumers

websocket_urlpatterns = [
    re_path(r'ws/chat/$', consumers.ChatConsumer.as_asgi()),
]

六、创建前端页面

代码语言:javascript
复制
<!-- 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>

七、进阶:用户登录 + 聊天记录保存

代码语言:javascript
复制
# 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)

八、Docker 一键部署

8.1 Dockerfile

代码语言:javascript
复制
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["daphne", "ollama_chat.asgi:application"]

8.2 docker-compose.yml

代码语言:javascript
复制
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:

九、未来可拓展方向(可选功能)

  1. ✅ 多用户角色管理与权限控制
  2. ✅ 多模型切换 + 参数调整界面(temperature, top_k 等)
  3. ✅ 引入向量知识库(RAG)系统
  4. ✅ 多轮上下文记忆与对话摘要
  5. ✅ 前端使用 Vue/React 实现多会话记录

🔚 总结

这套 Django + Ollama 架构适用于以下场景:

  • 私有部署的大模型交互系统
  • 教育、科研、政企数据本地处理场景
  • 可离线运行的大模型助手

如果你正在寻找一个从 0 到 1 的大模型应用开发实践,这将是一个非常扎实的起点。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、项目背景与技术选型
    • 1.1 项目背景
    • 1.2 技术选型优势
  • 二、使用架构的优势与劣势分析
    • 2.1 优势
    • 2.2 不足
  • 三、Ollama 与 Django 基础知识
    • 3.1 Ollama 快速了解
      • API 示例
    • 3.2 Django 简要知识
  • 四、项目实战:搭建本地对话系统
    • 4.1 初始化项目
    • 4.2 安装依赖
  • 五、实现核心功能
    • 5.1 WebSocket 消费者(流式返回)
    • 5.2 WebSocket 路由绑定
  • 六、创建前端页面
  • 七、进阶:用户登录 + 聊天记录保存
  • 八、Docker 一键部署
    • 8.1 Dockerfile
    • 8.2 docker-compose.yml
  • 九、未来可拓展方向(可选功能)
  • 🔚 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档