前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Python全栈100天学习笔记】Day44 Web表单介绍及使用

【Python全栈100天学习笔记】Day44 Web表单介绍及使用

作者头像
天道Vax的时间宝藏
发布于 2022-04-02 05:00:23
发布于 2022-04-02 05:00:23
87900
代码可运行
举报
运行总次数:0
代码可运行

表单的应用

我们继续来完成上一章节中的项目,实现“用户注册”和“用户登录”的功能,并限制只有登录的用户才能为老师投票。Django框架中提供了对表单的封装,而且提供了多种不同的使用方式。

首先添加用户模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class User(models.Model):
    """用户"""
    no = models.AutoField(primary_key=True, verbose_name='编号')
    username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
    password = models.CharField(max_length=32, verbose_name='密码')
    regdate = models.DateTimeField(auto_now_add=True, verbose_name='注册时间')

    class Meta:
        db_table = 'tb_user'
        verbose_name_plural = '用户'

通过生成迁移和执行迁移操作,在数据库中创建对应的用户表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(venv)$ python manage.py makemigrations vote
...
(venv)$ python manage.py migrate
...

定制一个非常简单的注册模板页面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
    <style>/* 此处省略层叠样式表选择器 */</style>
</head>
<body>
    <h1>用户注册</h1>
    <hr>
    <p class="hint">{{ hint }}</p>
    <form action="/register/" method="post">
        {% csrf_token %}
        <div class="input">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username">
        </div>
        <div class="input">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password">
        </div>
        <div class="input">
            <label for="repassword">确认密码:</label>
            <input type="password" id="repassword" name="repassword">
        </div>
        <div class="input">
            <input type="submit" value="注册">
            <input type="reset" value="重置">
        </div>
    </form>
    <a href="/login">返回登录</a>
</body>
</html>

注意,在上面的表单中,我们使用了模板指令{% csrf_token %}为表单添加一个隐藏域(type属性值为hidden的input标签),它的作用是在表单中生成一个随机令牌(token)来防范跨站请求伪造(通常简称为CSRF),这也是Django在提交表单时的硬性要求,除非我们设置了免除CSRF令牌。下图是一个关于CSRF简单生动的例子,它来自于维基百科

用户在提交注册表单时,我们还需要对用户的输入进行验证,例如我们的网站要求用户名必须由字母、数字、下划线构成且长度在4-20个字符之间,密码的长度为8-20个字符,确认密码必须跟密码保持一致。这些验证操作首先可以通过浏览器中的JavaScript代码来完成,但是即便如此,在服务器端仍然要对用户输入再次进行验证来避免将无效的数据库交给数据库,因为用户可能会禁用浏览器的JavaScript功能,也有可能绕过浏览器的输入检查将注册数据提交给服务器,所以服务器端的用户输入检查仍然是必要的。

我们可以利用Django框架封装的表单功能来对用户输入的有效性进行检查,虽然Django封装的表单还能帮助我们定制出页面上的表单元素,但这显然是一种灵活性很差的设计,这样的功能在实际开发中基本不考虑,所以表单主要的作用就在于数据验证,具体的做法如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USERNAME_PATTERN = re.compile(r'\w{4,20}')

class RegisterForm(forms.ModelForm):
    repassword = forms.CharField(min_length=8, max_length=20)
    
    def clean_username(self):
        username = self.cleaned_data['username']
        if not USERNAME_PATTERN.fullmatch(username):
            raise ValidationError('用户名由字母、数字和下划线构成且长度为4-20个字符')
        return username
        
    def clean_password(self):
        password = self.cleaned_data['password']
        if len(password) < 8 or len(password) > 20:
            raise ValidationError('无效的密码,密码长度为8-20个字符')
        return to_md5_hex(self.cleaned_data['password'])

    def clean_repassword(self):
        repassword = to_md5_hex(self.cleaned_data['repassword'])
        if repassword != self.cleaned_data['password']:
            raise ValidationError('密码和确认密码不一致')
        return repassword

    class Meta:
        model = User
        exclude = ('no', 'regdate')

