知识模块
🤖 Agent 知识模块
十一、Agent 应用场景
编程 Agent

代码助手 Agent

代码助手 Agent 是目前最成熟、应用最广泛的 Agent 类型之一。它能够理解代码上下文、生成代码、调试错误、重构优化,大幅提升开发效率。


一、核心能力

1.1 能力矩阵

┌─────────────────────────────────────────────────────────────┐
│                    代码助手 Agent 能力矩阵                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                 代码生成能力                         │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 代码补全 │ │ 函数生成 │ │ 类/模块  │            │  │
│   │  │          │ │          │ │  生成    │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 测试生成 │ │ 文档生成 │ │ 注释生成 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                 代码理解能力                         │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 代码解释 │ │ 代码审查 │ │ 架构分析 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 依赖分析 │ │ 风险识别 │ │ 命名建议 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                 代码修改能力                         │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ Bug 修复 │ │ 代码重构 │ │ 性能优化 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 版本迁移 │ │ 风格统一 │ │ 安全修复 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 核心技术

技术能力描述实现方式
代码上下文理解理解代码库结构和依赖AST 分析 + 向量检索
代码补全根据上下文补全代码LLM + 流式生成
代码生成根据自然语言生成代码Prompt Engineering
代码调试定位和修复 Bug错误分析 + 代码理解
代码重构改进代码结构和质量静态分析 + LLM 建议

二、架构设计

2.1 整体架构

┌─────────────────────────────────────────────────────────────┐
│                    代码助手 Agent 架构                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    用户交互层                        │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ IDE 集成 │ │ CLI 工具 │ │ Web 界面 │            │  │
│   │  │ 插件     │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    Agent 核心                        │  │
│   │  ┌───────────────────────────────────────────────┐  │  │
│   │  │              Intent Analyzer                  │  │  │
│   │  │  分析用户意图:生成/修改/解释/调试           │  │  │
│   │  └───────────────────────────────────────────────┘  │  │
│   │                         │                            │  │
│   │  ┌───────────────────────────────────────────────┐  │  │
│   │  │              Context Builder                   │  │  │
│   │  │  构建代码上下文:当前文件、依赖、项目结构    │  │  │
│   │  └───────────────────────────────────────────────┘  │  │
│   │                         │                            │  │
│   │  ┌───────────────────────────────────────────────┐  │  │
│   │  │              Code Generator                    │  │  │
│   │  │  生成代码:LLM 调用 + 流式输出                │  │  │
│   │  └───────────────────────────────────────────────┘  │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    工具层                           │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 文件读写 │ │ AST 解析 │ │ Lint 检查 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 测试运行 │ │ Git 操作 │ │ 终端执行 │            │  │
│   │  │          │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                          │                                  │
│                          ↓                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    知识层                           │  │
│   │  ┌──────────┐ ┌──────────┐ ┌──────────┐            │  │
│   │  │ 代码索引 │ │ 文档库   │ │ API 文档 │            │  │
│   │  │ 向量存储 │ │          │ │          │            │  │
│   │  └──────────┘ └──────────┘ └──────────┘            │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.2 代码上下文构建

"""
代码助手 Agent - 上下文构建
"""
 
from typing import List, Dict, Any
from dataclasses import dataclass
import ast
import os
 
 
@dataclass
class CodeContext:
    """代码上下文"""
    current_file: str           # 当前文件路径
    current_content: str        # 当前文件内容
    cursor_position: int        # 光标位置
    related_files: List[str]    # 相关文件
    imports: List[str]          # 导入信息
    definitions: List[Dict]     # 定义(类、函数等)
    dependencies: List[str]     # 依赖关系
 
 
