Skip to content

代码自动生成



代码大模型

  • qwen-coder
  • deepseek-coder-v2
  • codegemma
  • codellama
  • codestral
  • starcoder2
  • codegeex4

除了专门的代码大模型之外,普通的大模型也支持对代码的理解与生成。所以我们可以使用任何对代码数据进行过预训练的大模型。


CodeGemma

CodeGemma 是功能强大的轻量级模型的集合, 一些编码任务,例如填充中间代码补全、代码生成、自然语言处理 包括理解能力、数学推理和指导。

\

  • 智能代码补全和生成: 无论您是在本地工作,还是使用 Google Cloud 资源,都可以填写整行、函数,甚至生成整块代码块。
  • 准确性更高 CodeGemma 模型基于 Web 文档、数学和代码中的 5000 亿个词元(主要是英语)数据训练而成,生成的代码不仅语法正确,而且语义上也更有意义,从而减少错误并缩短调试时间。 code
  • 多语言水平 支持 Python、JavaScript、Java、Kotlin、C++、C#、Rust、Go 和其他语言。
  • 简化工作流 将 CodeGemma 模型集成到开发环境中,可以减少编写样板代码的工作量,更快地专注于有趣且与众不同的代码。

code llama

Code Llama,这是一个大型语言模型 (LLM),可以使用文本提示生成代码。Code Llama 是目前最先进的公开可用 LLM,可用于处理代码任务,有望帮助现有开发者加快工作流程、提高效率,并降低编程初学者的入门门槛。Code Llama 有望成为一种生产力和教育工具,帮助程序员编写更健壮、文档更完善的软件。


Qwen Coder

  • 强大:Qwen2.5-Coder-32B-Instruct 成为目前 SOTA 的开源代码模型,代码能力追平 GPT-4o,展现出强大且全面的代码能力,同时具备良好的通用和数学能力。
  • 多样:上个月我们开源了 1.5B、7B 两个尺寸,本次开源又带来 0.5B、3B、14B、32B 四个尺寸,截至目前, Qwen2.5-Coder 已经覆盖了主流的六个模型尺寸,以满足不同开发者的需要。
  • 实用:实现了 Qwen2.5-Coder 在代码助手和 Artifacts 两种场景下的实用性。

open-webui

Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线运行。它支持各种 LLM 运行器(例如 Ollama)和兼容 OpenAI 的 API,并内置 RAG 推理引擎,使其成为强大的 AI 部署解决方案

\

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Qwen Coder


Qwen coder 特性

  • 支持长上下文理解和生成,上下文长度为 128K tokens
  • 支持 92 种编码语言
  • 保留基础模型的数学和通用能力优势

Qwen coder 的性能参数


不同参数量指令微调模型的性能


代码生成

  • 编写冒泡排序
  • 使用 bash 搜索文件
  • 使用 python 绘图
  • 使用 html 绘图

注释生成代码

"""
1. 创建一个电影名称列表
2. 创建这些电影的评分列表
3. 组合他们并创建一个包含10部电影及其评级的json对象
"""

\

import json

# 1. 创建一个电影名称列表
movie_names = [
    "Inception",
    "The Shawshank Redemption",
    "The Godfather",
    "The Dark Knight",
    "Pulp Fiction",
    "Schindler's List",
    "The Lord of the Rings: The Return of the King",
    "Forrest Gump",
    "Star Wars: Episode V - The Empire Strikes Back",
    "The Matrix"
]

# 2. 创建这些电影的评分列表
movie_ratings = [
    8.8,
    9.3,
    9.2,
    9.0,
    8.9,
    8.9,
    9.1,
    8.7,
    8.6,
    8.5
]

# 3. 组合他们并创建一个包含10部电影及其评级的json对象
movies_json = {
    "movies": [
        {"name": movie_names[i], "rating": movie_ratings[i]} for i in range(10)
    ]
}

# 打印JSON对象
print(json.dumps(movies_json, indent=4))

辅助代码分析

