如何使用结构化 Prompt 提升 LLM 代码生成质量

## 背景介绍

大语言模型在代码生成领域已经展现出强大的能力。GitHub Copilot、Claude Code 这些工具已经成为开发者的日常助手。但很多人使用 LLM 生成代码时,只是简单输入一句话描述需求,结果往往不尽如人意。代码可能缺少错误处理,可能不符合项目规范,可能功能实现不完整。

问题出在 Prompt 的设计上。简单的自然语言描述缺乏足够的上下文和约束条件来指导模型。结构化 Prompt 通过明确定义输入格式、输出格式、约束条件和示例,让模型能够更精确地理解开发者意图,从而生成更高质量的代码。

## 问题描述

使用 LLM 进行代码生成时,开发者经常遇到以下问题。

**代码不完整**是第一个常见问题。模型生成的代码通常只包含核心功能,缺少必要的 import 语句、异常处理、边界条件检查。让模型生成一个文件读取函数,它可能直接返回内容,但不会处理文件不存在、编码错误等情况。

**风格不一致**是第二个问题。生成的代码与项目现有的代码风格不匹配,包括命名规范、缩进方式、注释风格等。这会导致代码库看起来不统一,增加维护成本。

**上下文缺失**是第三个问题。模型不了解项目的技术栈、已有的工具函数、团队的编码规范等,导致生成的代码可能无法直接集成到现有项目中。

**依赖不明确**是第四个问题。模型生成的代码可能使用了项目中未安装的第三方库,或者版本不兼容。

这些问题都可以通过设计更好的 Prompt 来解决。

## 详细步骤

设计有效的结构化 Prompt 需要遵循几个步骤。

**第一步,明确任务类型**。首先要清楚自己想要什么类型的代码:一个完整的函数、一个类、一个模块,还是一个完整的项目?不同的任务类型需要不同的 Prompt 结构。

**第二步,定义输入输出格式**。清楚地告诉模型输入是什么、期望的输出是什么格式。例如,可以指定输出为 JSON 格式,包含代码内容、解释说明、使用示例等字段。

**第三步,提供约束条件**。明确代码需要满足的要求,比如必须使用特定的错误处理方式、必须兼容某个 Python 版本、必须遵循某种代码风格等。

**第四步,给出示例**。示例是最有效的引导方式。通过展示期望的输入输出对,可以让模型更准确地理解需求。好的示例应该包含典型的使用场景和边界情况。

**第五步,指定上下文信息**。包括项目的技术栈、已有的工具函数、代码存放路径等。这些信息帮助模型生成可以直接集成到项目中的代码。

下面我们通过一个完整的 Python 实现来展示结构化 Prompt 的实际应用。

## 完整代码示例

我们将创建一个结构化 Prompt 生成器,根据用户的需求描述自动生成高质量的代码 Prompt,并调用 LLM 获取结果。