class ContextBuilder:
    """代码上下文构建器"""
    
    def __init__(self, project_root: str, vector_store=None):
        self.project_root = project_root
        self.vector_store = vector_store
    
    def build_context(
        self,
        file_path: str,
        content: str,
        cursor_position: int,
        query: str = None
    ) -> CodeContext:
        """
        构建代码上下文
        
        Args:
            file_path: 当前文件路径
            content: 当前文件内容
            cursor_position: 光标位置
            query: 用户查询(可选)
            
        Returns:
            CodeContext 对象
        """
        # 1. 解析当前文件
        imports, definitions = self._parse_file(content)
        
        # 2. 查找相关文件
        related_files = self._find_related_files(file_path, imports)
        
        # 3. 如果有查询,进行语义检索
        if query and self.vector_store:
            semantic_related = self._semantic_search(query, k=3)
            related_files.extend(semantic_related)
        
        return CodeContext(
            current_file=file_path,
            current_content=content,
            cursor_position=cursor_position,
            related_files=list(set(related_files)),
            imports=imports,
            definitions=definitions,
            dependencies=self._get_dependencies(file_path)
        )
    
    def _parse_file(self, content: str) -> tuple:
        """解析文件,提取导入和定义"""
        try:
            tree = ast.parse(content)
            
            imports = []
            definitions = []
            
            for node in ast.walk(tree):
                if isinstance(node, ast.Import):
                    for alias in node.names:
                        imports.append(alias.name)
                elif isinstance(node, ast.ImportFrom):
                    module = node.module or ''
                    for alias in node.names:
                        imports.append(f"{module}.{alias.name}")
                elif isinstance(node, ast.FunctionDef):
                    definitions.append({
                        'type': 'function',
                        'name': node.name,
                        'line': node.lineno,
                        'args': [arg.arg for arg in node.args.args]
                    })
                elif isinstance(node, ast.ClassDef):
                    definitions.append({
                        'type': 'class',
                        'name': node.name,
                        'line': node.lineno,
                        'methods': [n.name for n in node.body if isinstance(n, ast.FunctionDef)]
                    })
            
            return imports, definitions
            
        except SyntaxError:
            return [], []
    
    def _find_related_files(
        self,
        file_path: str,
        imports: List[str]
    ) -> List[str]:
        """根据导入查找相关文件"""
        related = []
        
        # 查找导入的模块对应的文件
        for imp in imports:
            # 简化:假设在项目目录下查找
            module_path = imp.replace('.', '/') + '.py'
            full_path = os.path.join(self.project_root, module_path)
            if os.path.exists(full_path):
                related.append(full_path)
        
        return related[:5]  # 限制数量
    
    def _semantic_search(self, query: str, k: int = 3) -> List[str]:
        """语义检索相关代码"""
        if not self.vector_store:
            return []
        
        results = self.vector_store.similarity_search(query, k=k)
        return [r.metadata.get('file_path') for r in results if r.metadata.get('file_path')]
    
    def _get_dependencies(self, file_path: str) -> List[str]:
        """获取文件依赖"""
        # 可以解析 requirements.txt、package.json 等
        return []
    
    def format_context_for_prompt(self, context: CodeContext) -> str:
        """格式化上下文为 Prompt"""
        prompt_parts = [
            f"# 当前文件: {context.current_file}",
            f"```",
            context.current_content,
            f"```",
            ""
        ]
        
        if context.definitions:
            prompt_parts.append("# 文件中的定义:")
            for defn in context.definitions[:5]:
                if defn['type'] == 'function':
                    prompt_parts.append(f"- 函数 {defn['name']}({', '.join(defn['args'])})")
                elif defn['type'] == 'class':
                    prompt_parts.append(f"- 类 {defn['name']}")
        
        if context.related_files:
            prompt_parts.append("\n# 相关文件:")
            for rf in context.related_files[:3]:
                prompt_parts.append(f"- {rf}")
        
        return "\n".join(prompt_parts)
 
 
# ========== 使用示例 ==========
 
if __name__ == "__main__":
    builder = ContextBuilder(project_root="./my_project")
    
    code = '''
import os
from typing import List
 
def hello(name: str):
    return f"Hello, {name}!"
 
class Calculator:
    def add(self, a, b):
        return a + b
'''
    
    context = builder.build_context(
        file_path="main.py",
        content=code,
        cursor_position=50,
        query="如何实现一个计算器"
    )
    
    prompt = builder.format_context_for_prompt(context)
    print(prompt)

2.3 代码生成实现