# -*- coding: utf-8 -*-
import uuid            # 导入uuid模块,用于生成唯一标识符
import yaml            # 导入yaml模块,用于解析YAML文件
import os              # 导入os模块,用于与操作系统进行交互
import re              # 导入re模块,用于正则表达式操作
import pytest          # 导入pytest模块,用于编写和运行测试
from _pytest import fixtures      # 从_pytest包中导入fixtures模块
from _pytest.fixtures import (    # 从_pytest.fixtures模块中导入FixtureLookupError类
    FixtureLookupError,
)
from _pytest.python import (  # 从_pytest.python模块中导入Metafunc和FunctionDefinition类
    Metafunc,
    FunctionDefinition,
)
from collections import namedtuple  # 从collections模块中导入namedtuple,用于创建命名元组
from pytest_play.config import (  # 从pytest_play.config模块中导入STATSD和PYTEST_STATSD常量
    STATSD,
    PYTEST_STATSD,
)

def pytest_addoption(parser):
    """
    :param parser:
    :return:
    """
    if STATSD is True:  # 如果STATSD为True,则添加与statsd相关的命令行选项
        if not PYTEST_STATSD:  # 如果PYTEST_STATSD未设置,则添加选项到终端报告组
            group = parser.getgroup('terminal reporting')  # 获取终端报告组
            group.addoption(  # 添加--stats-d选项,用于发送测试结果到graphite
                '--stats-d', action='store_true',
                help='send test results to graphite')
            group.addoption(  # 添加--stats-host选项,用于指定statsd主机地址
                '--stats-host', action='store', dest='stats_host',
                metavar='host', default='localhost',
                help='statsd host. default is \'localhost\'')
            group.addoption(  # 添加--stats-port选项,用于指定statsd端口号
                '--stats-port', action='store', dest='stats_port',
                metavar='port', default=8125,
                help='statsd port. default is 8125')
            group.addoption(  # 添加--stats-prefix选项,用于指定所有统计信息的前缀
                '--stats-prefix', action='store', dest='stats_prefix',
                metavar='prefix', default=None,
                help='prefix to give all stats')

def get_marker(node, name):
    try:
        marker = node.get_closest_marker(name)  # 尝试获取节点上最近的标记
    except AttributeError:
        # 向后兼容旧版本的pytest
        marker = node.get_marker(name)  # 使用旧的方法获取标记
    return marker

def pytest_collect_file(parent, path):
    """ 收集test_XXX.yml文件 """
    if path.ext in(".yaml", ".yml") and path.basename.startswith("test_"):  # 检查文件扩展名和名称前缀
        return YAMLFile(path.strpath, parent=parent)  # 返回YAMLFile对象