上面,我们定义了一个与User模型绑定的表单(继承自ModelForm),我们排除了用户编号(no)和注册日期(regdate)这两个属性,并添加了一个repassword属性用来接收从用户表单传给服务器的确认密码。我们在定义User模型时已经对用户名的最大长度进行了限制,上面我们又对确认密码的最小和最大长度进行了限制,但是这些都不足以完成我们对用户输入的验证。上面以clean_打头的方法就是我们自定义的验证规则。很明显,clean_username是对用户名的检查,而clean_password是对密码的检查。由于数据库二维表中不应该保存密码的原文,所以对密码做了一个简单的MD5摘要处理,实际开发中如果只做出这样的处理还不太够,因为即便使用了摘要,仍然有利用彩虹表反向查询破解用户密码的风险,如何做得更好我们会在后续的内容中讲到。为字符串生成MD5摘要的代码如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def to_md5_hex(message):
    return hashlib.md5(message.encode()).hexdigest()

新增一个视图函数实现用户注册的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def register(request):
    page, hint = 'register.html', ''
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            page = 'login.html'
            hint = '注册成功,请登录'
        else:
            hint = '请输入有效的注册信息'
    return render(request, page, {'hint': hint})

如果用户发起GET请求,将直接跳转到注册的页面;如果用户以POST方式提交注册表单,则创建自定义的注册表单对象并获取用户输入。可以通过表单对象的is_valid方法对表单进行验证,如果用户输入没有问题,该方法返回True,否则返回False;由于我们定义的RegisterForm继承自ModelForm,因此也可以直接使用表单对象的save方法来保存模型。下面是注册请求的URL配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path

from vote import views

urlpatterns = [
	# 此处省略上面的代码
    path('register/', views.register, name='register'),
    # 此处省略下面的代码
]

说明:path函数可以通过name参数给URL绑定一个逆向解析的名字,也就是说,如果需要可以从后面给的名字逆向解析出对应的URL。

我们再来定制一个非常简单的登录页。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <style>/* 此处省略层叠样式表选择器 */</style>
</head>
<body>
    <h1>用户登录</h1>
    <hr>
    <p class="hint">{{ hint }}</p>
    <form action="/login/" method="post">
        {% csrf_token %}
        <div class="input">
            <label for="username">用户名:</label>
            <input type="text" id="username" name="username">
        </div>
        <div class="input">
            <label for="password">密码:</label>
            <input type="password" id="password" name="password">
        </div>
        <div class="input captcha">
            <label for="captcha">验证码:</label>
            <input type="text" id="captcha" name="captcha">
            <img src="/captcha/" width="120">
        </div>
        <div class="input">
            <input type="submit" value="登录">
            <input type="reset" value="重置">
        </div>
    </form>
    <a href="/register">注册新用户</a>
</body>
</html>

上面的登录页中,我们要求用户提供验证码,验证码全称是全自动区分计算机和人类的公开图灵测试,它是一种用来区分系统的使用者是计算机还是人类的程序。简单的说就是程序出一个只有人类能够回答的问题,由系统使用者来解答,由于计算机理论上无法解答程序提出的问题,所以回答出问题的用户就可以被认为是人类。大多数的网站都使用了不同类型的验证码技术来防范用程序自动注册用户或模拟用户登录(暴力破解用户密码),因为验证码具有一次消费性,而没有通过图灵测试的程序是不能够完成注册或登录的。