"""
代码助手 Agent - 代码生成
"""
 
from typing import Optional, List
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
 
 
class CodeGenerator:
    """代码生成器"""
    
    GENERATE_PROMPT = """
你是一个专业的程序员助手。请根据用户需求生成代码。
 
## 当前文件上下文
\{context\}
 
## 用户需求
\{request\}
 
## 要求
1. 生成符合最佳实践的高质量代码
2. 添加必要的注释和文档字符串
3. 遵循项目的代码风格
4. 如果需要导入新模块,请在开头添加 import 语句
 
## 生成的代码
(代码块开始)\{language\}
"""
    
    COMPLETE_PROMPT = """
你是一个代码补全助手。请根据上下文补全代码。
 
## 当前文件
文件名: \{file_path\}
光标位置: 第 \{line_number\} 行
 
## 光标前的代码
(代码块开始)\{language\}
\{prefix\}
(代码块结束)
 
## 光标后的代码
(代码块开始)\{language\}
\{suffix\}
(代码块结束)
 
## 请补全光标位置的代码(只输出补全内容,不要输出已有代码)
"""
    
    EXPLAIN_PROMPT = """
请解释以下代码的功能:
 
(代码块开始)\{language\}
\{code\}
(代码块结束)
 
请从以下角度解释:
1. 整体功能
2. 关键逻辑
3. 使用的设计模式(如果有)
4. 潜在的问题或改进建议
"""
    
    DEBUG_PROMPT = """
请帮助调试以下代码中的问题:
 
## 代码
(代码块开始)\{language\}
\{code\}
(代码块结束)
 
## 错误信息
\{error\}
 
## 请分析:
1. 错误原因
2. 修复方案
3. 修复后的代码
"""
    
    def __init__(self, llm=None):
        self.llm = llm or ChatOpenAI(model="gpt-4", temperature=0)
    
    async def generate(
        self,
        request: str,
        context: str,
        language: str = "python"
    ) -> str:
        """生成代码"""
        prompt = ChatPromptTemplate.from_template(self.GENERATE_PROMPT)
        chain = prompt | self.llm
        
        response = await chain.ainvoke({
            "context": context,
            "request": request,
            "language": language
        })
        
        return self._extract_code(response.content, language)
    
    async def complete(
        self,
        file_path: str,
        prefix: str,
        suffix: str,
        line_number: int,
        language: str = "python"
    ) -> str:
        """补全代码"""
        prompt = ChatPromptTemplate.from_template(self.COMPLETE_PROMPT)
        chain = prompt | self.llm
        
        response = await chain.ainvoke({
            "file_path": file_path,
            "prefix": prefix,
            "suffix": suffix,
            "line_number": line_number,
            "language": language
        })
        
        return response.content.strip()
    
    async def explain(
        self,
        code: str,
        language: str = "python"
    ) -> str:
        """解释代码"""
        prompt = ChatPromptTemplate.from_template(self.EXPLAIN_PROMPT)
        chain = prompt | self.llm
        
        response = await chain.ainvoke({
            "code": code,
            "language": language
        })
        
        return response.content
    
    async def debug(
        self,
        code: str,
        error: str,
        language: str = "python"
    ) -> dict:
        """调试代码"""
        prompt = ChatPromptTemplate.from_template(self.DEBUG_PROMPT)
        chain = prompt | self.llm
        
        response = await chain.ainvoke({
            "code": code,
            "error": error,
            "language": language
        })
        
        return {
            "analysis": response.content,
            "fixed_code": self._extract_code(response.content, language)
        }
    
    def _extract_code(self, text: str, language: str) -> str:
        """从文本中提取代码块"""
        import re
        pattern = rf"```\{language\}\n(.*?)```"
        match = re.search(pattern, text, re.DOTALL)
        if match:
            return match.group(1).strip()
        return text
 
 
# ========== 流式生成示例 ==========
 
async def stream_generate(generator: CodeGenerator, request: str, context: str):
    """流式生成代码"""
    prompt = ChatPromptTemplate.from_template(generator.GENERATE_PROMPT)
    chain = prompt | generator.llm
    
    async for chunk in chain.astream({
        "context": context,
        "request": request,
        "language": "python"
    }):
        print(chunk.content, end="", flush=True)