class YAMLFile(pytest.File):
    def _add_markers(self, yml_item, markers):
        for marker in markers:
            if get_marker(self, marker) is None:  # 如果标记不存在,则添加到配置中
                self.session.config.addinivalue_line(
                    "markers", "{}: {}".format(
                        marker,
                        'dynamic marker'))
            yml_item.add_marker(marker)  # 将标记添加到YAML项

    def collect(self):
        values = []
        test_data = []
        markers = []
        metadata = None
        with open(self.fspath, 'r') as yaml_file:
            documents = list(yaml.safe_load_all(yaml_file))  # 加载所有YAML文档
            len_documents = len(documents)
            assert len_documents <= 2  # 确保文档数量不超过两个
            if len_documents > 1:
                metadata = documents[0]  # 第一个文档作为元数据

        if metadata:
            # 存在pytest-play元数据时,提取标记和测试数据
            markers = [marker for marker in metadata.get(
                'markers', []) if marker]
            test_data = metadata.get('test_data', None)

        def funcobj(): pass  # 定义一个空函数对象
        def pfuncobj(test_data): pass  # 定义一个带参数的空函数对象

        parametrized_funcobj = pytest.mark.parametrize(
            "test_data", test_data)(pfuncobj)  # 使用parametrize装饰器创建参数化函数对象

        if not test_data:
            func = funcobj  # 如果没有测试数据,则使用简单的函数对象
        else:
            func = parametrized_funcobj  # 否则使用参数化函数对象

        res = self._makeitem(self.nodeid, func)  # 创建测试项
        if not isinstance(res, list):
            res = [res]  # 确保结果是一个列表
        values.extend(res)

        if markers:
            for item in values:
                self._add_markers(item, markers)  # 将标记添加到所有测试项

        values.sort(key=lambda item: item.reportinfo()[:2])  # 按照报告信息排序
        return values

    def _makeitem(self, name, obj):
        return self.ihook.pytest_pycollect_makeitem(
            collector=self,
            name=name,
            obj=obj)  # 创建测试项

    def istestfunction(self, obj, name):
        return True  # 声明所有对象都是测试函数

    def _genfunctions(self, name, funcobj):
        fm = self.session._fixturemanager
        cls = None
        definition = FunctionDefinition(
            self.nodeid,
            parent=self,
            callobj=funcobj)  # 创建函数定义对象
        fixtureinfo = fm.getfixtureinfo(definition, funcobj, cls)  # 获取fixture信息
        metafunc = Metafunc(
            definition, fixtureinfo, self.config, cls=cls, module=None)  # 创建Metafunc对象
        self.ihook.pytest_generate_tests(metafunc=metafunc)  # 生成测试

        if not metafunc._calls:
            yield YAMLItem(name, parent=self)  # 如果没有调用,则创建YAMLItem对象
        else:
            # 将funcargs()作为fixturedefs添加到fixtureinfo.arg2fixturedefs
            fixtures.add_funcarg_pseudo_fixture_def(self, metafunc, fm)
            fixtureinfo.prune_dependency_tree()
            for callspec in metafunc._calls:
                subname = "%s[%s]" % (name, callspec.id)  # 创建子名称
                yield YAMLItem(
                    subname,
                    parent=self,
                    callspec=callspec,
                    keywords={callspec.id: True},
                    originalname=name)  # 创建YAMLItem对象

class YAMLItem(pytest.Item):
    def **init**(
            self, name, parent=None, config=None, session=None,
            nodeid=None, callspec=None, keywords=None,
            originalname=None):
        super(YAMLItem, self).__init__(
            name, parent=parent, config=config, session=session,
            nodeid=nodeid)  # 初始化父类
        self.path = getattr(parent.fspath, 'strpath')  # 获取文件路径
        self.play = None
        self.raw_data = None
        self.test_data = {}
        self.keywords = {}
        if callspec is not None:
            self.callspec = callspec
            self.test_data = callspec.params.get('test_data', {})  # 获取测试数据
            for mark in callspec.marks:
                self.keywords[mark.name] = mark  # 添加标记到关键字字典

        if keywords:
            self.keywords.update(keywords)  # 更新关键字字典

        self.originalname = originalname
        # 不使用callobj,待调查
        self.obj = self
        self.funcargs = {}

    def **call**(self):
        pass  # 调用方法

    @property
    def module(self):
        """ 需要与Taurus/bzt/BlazeMeter兼容
            参见 https://bit.ly/2GE2KS4 """
        return namedtuple(
            re.sub(r'\W|^(?=\d)', '_', os.path.basename(self.path)),
            [])  # 创建一个命名元组,表示模块

    def setup(self):
        super(YAMLItem, self).setup()  # 初始化父类
        fixtures.fillfixtures(self)  # 填充fixture
        self._setup_play()  # 设置play对象
        self._setup_raw_data()  # 设置原始数据

    def _setup_play(self):
        pass  # 设置play对象的方法

    def _setup_raw_data(self):
        pass  # 设置原始数据的方法

def pytest_runtest_setup(item):
    if isinstance(item, YAMLItem):  # 如果是YAMLItem类型
        item.setup()  # 调用setup方法

def pytest_runtest_call(item):
    if isinstance(item, YAMLItem):  # 如果是YAMLItem类型
        item.obj()  # 调用测试对象的方法

def pytest_runtest_teardown(item):
    pass  # 测试结束后的清理工作

@pytest.fixture(scope='session')
def play(request):
    return request.config.play  # 返回play对象作为fixture

@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
    config.addinivalue_line(
        "markers", "yaml: mark tests as running from yaml files")  # 添加标记