Python程序中生成验证码并不算特别复杂,但需要三方库Pillow的支持(PIL的分支),因为要对验证码图片进行旋转、扭曲、拉伸以及加入干扰信息来防范那些用OCR(光学文字识别)破解验证码的程序。下面的代码封装了生成验证码图片的功能,大家可以直接用这些代码来生成图片验证码,不要“重复发明轮子”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
图片验证码
"""
import os
import random

from io import BytesIO

from PIL import Image
from PIL import ImageFilter
from PIL.ImageDraw import Draw
from PIL.ImageFont import truetype


class Bezier(object):
    """贝塞尔曲线"""

    def __init__(self):
        self.tsequence = tuple([t / 20.0 for t in range(21)])
        self.beziers = {}

    def make_bezier(self, n):
        """绘制贝塞尔曲线"""
        try:
            return self.beziers[n]
        except KeyError:
            combinations = pascal_row(n - 1)
            result = []
            for t in self.tsequence:
                tpowers = (t ** i for i in range(n))
                upowers = ((1 - t) ** i for i in range(n - 1, -1, -1))
                coefs = [c * a * b for c, a, b in zip(combinations,
                                                      tpowers, upowers)]
                result.append(coefs)
            self.beziers[n] = result
            return result


class Captcha(object):
    """验证码"""

    def __init__(self, width, height, fonts=None, color=None):
        self._image = None
        self._fonts = fonts if fonts else \
            [os.path.join(os.path.dirname(__file__), 'fonts', font)
             for font in ['ArialRB.ttf', 'ArialNI.ttf', 'Georgia.ttf', 'Kongxin.ttf']]
        self._color = color if color else random_color(0, 200, random.randint(220, 255))
        self._width, self._height = width, height

    @classmethod
    def instance(cls, width=200, height=75):
        prop_name = f'_instance_{width}_{height}'
        if not hasattr(cls, prop_name):
            setattr(cls, prop_name, cls(width, height))
        return getattr(cls, prop_name)

    def background(self):
        """绘制背景"""
        Draw(self._image).rectangle([(0, 0), self._image.size],
                                    fill=random_color(230, 255))

    def smooth(self):
        """平滑图像"""
        return self._image.filter(ImageFilter.SMOOTH)

    def curve(self, width=4, number=6, color=None):
        """绘制曲线"""
        dx, height = self._image.size
        dx /= number
        path = [(dx * i, random.randint(0, height))
                for i in range(1, number)]
        bcoefs = Bezier().make_bezier(number - 1)
        points = []
        for coefs in bcoefs:
            points.append(tuple(sum([coef * p for coef, p in zip(coefs, ps)])
                                for ps in zip(*path)))
        Draw(self._image).line(points, fill=color if color else self._color, width=width)

    def noise(self, number=50, level=2, color=None):
        """绘制扰码"""
        width, height = self._image.size
        dx, dy = width / 10, height / 10
        width, height = width - dx, height - dy
        draw = Draw(self._image)
        for i in range(number):
            x = int(random.uniform(dx, width))
            y = int(random.uniform(dy, height))
            draw.line(((x, y), (x + level, y)),
                      fill=color if color else self._color, width=level)

    def text(self, captcha_text, fonts, font_sizes=None, drawings=None, squeeze_factor=0.75, color=None):
        """绘制文本"""
        color = color if color else self._color
        fonts = tuple([truetype(name, size)
                       for name in fonts
                       for size in font_sizes or (65, 70, 75)])
        draw = Draw(self._image)
        char_images = []
        for c in captcha_text:
            font = random.choice(fonts)
            c_width, c_height = draw.textsize(c, font=font)
            char_image = Image.new('RGB', (c_width, c_height), (0, 0, 0))
            char_draw = Draw(char_image)
            char_draw.text((0, 0), c, font=font, fill=color)
            char_image = char_image.crop(char_image.getbbox())
            for drawing in drawings:
                d = getattr(self, drawing)
                char_image = d(char_image)
            char_images.append(char_image)
        width, height = self._image.size
        offset = int((width - sum(int(i.size[0] * squeeze_factor)
                                  for i in char_images[:-1]) -
                      char_images[-1].size[0]) / 2)
        for char_image in char_images:
            c_width, c_height = char_image.size
            mask = char_image.convert('L').point(lambda i: i * 1.97)
            self._image.paste(char_image,
                        (offset, int((height - c_height) / 2)),
                        mask)
            offset += int(c_width * squeeze_factor)

    @staticmethod
    def warp(image, dx_factor=0.3, dy_factor=0.3):
        """图像扭曲"""
        width, height = image.size
        dx = width * dx_factor
        dy = height * dy_factor
        x1 = int(random.uniform(-dx, dx))
        y1 = int(random.uniform(-dy, dy))
        x2 = int(random.uniform(-dx, dx))
        y2 = int(random.uniform(-dy, dy))
        warp_image = Image.new(
            'RGB',
            (width + abs(x1) + abs(x2), height + abs(y1) + abs(y2)))
        warp_image.paste(image, (abs(x1), abs(y1)))
        width2, height2 = warp_image.size
        return warp_image.transform(
            (width, height),
            Image.QUAD,
            (x1, y1, -x1, height2 - y2, width2 + x2, height2 + y2, width2 - x2, -y1))

    @staticmethod
    def offset(image, dx_factor=0.1, dy_factor=0.2):
        """图像偏移"""
        width, height = image.size
        dx = int(random.random() * width * dx_factor)
        dy = int(random.random() * height * dy_factor)
        offset_image = Image.new('RGB', (width + dx, height + dy))
        offset_image.paste(image, (dx, dy))
        return offset_image

    @staticmethod
    def rotate(image, angle=25):
        """图像旋转"""
        return image.rotate(random.uniform(-angle, angle),
                            Image.BILINEAR, expand=1)

    def generate(self, captcha_text='', fmt='PNG'):
        """生成验证码(文字和图片)"""
        self._image = Image.new('RGB', (self._width, self._height), (255, 255, 255))
        self.background()
        self.text(captcha_text, self._fonts,
                  drawings=['warp', 'rotate', 'offset'])
        self.curve()
        self.noise()
        self.smooth()
        image_bytes = BytesIO()
        self._image.save(image_bytes, format=fmt)
        return image_bytes.getvalue()


def pascal_row(n=0):
    """生成Pascal三角第n行"""
    result = [1]
    x, numerator = 1, n
    for denominator in range(1, n // 2 + 1):
        x *= numerator
        x /= denominator
        result.append(x)
        numerator -= 1
    if n & 1 == 0:
        result.extend(reversed(result[:-1]))
    else:
        result.extend(reversed(result))
    return result


def random_color(start=0, end=255, opacity=255):
    """获得随机颜色"""
    red = random.randint(start, end)
    green = random.randint(start, end)
    blue = random.randint(start, end)
    if opacity is None:
        return red, green, blue
    return red, green, blue, opacity

说明:上面的代码在生成验证码图片时用到了三种字体文件,使用上面的代码时需要添加字体文件到应用目录下的fonts目录中。

下面的视图函数用来生成验证码并通过HttpResponse对象输出到用户浏览器中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ALL_CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'


def get_captcha_text(length=4):
    selected_chars = random.choices(ALL_CHARS, k=length)
    return ''.join(selected_chars)


def get_captcha(request):
    """获得验证码"""
    captcha_text = get_captcha_text()
    image = Captcha.instance().generate(captcha_text)
    return HttpResponse(image, content_type='image/png')

生成的验证码如下图所示。

为了验证用户提交的登录表单,我们再定义个表单类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class LoginForm(forms.Form):
    username = forms.CharField(min_length=4, max_length=20)
    password = forms.CharField(min_length=8, max_length=20)
    captcha = forms.CharField(min_length=4, max_length=4)

    def clean_username(self):
        username = self.cleaned_data['username']
        if not USERNAME_PATTERN.fullmatch(username):
            raise ValidationError('无效的用户名')
        return username

    def clean_password(self):
        return to_md5_hex(self.cleaned_data['password'])

跟之前我们定义的注册表单类略有区别,登录表单类直接继承自Form没有跟模型绑定,定义了三个字段分别对应登录表单中的用户名、密码和验证码。接下来是处理用户登录的视图函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def login(request):
    hint = ''
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = User.objects.filter(username=username, password=password).first()
            if user:
                return redirect('/')
            else:
                hint = '用户名或密码错误'
        else:
            hint = '请输入有效的登录信息'
    return render(request, 'login.html', {'hint': hint})

映射URL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path

from vote import views

urlpatterns = [
	# 此处省略上面的代码
    path('login/', views.login, name='login'),
    # 此处省略下面的代码
]

需要指出,上面我们设定用户登录成功时直接返回首页,而且在用户登录时并没有验证用户输入的验证码是否正确,这些我们留到下一个单元再为大家讲解。另外,如果要在Django自带的管理后台中进行表单验证,可以在admin.py的模型管理类中指定form属性为自定义的表单即可,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class UserForm(forms.ModelForm):
    password = forms.CharField(min_length=8, max_length=20,
                               widget=forms.PasswordInput, label='密码')

    def clean_username(self):
        username = self.cleaned_data['username']
        if not USERNAME_PATTERN.fullmatch(username):
            raise ValidationError('用户名由字母、数字和下划线构成且长度为4-20个字符')
        return username
        
    def clean_password(self):
        password = self.cleaned_data['password']
        return to_md5_hex(self.cleaned_data['password'])

    class Meta:
        model = User
        exclude = ('no', )


class UserAdmin(admin.ModelAdmin):
    list_display = ('no', 'username', 'password', 'email', 'tel')
    ordering = ('no', )
    form = UserForm
    list_per_page = 10


admin.site.register(User, UserAdmin)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
人工智能论文解读(三)
下面带领大家了解一下人工智能大模型方面的论文,为给大家普及大模型知识,特意读了几篇论文,从论文中提取出来分享给大家。
摆烂小白敲代码
2025/01/26
940
长文梳理!近年来GPT系列模型的发展历史:从GPT-1到GPT-4o(前世、今生)
随着ChatGPT的发布,大语言模型的关注度和数量都在不断上升,它引领了人类进入了大模型时代,并且随着一轮一轮的迭代,最新模型已经进化到了GPT-4o。在众多大语言模型中,GPT系列因其代表性而备受关注,其发展历程和技术革新值得深入探讨。那么今天带大家回顾一下近年来GPT系列模型的发展。【参考中国人民大学《大语言模型》】
ShuYini
2024/06/19
3.2K0
长文梳理!近年来GPT系列模型的发展历史:从GPT-1到GPT-4o(前世、今生)
【人工智能】推理大模型与预训练大模型:架构差异与认知范式的技术解构
在大模型领域中预训练大模型与推理优化大模型代表着两种截然不同的认知范式。本文将从预训练大模型和推理大模型的发展之路开始,从表征学习、计算图优化、任务泛化三个维度展开技术剖析,说明二者在模型动力学层面的本质差异。
云帆沧海
2025/04/23
1440
ChatGPT与DeepSeek:AI语言模型的巅峰对决
在当今人工智能飞速发展的时代,ChatGPT 和 DeepSeek 作为两款备受瞩目的 AI 语言模型,各自展现出了独特的魅力与实力。ChatGPT 凭借 OpenAI 的强大技术支撑和广泛的应用场景,自问世以来便成为了 AI 领域的焦点,引领着语言模型发展的潮流。而 DeepSeek 作为新兴的国产 AI 语言模型,以其创新的技术路线和对本土市场的深刻理解,迅速在全球范围内崭露头角,吸引了大量用户和开发者的关注。
用户11396661
2025/03/02
6230
ChatGPT:人工智能语言模型的革命性进步
本文深入探讨了ChatGPT作为人工智能语言模型的革命性进步。从GPT-1到GPT-3.5的历史演进,每一代模型都在模型规模和性能方面有了巨大的提升。特别关注ChatGPT,我们详细介绍了它是如何从GPT-3.5演变而来的,并探讨了它在语言生成方面相较于之前版本的改进和创新。本文还解释了ChatGPT的工作原理,包括预训练和微调阶段,以及模型在推理时生成响应的过程。讨论了ChatGPT的优势,如其出色的语言生成能力和适应性,同时也指出了可能面临的局限性。此外,还探讨了ChatGPT在各个领域的实际应用,以及它对传统业务流程改变和问题解决方面的潜力。最后,展望了ChatGPT与人类交互的未来,强调了技术发展与伦理考量的重要性。
猫头虎
2024/04/08
2270
ChatGPT:人工智能语言模型的革命性进步
大语言模型与ChatGPT:深入探索与应用
随着人工智能技术的飞速发展,大语言模型(Large Language Models, LLMs)成为了一个备受关注的研究领域。这些模型通过处理海量的数据来理解和生成自然语言文本,展现出令人惊叹的表现力。ChatGPT是其中的佼佼者,它基于GPT-3和GPT-4模型,能够与人类进行自然流畅的对话,为用户提供丰富的信息和帮助。
用户11286421
2024/10/16
1460
预训练模型与强推理模型:人工智能时代的认知革命
人工智能技术的演进史,本质上是人类对智能本质的探索史。在深度学习浪潮席卷全球的十年间,两条技术路线逐渐显现出清晰的轮廓:以海量数据为燃料的预训练模型,与以逻辑推理为根基的强推理模型。前者通过自监督学习构建出强大的模式识别能力,后者则致力于将人类思维中的因果链和形式化规则编码为可计算的算法。二者的协同与博弈,不仅重塑了人工智能的技术版图,更在医疗诊断、科学发现、工业决策等领域催生出颠覆性应用。当GPT-4展示出惊人的上下文理解,能力AlphaGeometry在几何证明中超越人类金牌选手时,正我们见证着这两种技术范式从分立走向融合的历史性时刻。
用户7353950
2025/02/25
1990
预训练模型与强推理模型:人工智能时代的认知革命
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
实际上关于开源or闭源,一直以来都是颇有争议的话题,人们争执于数据的隐私性和共享性,到底哪一方能获得的收益更大。而对于开源与闭源哪个更好实际上也就是说是隐私更好还是公开更好。
Skrrapper
2024/06/18
3020
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
生成式人工智能(AIGC)研究综述: 从Google Gemini到OpenAI Q*
本综述探讨了生成人工智能(AIGC)领域的发展趋势,重点关注了Mixture of Experts(MoE)、多模态学习和人工智能通用性(AGI)在生成AI中的应用。文章分析了Google Gemini和OpenAI Q*等最新技术对AI研究的影响,并讨论了这些技术在医疗、金融和教育等领域的应用潜力。同时,文章指出了当前AI研究面临的挑战,如学术偏见、预印稿的普及对同行评审过程的影响等。
算法进阶
2023/12/27
13.9K1
生成式人工智能(AIGC)研究综述: 从Google Gemini到OpenAI Q*
《从0到神谕:GPT系列的进化狂想曲——用AI之眼见证人类语言的终极形态》
GPT(Generative Pre-trained Transformer)是由OpenAI开发的一系列大型语言模型,它的核心目标是让计算机理解和生成自然语言(如中文、英文等)。GPT就像一个“超级学习者”,通过阅读海量文本(比如互联网上的书籍、文章、对话等)来“学习”语言的规则和模式,最终能够完成写故事、写代码、回答问题甚至创作诗歌等任务。
Lethehong
2025/04/04
1020
《从0到神谕:GPT系列的进化狂想曲——用AI之眼见证人类语言的终极形态》
人工智能大模型的发展历程与未来展望
引言 随着人工智能技术的飞速发展,大模型已经成为推动这一领域进步的关键力量。它们不仅改变了我们对于机器学习的理解,还深刻地影响着我们的日常生活。本文旨在回顾AI大模型的发展历史,分析其对社会的影响,并探讨未来的可能性。 早期探索与基础 计算机科学自20世纪中叶以来一直是人类科技探索的核心领域。1956年的达特茅斯会议标志着人工智能作为一门学科正式成立,该会议汇集了包括约翰·麦卡锡、马文·明斯基在内的多位先驱者。他们提出了许多至今仍然影响深远的思想,比如符号主义和连接主义。 早期的人工智能研究主要集中在专家系统和规则基础上,直到1958年弗兰克·罗森布拉特发明了感知器(Perceptron),这是第一个能够通过学习调整权重来分类数据的算法模型。尽管后来发现感知器存在一些限制,但它为后续的神经网络研究奠定了基础。 深度学习的兴起 进入21世纪初,随着计算硬件性能的提升,特别是图形处理器(GPU)的应用,研究人员开始尝试构建更深层的神经网络。2006年,杰弗里·辛顿(Geoffrey Hinton)提出了一种新的训练深层神经网络的方法——逐层预训练,这标志着深度学习时代的到来。 2012年,ImageNet大规模视觉识别挑战赛(ILSVRC)上,由亚历山大·克里泽夫斯基(Alex Krizhevsky)等人开发的AlexNet模型一举夺魁,展示了深度卷积神经网络在图像识别上的强大能力。自此以后,VGG、ResNet等一系列先进的网络架构相继问世,推动了深度学习技术在各个领域的广泛应用。
用户7353950
2024/11/23
4460
人工智能大模型的发展历程与未来展望
梳理:人工智能模型的下一步路在哪里?
近年来,AI 模型的规模呈指数级增长。从 GPT-3 的 1750 亿参数到 GPT-4 的更大规模,模型的能力随着参数量的增加而显著提升。然而,模型规模的扩大也带来了计算资源消耗、训练成本高企以及环境负担等问题。未来的 AI 模型可能会在规模与效率之间寻找平衡,探索更高效的架构和训练方法。
算力之光
2025/02/21
1180
梳理:人工智能模型的下一步路在哪里?
生成式人工智能:发展演进及产业机遇
当OpenAI 在 2022 年 11 月 30 日发布 ChatGPT 的时候,没有人会意识到,新一代人工智能浪潮将在接下来的 6 个月给人类社会带来一场眩晕式的变革。自2010年代初深度学习问世以来,人工智能进入到第三次高潮。而2017年Transformer算法将深度学习推向了大模型时代。OpenAI基于Transformer的Decoder部分建立起来了GPT家族。
小腾资讯君
2023/08/25
8911
生成式人工智能:发展演进及产业机遇
AI进化革命:从工具到伙伴的边界突破
人工智能(Artificial Intelligence, AI)正以前所未有的速度改变着我们的生活方式、工作方式以及社会结构。从智能手机到自动驾驶汽车,从医疗诊断到金融投资,AI的应用已经渗透到我们生活的方方面面。与此同时,AI的发展也带来了诸多挑战和争议,包括隐私保护、就业问题、算法偏见等。本文将全面探讨人工智能的技术突破、行业应用、面临的挑战以及未来发展趋势。
换一颗红豆
2025/02/23
1920
AI进化革命:从工具到伙伴的边界突破
大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路
2025年初,中国推出了具有开创性且高性价比的「大型语言模型」(Large Language Model — LLM)DeepSeek-R1,引发了AI的巨大变革。本文回顾了LLM的发展历程,起点是2017年革命性的Transformer架构,该架构通过「自注意力机制」(Self-Attention)彻底重塑了自然语言处理。到2018年,BERT和GPT等模型崭露头角,显著提升了上下文理解和文本生成能力。2020年,拥有1750亿参数的GPT-3展示了卓越的「少样本」和「零样本」学习能力。然而,「幻觉」问题 — —即生成内容与事实不符,甚至出现「一本正经地胡说八道」的现象 — — 成为了一个关键挑战。2022年,OpenAI通过开发「对话式」的ChatGPT应对这一问题,采用了「监督微调」(SFT)和「基于人类反馈的强化学习」(RLHF)。到2023年,像GPT-4这样的「多模态模型」整合了文本、图像和音频处理能力,使LLM能够以更接近人类的「听」、「说」、「看」能力。近期推出的OpenAI-o1和DeepSeek-R1「推理模型」(Reasoning Model)在复杂问题解决方面取得突破,赋予LLM更接近人类「系统2思维」的深度推理能力,标志着人工智能在模拟人类思维模式上迈出了重要一步。此外,DeepSeek-R1模型以其「超成本效益」和「开源」设计挑战了AI领域的传统规范,推动了先进LLL的普及,并促进了各行业的创新。
致Great
2025/02/17
7820
大语言模型简史:从Transformer(2017)到DeepSeek-R1(2025)的进化之路
LLM概述与应用展望
首先,LLM 全称是 Large Language Model,即大语言模型,其参数量较大,一般的70 亿以上参数的模型占用约 28G 存储,直观来说就是有一堆28G浮点数(训练得到)作为权重参数的函数可拷入 U 盘就能带走大模型本体。实现方式简单来说就是设计一个极大的非线性函数进行拟合计算,它们会接收你提供的一些文本作为输入,并猜测下一个出现概率最大的词(更准确地说,下一个token)是什么。
LeonAlgo
2025/02/26
1580
LLM概述与应用展望
GPT-4o:人工智能技术的新巅峰
近期,OpenAI 推出了最新的语言模型——GPT-4o,引发了广泛的关注和讨论。本文将从版本对比、技术能力和个人感受三个方面,对这一新技术进行全面评价。
人不走空
2024/05/31
2750
常见大语言模型解析:技术细节、应用与挑战
文章链接:https://cloud.tencent.com/developer/article/2467252
小说男主
2024/11/21
1580
常见大语言模型解析:技术细节、应用与挑战
AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘
DeepSeek是由中国初创公司DeepSeek所开发的一款大型语言模型。该公司成立于2023年,并通过开源的方式快速吸引了开发者和研究者的关注。DeepSeek的首个版本——DeepSeek-R1,自发布以来便在业内引发了广泛讨论。其最大特点之一是能够在逻辑推理、数学推理以及实时问题解决方面展现出独特的优势。
云边有个稻草人
2025/02/13
6580
大模型时代的“Linux”生态,开启人工智能新十年
演讲 | 林咏华  智源人工智能研究院副院长     整理 | 何苗 出品 | CSDN(ID:CSDNnews) 2018 年以来,超大规模预训练模型的出现推动了 AI 科研范式从面向特定应用场景、训练专有模型,转变为大模型+微调+模型服务的AI工业化开发模式。直至对话大模型 ChatGPT 引发全球广泛关注,人们终于欢呼 AI 2.0 时代来了。当我们立足由大模型推动的AIGC元年,AI 正在迎来新的一轮全球应用和研发热。 随着两波AI崛起浪潮接连在寒冬中袭来,人们终于看到了大模型+AIGC 将人工智
AI科技大本营
2023/04/06
6570
大模型时代的“Linux”生态,开启人工智能新十年
推荐阅读
相关推荐
人工智能论文解读(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档