代码自动生成
代码大模型
- 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 的潜力
编写一个俄罗斯方块游戏

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