【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API
Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API
本文档将介绍如何使用 Django 和 Django REST Framework 构建一个 AI 聊天机器人项目,并结合 OpenAI 的 GPT 模型提供代码解释服务。步骤包括创建 Django 项目、配置 API、与 OpenAI 集成,并最终提供一个可通过 REST API 调用的服务。
项目结构
drf_chatgpt/ # Django 项目目录├── api/ # API 应用目录├── src/ # Django 配置文件目录├── manage.py # Django 管理工具├── .env # 环境变量文件├── requirements.txt # 项目依赖
步骤 1:创建虚拟环境
首先,创建一个虚拟环境来隔离项目的依赖:
python -m venv venv
激活虚拟环境:
- Windows:
venv\Scripts\activate - Linux / MacOS:
source venv/bin/activate
步骤 2:安装依赖
安装 Django、Django REST Framework 和 OpenAI SDK:
pip install django djangorestframework openai
生成 requirements.txt 以便日后使用:
pip freeze > requirements.txt
步骤 3:创建 Django 项目
使用 django-admin 命令创建一个名为 src 的 Django 项目:
django-admin startproject src .
修改 src/settings.py
在 INSTALLED_APPS 中添加所需的应用:
INSTALLED_APPS = [# external apps'rest_framework','rest_framework.authtoken',# internal apps'api',# default apps'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]
步骤 4:创建数据库并运行开发服务器
-
创建数据库迁移并应用:
python manage.py migrate -
创建超级用户以便访问 Django 管理后台:
python manage.py createsuperuser -
启动开发服务器:
python manage.py runserver
步骤 5:获取 OpenAI API Key
使用环境变量来存储 OpenAI API 密钥。首先,创建一个 .env 文件并将 API 密钥添加到其中:
# .env 文件
OPENAI_APIKEY="sk-Wxxxxxxxx"
在 settings.py 中加载该变量:
import os
from dotenv import load_dotenv
load_dotenv()APIKEY = os.getenv("OPENAI_APIKEY")
步骤 6:创建 API 应用
创建一个新的 Django 应用 api:
python manage.py startapp api
设置 API 请求到 OpenAI 的工具函数
在 api/utils.py 中创建与 OpenAI API 的集成函数:
import openai
from django.conf import settingsopenai.api_key = settings.APIKEYdef send_code_to_api(code):try:res = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": f"Tell me what language is this code written? {code}"},{"role": "system", "content": "You are a helpful assistant that provides code explanations."},{"role": "assistant", "content": "Sure! Please provide the code you want me to explain."}],)return res["choices"][0]["message"]["content"]except openai.error.APIError as e:raise ValueError(f"OpenAI API returned an API Error: {e}")except openai.error.APIConnectionError as e:raise ValueError(f"Failed to connect to OpenAI API: {e}")except openai.error.RateLimitError as e:raise ValueError(f"OpenAI API request exceeded rate limit: {e}")
步骤 7:创建模型
在 api/models.py 中定义一个用于存储代码及其解释的模型:
from django.db import modelsclass CodeExplainer(models.Model):_input = models.TextField()_output = models.TextField()class Meta:db_table = "t_code_explainer"
创建并迁移模型:
python manage.py makemigrations api
python manage.py migrate api
步骤 8:配置 URL 和视图
- 在项目的
urls.py中包含api.urls:
# src/urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('api/v1/', include('api.urls'))
]
- 在
api/urls.py中定义 API 路由:
# api/urls.py
from django.urls import path
from api.views import UserView, TokenView, CodeExplainViewurlpatterns = [path('users/', UserView.as_view(), name='users'),path('tokens/', TokenView.as_view(), name='tokens'),path('code-explain/', CodeExplainView.as_view(), name='code-explain')
]
- 在
api/views.py中实现视图逻辑:
# api/views.py
from rest_framework import views, status
from rest_framework.response import Response
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import AllowAny
from api.serializers import CodeExplainSerializer, UserSerializer, TokenSerializer
from api.models import CodeExplainerclass CodeExplainView(views.APIView):serializer_class = CodeExplainSerializerauthentication_classes = [TokenAuthentication]def get(self, request, format=None):qs = CodeExplainer.objects.all()serializer = self.serializer_class(qs, many=True)return Response(serializer.data)def post(self, request, format=None):serializer = self.serializer_class(data=request.data)if serializer.is_valid():serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)# 用户和 token 视图 (稍后定义)
class UserView(views.APIView):serializer_class = UserSerializerpermission_classes = [AllowAny]class TokenView(ObtainAuthToken):serializer_class = TokenSerializer
步骤 9:实现序列化器
在 api/serializers.py 中编写模型序列化器:
# api/serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
from api.models import CodeExplainer
from api.utils import send_code_to_apiclass CodeExplainSerializer(serializers.ModelSerializer):class Meta:model = CodeExplainerfields = ("id", "_input", "_output")extra_kwargs = {"_output": {"read_only": True}}def create(self, validated_data):code_explainer = CodeExplainer(**validated_data)_output = send_code_to_api(validated_data["_input"])code_explainer._output = _outputcode_explainer.save()return code_explainerclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ("id", "username", "email", "password")extra_kwargs = {"password": {"write_only": True}}def create(self, validated_data):password = validated_data.pop("password")user = User.objects.create(**validated_data)user.set_password(password)user.save()Token.objects.create(user=user)return userclass TokenSerializer(serializers.Serializer):username = serializers.CharField()password = serializers.CharField(style={"input_type": "password"}, trim_whitespace=False)def validate(self, attrs):username = attrs.get("username")password = attrs.get("password")user = authenticate(request=self.context.get("request"), username=username, password=password)if not user:msg = "Credentials are not provided correctly..."raise serializers.ValidationError(msg, code="authentication")attrs["user"] = userreturn attrs
相关文章:
【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API
Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API 本文档将介绍如何使用 Django 和 Django REST Framework 构建一个 AI 聊天机器人项目,并结合 OpenAI 的 GPT 模型提供代码解释服务。步骤包括创建 Django 项目、配置 API、与 OpenAI 集成&am…...
System.out源码解读——err 和 out 一起用导致的顺序异常Bug
前言 笔者在写一个小 Demo 的过程中,发现了一个奇怪的问题。问题如下: // 当 flagtrue 时打印 a1 ;当 flagfalse 时打印 a2。 public static void main(String[] args) {boolean flag false;for (int i 0; i < 10; i) {if (flag) {Sys…...
汽车软件开发之敏捷开发
一、前言 目前汽车电子产品,特别是汽车几大域控(如:智能座舱、智能驾驶、智能网联、车身控制)市场竞争激烈,消费者对汽车的需求逐渐多元化和个性化,用户对座舱和智驾产品的要求也越来越高。他们不仅要求产…...
ListBox显示最新数据、左移和右移操作
1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…...
mysql实用系列:日期格式化
在MySQL中,你可以使用DATE_FORMAT()函数来格式化日期。DATE_FORMAT() 函数通常用于格式化 DATETIME 或 TIMESTAMP类型的字段。这个函数允许你按照指定的格式来显示日期和时间。下面是一些常见的日期格式化的例子: 显示年-月-日: SELECT DATE_…...
时钟频率、AI采样率与AO更新率的关系
在数据采集和信号生成设备(如NI板卡)中,时钟频率、AI(模拟输入)采样率、以及AO(模拟输出)更新率是三个至关重要的参数。它们共同决定了设备在信号采集与生成时的性能表现。本文将详细分析它们之…...
代理IP设置后IP不变?可能的原因及解决方法
在使用代理IP时,有时会遇到代理设置后IP地址却没有变化的情况。这种问题可能会让人感到困惑,但其实背后有多种原因。本文将详细探讨这些原因,并提供相应的解决方法,帮助你顺利解决问题。 可能的原因 代理IP设置后IP地址不变的原…...
瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商
本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法,本次使用了触觉智能的EVB3588开发板演示,搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计,为工业场景设计研发的模块化产品,10年以上稳定供货,帮助…...
Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求
在军事国防领域,全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo,近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…...
python 识别省市、区县并组建三级信息数据库
一、网址: 全国行政区划信息查询平台 二、分析并搭建框架 检查网页源码: 检查网页源码可以发现: 所有省级信息全部在javaScript下的json中,会在页面加载时加载json数据,填充到页面的option中。 1、第一步:…...
家用小型超声波清洗机怎么选?四大人气爆款品牌不可错过!
在现代社会快节奏的步伐中,保持高度的个人及家居卫生标准成为了日常生活的重要组成部分,对于追求高端生活品质的人群而言,这一点尤为重要。因此,选取一款集高效与便利于一体的超声波清洗机,无疑是升级日常清洁体验的理…...
NVIDIA最新AI论文介绍NEST:一种用于语音处理的快速高效自监督模型
语音处理专注于开发能够分析、解释和生成人类语音的系统。这些技术涵盖了多种应用,例如自动语音识别(ASR)、说话人验证、语音转文本翻译以及说话人分离。随着对虚拟助手、转录服务和多语言交流工具的依赖不断增加,高效准确的语音处…...
聊聊对别人表示真正的关注
在工作和生活中,那些重要人士所得到的关注已经很多了,所以你不能只关注那些重要的人,对那些保洁门卫、前台等也需要我们给予真心的关注。 他们可使你的生活正常有序,但却经常被你忽略,见面打个招呼时常跟他们聊一聊,这…...
大数据-133 - ClickHouse 基础概述 全面了解
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
第1步win10宿主机与虚拟机通过NAT共享上网互通
VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信,原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址,实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置,…...
Python学习——【2.3】for循环
文章目录 【2.3】for循环一、for循环基础语法(一)基础语法※、练习 (二)range语句※、练习 (三)变量作用域 二、for循环嵌套使用※、练习 【2.3】for循环 一、for循环基础语法 (一)…...
Element UI:初步探索 Vue.js 的高效 UI 框架
Element UI:初步探索 Vue.js 的高效 UI 框架 一 . ElementUI 基本使用1.1 Element 介绍1.2 Element 快速入门1.3 基础布局1.4 容器布局1.5 表单组件1.6 表格组件1.6.1 基础表格1.6.2 带斑马纹表格1.6.3 带边框表格1.6.4 带状态的表格 1.7 导航栏组件讲解 二 . 学生列…...
React Native防止重复点击
项目中遇到了点击按钮重复提交的问题,防止重复点击首先是想到的是给点击事件一个定时,下次触发的条件是要距离上一次点击的时间大于N秒的之后才能再执行。 // 防重复点击函数 export const preventRepeatPress {lastPressTi1me: 0, // 上次点击时间…...
如何将Git本地代码推送到Gitee云端仓库
如何将Git本地代码推送到Gitee云端仓库 在使用Git进行版本控制时,将本地代码推送到远程仓库是一个基本且重要的操作。本文将详细介绍如何将你的Git本地代码推送到Gitee(码云)云端仓库。Gitee是一个国内非常流行的代码托管平台,类…...
架构师论文备考-论云原生架构及其应用
摘要 2022年3月,我有幸参与了公司的新智慧公交系统的研发工作。该系统基于B/S架构设计,并以多租户SaaS平台化为发展目标,旨在创建一个功能更全面、性能更卓越、稳定性更强、用户体验更佳的公交调度一体化平台。在这一项目中,我主要…...
Polars 2.0清洗性能天花板在哪?实测对比Dask/Modin/Vaex:单机1TB数据清洗仅需11.3秒(附完整安装脚本)
第一章:Polars 2.0 大规模数据清洗技巧Polars 2.0 引入了更严格的惰性执行模型、增强的字符串与时间处理能力,以及原生支持多线程 I/O 的 LazyFrame API,显著提升了 TB 级数据清洗的吞吐与可控性。相比 Pandas,其列式内存布局与零…...
解锁3大智能功能:League-Toolkit让普通玩家也能玩转专业级游戏分析
解锁3大智能功能:League-Toolkit让普通玩家也能玩转专业级游戏分析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的召…...
数据仓库核心概念:事实表和维度表详解与实战应用
数据仓库核心概念:事实表和维度表详解与实战应用一、引言二、定义:什么是事实表?什么是维度表?2.1 事实表:定义2.2 维度表:定义三、结构流程图:事实表与维度表关联关系3.1 标准星型模型关联流程…...
llama-index 数据清洗示例、数据清洗等
文章目录示例数据清洗常见的需要清洗的数据数据清洗知识llama的一小块功能,主文章内容太多了,拆出来单独说下。示例 环境还基于之前的环境。 1、新建python文件clean_demo.py,代码: import os from llama_index.core import Do…...
用51单片机定时器做一个多功能秒表:代码详解如何整合数码管、按键与中断
51单片机多功能秒表开发实战:从模块整合到系统思维进阶 在嵌入式开发领域,能够独立完成一个功能完整的综合项目,往往是区分初学者与进阶开发者的关键分水岭。今天,我们将以51单片机为核心,打造一个具有启动/暂停、清零…...
工程伦理案例分析:从经典失败项目看责任分配与风险预防
工程伦理案例分析:从经典失败项目看责任分配与风险预防 当一座桥梁在通车典礼上轰然倒塌,当一栋新建大楼在台风中支离破碎,这些触目惊心的工程事故背后,往往隐藏着复杂的伦理困境。工程伦理不是简单的对错判断题,而是需…...
uboot移植实战:DDR初始化参数优化与调试指南
1. 理解DDR初始化在uboot移植中的重要性 第一次接触uboot移植时,我完全不明白为什么DDR初始化这么麻烦。直到有一次,我把开发板直接烧成砖头,才真正意识到这个环节有多关键。简单来说,DDR初始化就像是给电脑装内存条,但…...
探秘书匠策AI:毕业论文写作的“智慧引擎”
在学术探索的征途中,毕业论文如同一座巍峨的山峰,让无数学生既敬畏又向往。它不仅是对所学知识的综合检验,更是学术生涯的重要里程碑。然而,面对这座大山,许多人常常感到力不从心,选题迷茫、文献难觅、结构…...
AI集成开发工程师的技术实践与转型之路
第一章:技术架构演进与AI融合趋势 1.1 传统开发范式的演进 现代软件开发正经历从单一业务系统向智能化业务系统的转型。传统的.NET技术栈作为企业级应用开发的基石,其技术架构也在不断演进: // 典型的三层架构示例 public class BusinessLogic {private readonly IDataAc…...
GLM-4v-9b效果展示:直播带货截图→话术分析+转化点提炼
GLM-4v-9b效果展示:直播带货截图→话术分析转化点提炼 1. 模型能力概览 GLM-4v-9b是智谱AI在2024年开源的多模态视觉-语言模型,拥有90亿参数。这个模型最大的特点是能够同时理解图片和文字,支持中英文多轮对话,在11201120高分辨…...