三、实战案例

3.1 案例:智能代码补全

"""
智能代码补全系统
"""
 
class IntelligentCodeCompleter:
    """智能代码补全"""
    
    def __init__(self, context_builder: ContextBuilder, generator: CodeGenerator):
        self.context_builder = context_builder
        self.generator = generator
    
    async def complete(
        self,
        file_path: str,
        content: str,
        cursor_offset: int,
        language: str = "python"
    ) -> str:
        """
        执行代码补全
        
        Args:
            file_path: 文件路径
            content: 文件内容
            cursor_offset: 光标偏移量
            language: 语言
            
        Returns:
            补全内容
        """
        # 1. 分割代码
        prefix = content[:cursor_offset]
        suffix = content[cursor_offset:]
        line_number = prefix.count('\n') + 1
        
        # 2. 构建上下文
        context = self.context_builder.build_context(
            file_path=file_path,
            content=content,
            cursor_position=cursor_offset
        )
        
        # 3. 生成补全
        completion = await self.generator.complete(
            file_path=file_path,
            prefix=prefix,
            suffix=suffix,
            line_number=line_number,
            language=language
        )
        
        return completion
 
 
# ========== 使用示例 ==========
 
async def demo_code_completion():
    """演示代码补全"""
    completer = IntelligentCodeCompleter(
        context_builder=ContextBuilder("."),
        generator=CodeGenerator()
    )
    
    code = '''
def calculate_average(numbers):
    """计算平均值"""
    if not numbers:
        return 0
    
    # 光标在这里,等待补全
    
'''
    
    cursor_offset = len(code) - 10  # 模拟光标位置
    
    completion = await completer.complete(
        file_path="utils.py",
        content=code,
        cursor_offset=cursor_offset
    )
    
    print(f"补全内容:\n{completion}")

3.2 案例:Bug 调试助手

"""
Bug 调试助手
"""
 
import subprocess
import traceback
from typing import Optional
 
 
class BugDebugger:
    """Bug 调试助手"""
    
    def __init__(self, generator: CodeGenerator):
        self.generator = generator
    
    async def debug_file(
        self,
        file_path: str,
        test_command: Optional[str] = None
    ) -> dict:
        """
        调试文件中的 Bug
        
        Args:
            file_path: 文件路径
            test_command: 测试命令
            
        Returns:
            调试结果
        """
        # 1. 读取文件
        with open(file_path, 'r', encoding='utf-8') as f:
            code = f.read()
        
        # 2. 运行并捕获错误
        error = await self._run_and_capture_error(file_path, test_command)
        
        if not error:
            return {"status": "success", "message": "代码运行正常"}
        
        # 3. 分析并修复
        debug_result = await self.generator.debug(
            code=code,
            error=error
        )
        
        return {
            "status": "error_found",
            "error": error,
            "analysis": debug_result["analysis"],
            "fixed_code": debug_result["fixed_code"]
        }
    
    async def _run_and_capture_error(
        self,
        file_path: str,
        test_command: Optional[str] = None
    ) -> Optional[str]:
        """运行代码并捕获错误"""
        try:
            if test_command:
                result = subprocess.run(
                    test_command,
                    shell=True,
                    capture_output=True,
                    text=True,
                    timeout=30
                )
                if result.returncode != 0:
                    return result.stderr or result.stdout
            else:
                # 直接运行 Python 文件
                result = subprocess.run(
                    ["python", file_path],
                    capture_output=True,
                    text=True,
                    timeout=30
                )
                if result.returncode != 0:
                    return result.stderr or result.stdout
            return None
        except subprocess.TimeoutExpired:
            return "执行超时"
        except Exception as e:
            return str(e)
 
 
# ========== 使用示例 ==========
 