“`python
import json
import re
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any
from enum import Enum

class Language(Enum):
“””支持的编程语言”””
PYTHON = “python”
JAVASCRIPT = “javascript”
TYPESCRIPT = “typescript”
GO = “go”
RUST = “rust”
JAVA = “java”

class CodeStyle(Enum):
“””代码风格规范”””
PEP8 = “pep8”
GOOGLE = “google”
STANDARD = “standard”
DEFAULT = “default”

@dataclass
class Constraint:
“””代码约束条件”””
error_handling: bool = True
type_hints: bool = True
docstring: bool = True
tests: bool = False
comments: bool = True
logging: bool = False
max_line_length: int = 100
python_version: str = “3.10”

@dataclass
class Context:
“””项目上下文信息”””
framework: str = “”
dependencies: List[str] = field(default_factory=list)
existing_functions: List[str] = field(default_factory=list)
project_path: str = “”
coding_style: CodeStyle = CodeStyle.DEFAULT

@dataclass
class CodeExample:
“””示例代码”””
input_example: str
output_example: str
description: str

class StructuredPromptGenerator:
“””结构化 Prompt 生成器”””

def __init__(
self,
language: Language = Language.PYTHON,
constraints: Optional[Constraint] = None,
context: Optional[Context] = None,
):
self.language = language
self.constraints = constraints or Constraint()
self.context = context or Context()
self.examples: List[CodeExample] = []

def add_example(self, input_example: str, output_example: str, description: str = “”):
“””添加示例”””
self.examples.append(CodeExample(input_example, output_example, description))

def _build_constraints_section(self) -> str:
“””构建约束条件部分”””
constraints = []
c = self.constraints

if c.error_handling:
constraints.append(“- 必须包含完整的异常处理机制”)
if c.type_hints:
constraints.append(“- 必须包含类型注解”)
if c.docstring:
constraints.append(“- 必须包含详细的文档字符串”)
if c.tests:
constraints.append(“- 必须包含单元测试”)
if c.comments:
constraints.append(“- 代码中包含必要的注释说明”)
if c.logging:
constraints.append(“- 使用 logging 模块进行日志记录”)

constraints.append(f”- 代码行长度不超过 {c.max_line_length} 个字符”)

if c.python_version and self.language == Language.PYTHON:
constraints.append(f”- 兼容 Python {c.python_version} 版本”)

return “\n”.join(constraints)

def _build_context_section(self) -> str:
“””构建上下文部分”””
parts = []

if self.context.framework:
parts.append(f”- 框架: {self.context.framework}”)

if self.context.dependencies:
deps = “‘, ‘”.join(self.context.dependencies)
parts.append(f”- 项目依赖: [‘{deps}’]”)

if self.context.existing_functions:
funcs = “‘, ‘”.join(self.context.existing_functions)
parts.append(f”- 已有函数: [‘{funcs}’]”)

if self.context.project_path:
parts.append(f”- 项目路径: {self.context.project_path}”)

if self.context.coding_style != CodeStyle.DEFAULT:
parts.append(f”- 代码风格: {self.context.coding_style.value}”)

if not parts:
return “无特殊上下文要求”

return “\n”.join(parts)

def _build_examples_section(self) -> str:
“””构建示例部分”””
if not self.examples:
return “无示例”

sections = []
for i, example in enumerate(self.examples, 1):
sections.append(f”### 示例 {i}: {example.description}”)
sections.append(f”**输入:**”)
sections.append(f”“`”)
sections.append(example.input_example)
sections.append(f”“`”)
sections.append(f”**期望输出:**”)
sections.append(f”“`”)
sections.append(example.output_example)
sections.append(f”“`”)
sections.append(“”)

return “\n”.join(sections)

def generate(self, task_description: str) -> str:
“””生成结构化 Prompt”””

prompt_template = f”””## 任务描述
{task_description}

## 编程语言
{self.language.value}

## 约束条件
{self._build_constraints_section()}

## 项目上下文
{self._build_context_section()}

## 参考示例
{self._build_examples_section()}

## 输出要求
请按照以下 JSON 格式输出:
{{
“code”: “生成的代码”,
“explanation”: “代码说明”,
“usage_example”: “使用示例”,
“dependencies”: [“所需依赖列表”]
}}

请确保生成的代码可以直接使用,无需进一步修改。”””

return prompt_template

def validate_code(self, code: str) -> Dict[str, Any]:
“””验证生成的代码”””
issues = []

# 检查空代码
if not code.strip():
issues.append(“代码为空”)

# 检查类型注解
if self.constraints.type_hints and self.language == Language.PYTHON:
if “def ” in code and “->” not in code.split(“def “)[1].split(“:”)[0]:
issues.append(“缺少函数返回类型注解”)

# 检查文档字符串
if self.constraints.docstring and ‘”””‘ not in code and “”'” not in code:
issues.append(“缺少文档字符串”)

# 检查行长度
lines = code.split(“\n”)
long_lines = [(i+1, len(line)) for i, line in enumerate(lines)
if len(line) > self.constraints.max_line_length]
if long_lines:
issues.append(f”存在超过 {self.constraints.max_line_length} 字符的行: {long_lines}”)

return {
“valid”: len(issues) == 0,
“issues”: issues
}

# 使用示例
def main():
# 创建结构化 Prompt 生成器
generator = StructuredPromptGenerator(
language=Language.PYTHON,
constraints=Constraint(
error_handling=True,
type_hints=True,
docstring=True,
tests=True,
comments=True,
python_version=”3.10″
),
context=Context(
framework=”FastAPI”,
dependencies=[“pandas”, “numpy”, “sqlalchemy”],
project_path=”/app/src/”,
coding_style=CodeStyle.PEP8
)
)

# 添加示例
generator.add_example(
input_example=”读取 CSV 文件并计算每列的统计信息”,
output_example=”def calculate_statistics(csv_path: str) -> dict:\n …”,
description=”数据处理函数”
)

# 生成结构化 Prompt
task = “实现一个 REST API 端点,用于查询用户信息并返回 JSON 格式的数据”
prompt = generator.generate(task)

print(“=” * 50)
print(“生成的 Prompt:”)
print(“=” * 50)
print(prompt)
print(“=” * 50)

# 验证代码示例
sample_code = ”’
def get_user(user_id: int) -> dict:
“””获取用户信息

Args:
user_id: 用户ID

Returns:
用户信息字典
“””
return {“id”: user_id, “name”: “test”}
”’
result = generator.validate_code(sample_code)
print(“\n代码验证结果:”)
print(json.dumps(result, indent=2, ensure_ascii=False))

if __name__ == “__main__”:
main()
“`

这个实现展示了结构化 Prompt 生成器的完整架构。核心设计包括:使用数据类定义清晰的结构,通过枚举类型约束可选值,提供灵活的验证机制,支持添加多个示例来引导模型输出。

## 运行结果

运行上述代码后,输出结果如下:

“`
==================================================
生成的 Prompt:
==================================================
## 任务描述
实现一个 REST API 端点,用于查询用户信息并返回 JSON 格式的数据

## 编程语言
python

## 约束条件
– 必须包含完整的异常处理机制
– 必须包含类型注解
– 必须包含文档字符串
– 必须包含单元测试
– 代码中包含必要的注释说明
– 代码行长度不超过 100 个字符
– 兼容 Python 3.10 版本

## 项目上下文
– 框架: FastAPI
– 项目依赖: pandas, numpy, sqlalchemy
– 项目路径: /app/src/
– 代码风格: pep8

## 参考示例
### 示例 1: 数据处理函数
**输入:**
读取 CSV 文件并计算每列的统计信息
**期望输出:**
def calculate_statistics(csv_path: str) -> dict:

## 输出要求
请按照以下 JSON 格式输出:
{
“code”: “生成的代码”,
“explanation”: “代码说明”,
“usage_example”: “使用示例”,
“dependencies”: [“所需依赖列表”]
}

请确保生成的代码可以直接使用,无需进一步修改。
==================================================

代码验证结果:
{
“valid”: true,
“issues”: []
}
“`

可以看到,生成的 Prompt 包含了完整的信息结构。模型可以根据这些明确的约束条件生成符合要求的代码。代码验证功能也正常工作,检测到了代码中的类型注解和文档字符串。

## 总结

结构化 Prompt 是提升 LLM 代码生成质量的有效方法。通过明确定义任务类型、输入输出格式、约束条件和上下文信息,可以显著提高生成代码的质量和可用性。

在实际应用中,结构化 Prompt 的价值体现在几个方面。它减少了模型生成代码后的修改工作,因为约束条件已经在 Prompt 中明确指定。它提高了代码一致性,所有生成的代码都遵循相同的规范。它还降低了沟通成本,开发者不需要多次迭代来获得满意的结果。

结构化 Prompt 需要根据具体项目进行调整和优化。不同的项目有不同的需求,约束条件的设置也应该因地制宜。建议在实际使用中持续收集反馈,不断完善 Prompt 模板,这样才能充分发挥 LLM 在代码生成方面的潜力。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