\

为每一行 python 代码补充注释。使用中文进行注释。


获取英国最近 5 年的 GDP 数据


中间填充代码

  • fim_suffix 前缀 token
  • fim_suffix 后缀 token
  • fim_middle 填充内容引导 token
<|fim_prefix|>import <|fim_suffix|>
if __name == '__main__':
   sys.exit(0)<|fim_middle|>

\

import sys

if __name__ == '__main__':
    sys.exit(0)

快排算法

<|fim_prefix|>def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    <|fim_suffix|>
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)<|fim_middle|>

\

def quicksort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

多文件代码完成

  • repo_name 仓库分割 token
  • file_sep 文件分割 token
input_text = f'''<|repo_name|>{repo_name}
<|file_sep|>{file_path1}
{file_content1}
<|file_sep|>{file_path2}
{file_content2}'''

多文件代码完成示例

<|repo_name|>library-system
<|file_sep|>library.py
class Book:
    def __init__(self, title, author, isbn, copies):
        self.title = title
        self.author = author
        self.isbn = isbn
        self.copies = copies

    def __str__(self):
        return f"Title: {self.title}, Author: {self.author}, ISBN: {self.isbn}, Copies: {self.copies}"

class Library:
    def __init__(self):
        self.books = []

    def add_book(self, title, author, isbn, copies):
        book = Book(title, author, isbn, copies)
        self.books.append(book)

    def find_book(self, isbn):
        for book in self.books:
            if book.isbn == isbn:
                return book
        return None

    def list_books(self):
        return self.books

<|file_sep|>student.py
class Student:
    def __init__(self, name, id):
        self.name = name
        self.id = id
        self.borrowed_books = []

    def borrow_book(self, book, library):
        if book and book.copies > 0:
            self.borrowed_books.append(book)
            book.copies -= 1
            return True
        return False

    def return_book(self, book, library):
        if book in self.borrowed_books:
            self.borrowed_books.remove(book)
            book.copies += 1
            return True
        return False

<|file_sep|>main.py
from library import Library
from student import Student

def main():
    # Set up the library with some books
    library = Library()
    library.add_book("The Great Gatsby", "F. Scott Fitzgerald", "1234567890", 3)
    library.add_book("To Kill a Mockingbird", "Harper Lee", "1234567891", 2)

    # Set up a student
    student = Student("Alice", "S1")

    # Student borrows a book
    book = library.find_book("1234567890")
    if student.borrow_book(book, library):
        print(f"{student.name} borrowed {book.title}")
    else:
        print(f"{student.name} could not borrow {book.title}")

        # Student returns a book
        if student.return_book(book, library):
            print(f"{student.name} returned {book.title}")
        else:
            print(f"{student.name} could not return {book.title}")

        # List all books in the library
        print("All books in the library:")
        for book in library.list_books():
            print(book)

if __name__ == "__main__":
    main()

制品 Artifacts


绘图


编写简单应用

I want a TODO list that allows me to add tasks, delete tasks, and I would like the overall color theme to be purple.


编程智能体

  • Github Copilot
  • Claude Code
  • Cursor
  • Cline

Github Copilot


Claude Code

国内不可用


Cursor


Cline


Cline 自主编码智能体

一个可以使用您的命令行界面 (CLI) 和编辑器的 AI 助手。 得益于 Claude 3.7 Sonnet 的代理编码功能,Cline 可以逐步处理复杂的软件开发任务。借助允许他创建和编辑文件、浏览大型项目、使用浏览器以及执行终端命令(在您授予权限后)的工具,他可以为您提供超越代码补全或技术支持的多种帮助。Cline 甚至可以使用模型上下文协议 (MCP) 来创建新工具并扩展自身的功能。虽然自主 AI 脚本传统上在沙盒环境中运行,但此扩展程序提供了一个人机交互 GUI 来批准每个文件更改和终端命令,从而提供了一种安全且易于访问的方式来探索代理 AI 的潜力


编写一个俄罗斯方块游戏

\

依赖大参数量的模型,推荐使用在线模型,本地小参数模型很难跑起来