async def demo_bug_debugging():
    """演示 Bug 调试"""
    debugger = BugDebugger(generator=CodeGenerator())
    
    # 创建一个有 Bug 的文件
    buggy_code = '''
def divide(a, b):
    return a / b
 
result = divide(10, 0)
print(result)
'''
    
    with open("buggy.py", "w") as f:
        f.write(buggy_code)
    
    # 调试
    result = await debugger.debug_file("buggy.py")
    
    print(f"状态: {result['status']}")
    print(f"错误: {result.get('error', 'N/A')}")
    print(f"\n修复后的代码:\n{result.get('fixed_code', 'N/A')}")

四、代表产品分析

4.1 GitHub Copilot

┌─────────────────────────────────────────────────────────────┐
│                    GitHub Copilot 分析                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   核心特点:                                                 │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • 实时代码补全(行级、块级)                         │  │
│   │ • 自然语言转代码                                     │  │
│   │ • 多语言支持                                         │  │
│   │ • IDE 深度集成                                       │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   技术架构:                                                 │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                                                      │  │
│   │   IDE 插件 ←→ Copilot Server ←→ LLM                 │  │
│   │       │              │                               │  │
│   │       ↓              ↓                               │  │
│   │   代码上下文     上下文编码                          │  │
│   │   光标位置       补全生成                            │  │
│   │   相邻代码       流式返回                            │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   关键技术:                                                 │
│   • 上下文窗口优化:只发送相关代码                         │
│   • 多文件上下文:理解项目结构                             │
│   • 缓存机制:复用常见模式                                 │
│   • 安全过滤:避免生成恶意代码                             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

4.2 Cursor

┌─────────────────────────────────────────────────────────────┐
│                    Cursor 分析                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   核心特点:                                                 │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • AI 原生编辑器                                     │  │
│   │ • 代码库索引(Codebase Indexing)                   │  │
│   │ • 多文件编辑能力                                    │  │
│   │ • Chat + Edit 集成                                  │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   差异化优势:                                               │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                                                      │  │
│   │   1. 代码库索引                                     │  │
│   │      • 向量化整个代码库                             │  │
│   │      • 语义搜索相关代码                             │  │
│   │      • 智能上下文组装                               │  │
│   │                                                      │  │
│   │   2. 多文件编辑                                     │  │
│   │      • 一次请求修改多个文件                         │  │
│   │      • 自动处理依赖关系                             │  │
│   │      • Diff 预览和确认                              │  │
│   │                                                      │  │
│   │   3. @符号引用                                      │  │
│   │      • @File 引用文件                               │  │
│   │      • @Docs 引用文档                               │  │
│   │      • @Code 引用代码片段                           │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

五、面试问答

Q1: 代码助手 Agent 的核心技术难点是什么?

回答要点:

  1. 上下文构建:如何选择最相关的代码上下文
  2. Token 限制:如何在有限窗口内包含足够信息
  3. 多文件理解:如何理解项目级别的代码结构
  4. 安全性:如何避免生成恶意或有问题的代码
  5. 性能:如何实现实时补全的毫秒级响应

Q2: 如何评估代码助手的效果?

回答要点:

指标描述测量方法
补全接受率用户接受建议的比例接受次数/总建议次数
代码质量生成代码的质量静态分析、测试通过率
开发效率编码时间节省A/B 测试对比
用户满意度用户主观评价问卷调查、NPS

Q3: 代码助手如何处理安全问题?

回答要点:

  1. 输入过滤:检测和阻止恶意请求
  2. 输出过滤:避免生成敏感代码
  3. 许可证检测:避免复制开源代码
  4. 敏感信息保护:不发送敏感代码到云端

Q4: 代码助手的发展趋势是什么?

回答要点:

  • 更强的项目理解:理解整个代码库
  • 多模态支持:理解图表、UI 设计稿
  • 自主编程:独立完成整个功能开发
  • 团队协作:多人协作编程

六、小结

代码助手 Agent 是最成熟的 Agent 应用之一:

核心要点

  1. 上下文是关键:理解代码上下文是生成高质量代码的基础
  2. 流式输出:实时响应用户输入
  3. 安全性:必须考虑代码安全

最佳实践

  • 合理构建代码上下文
  • 实现流式输出提升体验
  • 建立代码质量检查机制
  • 收集用户反馈持续优化