1. 项目概述:当Prompt工程遇上装饰器模式

最近在折腾大模型应用开发,尤其是基于LangChain、Spring AI这类框架构建AI Agent时,一个绕不开的痛点就是Prompt的管理。我们经常需要写一堆冗长、结构复杂的提示词,里面塞满了系统指令、用户问题、历史对话、工具描述,还有各种格式要求。代码里到处都是硬编码的字符串模板,改一个词就得翻好几个文件,调试起来更是噩梦——你根本不知道是模型理解错了,还是你的Prompt写偏了。

更头疼的是“Context Overflow”(上下文溢出)问题。模型(比如GPT-4)的上下文窗口是有限的,当你塞进去的Prompt太长,超过了这个限制,轻则模型只“看”最后一部分,丢失关键信息,重则直接报错,就像热词里提到的 prompt too large for the model 。这时候,你只能手动去裁剪、总结历史,或者粗暴地 /reset 重开对话,体验非常割裂。

于是,我开始思考:有没有一种更优雅、更工程化的方式来管理Prompt?就像我们管理代码依赖、配置和业务逻辑一样。这时,我脑子里蹦出了两个词: Prompt 装饰器(Decorator) 。没错,就是Python里那个用来增强函数功能的装饰器。如果把每一次对大模型的调用看作一个“函数”,那么Prompt就是它的“输入参数”和“执行环境”。我们能不能用装饰器的思想,来动态地组装、修饰、验证和优化这个Prompt呢?

这就是“Prompt装饰器”的核心思路。它不是一个具体的库或工具,而是一种设计模式和实现理念。其目标是将Prompt的构造逻辑从核心业务代码中解耦出来,通过可插拔的“装饰器”链,对原始的、简单的用户输入进行层层加工,最终生成一个高质量、符合模型要求、且适应具体场景的完整Prompt。这不仅能大幅提升代码的可维护性和复用性,还能系统性地解决上下文管理、格式控制、安全过滤等一系列工程问题。

简单来说, Prompt装饰器就是给AI调用“套壳” 。你只需要关心最核心的查询意图(比如“总结这篇文档”),而诸如“请用中文回答”、“格式化为Markdown”、“忽略2021年后的信息”、“如果太长请先总结”等要求,都可以通过预定义的装饰器自动叠加。这特别适合需要频繁、标准化调用大模型的场景,比如构建知识库问答、自动化报告生成、智能客服Agent等。

2. 核心思路:从硬编码到声明式管道

在传统方式下,Prompt的构建往往是线性的、硬编码的。你可能会在代码里写出这样的字符串拼接:

system_prompt = “你是一个专业的翻译助手。请将用户输入翻译成英文,并确保术语准确。”
user_input = “今天天气真好”
full_prompt = f“{system_prompt}\n\n用户:{user_input}\n助手:”
response = llm.invoke(full_prompt)

这种方式有几个明显弊端:

  1. 耦合度高 :业务逻辑和Prompt模板紧紧绑在一起,改模板就要改代码。
  2. 难以复用 system_prompt 可能在其他翻译场景也要用,但复制粘贴会导致散落各处。
  3. 缺乏灵活性 :如果想增加一个“翻译成英式英语”的要求,或者先对用户输入进行拼写检查,就需要侵入式地修改 full_prompt 的构建逻辑。
  4. 不易测试 :很难对Prompt本身进行单元测试,只能通过端到端的模型调用来验证效果。

Prompt装饰器模式旨在用“管道(Pipeline)”和“装饰(Decoration)”的思想解决这些问题。其核心设计如下:

2.1 核心组件与工作流

想象一条流水线,原始的用户输入是待加工的原料,经过一系列“加工站”(装饰器)的处理,最终变成可以送入大模型的成品Prompt。

  1. 原始输入(Raw Input) :最开始的用户查询或指令,例如“帮我写一份项目周报”。
  2. 装饰器链(Decorator Chain) :一系列有序排列的处理器。每个装饰器都是一个独立的函数或类,负责一项具体的Prompt加工任务。它们像洋葱一样一层层包裹原始输入。
  3. 上下文(Context) :一个在整个装饰链中传递的共享数据对象。它不仅仅包含当前的文本,还可能包括对话历史、用户身份、可用工具列表、系统配置等元数据。这是解决上下文管理问题的关键。
  4. 最终Prompt(Final Prompt) :装饰链处理完成后,根据目标大模型(如OpenAI、Claude、本地部署的Llama)要求的格式(如ChatML、Alpaca格式),将上下文中的数据组装成的最终字符串或消息列表。

一个典型的工作流可能是: 用户输入 -> [输入清洗装饰器] -> [上下文装载装饰器] -> [角色设定装饰器] -> [格式约束装饰器] -> [长度优化装饰器] -> 组装为模型API格式 -> 调用大模型

2.2 与常见框架的对比

你可能会问,这和LangChain的 PromptTemplate LCEL (LangChain Expression Language)或者Spring AI的 PromptTemplate 有什么区别?

  • LangChain/Spring AI的PromptTemplate :更像是 预制好的模具 。你定义一个带有 {variable} 占位符的模板,然后填入变量。它解决了字符串拼接的问题,但模板本身仍然是静态的、扁平的。复杂的逻辑(如条件判断、循环、历史裁剪)还是需要你在调用模板前处理好。
  • Prompt装饰器 :则是 动态的加工流水线 。它关注的是加工 过程 。每个装饰器都是一个独立的、可测试的单元,负责一项具体的转换。你可以像搭积木一样组合它们,例如:“无论什么输入,先经过敏感词过滤,再根据输入长度决定是否启用总结装饰器,最后套上客服话术模板”。这种声明式的组合方式,让复杂的Prompt构建逻辑变得清晰、可配置、可复用。

本质上,Prompt装饰器可以基于这些框架的模板功能来构建,是更高一层的抽象和组织模式。它尤其适合处理那些需要多步骤、有条件分支的复杂Prompt构建场景。

3. 动手实现:构建一个Python Prompt装饰器框架

理论说再多不如动手做。我们来设计一个轻量级但功能完整的Prompt装饰器框架。这个框架不依赖特定的大模型SDK,核心只关注Prompt的加工过程。

3.1 定义核心数据结构:PromptContext

首先,我们需要一个容器来承载流水线上的所有信息。

from typing import Any, Dict, List, Optional
from dataclasses import dataclass, field

@dataclass
class PromptContext:
    """
    贯穿整个装饰器链的上下文对象。
    它包含了原始输入、不断被修饰的中间内容,以及各种元数据。
    """
    # 核心文本内容
    raw_input: str  # 最原始的用户输入
    current_text: str  # 当前经过装饰处理后的文本
    system_message: Optional[str] = None  # 系统指令
    conversation_history: List[Dict[str, str]] = field(default_factory=list) # 历史消息,格式如 [{"role": "user", "content": "..."}, ...]

    # 元数据与控制信号
    metadata: Dict[str, Any] = field(default_factory=dict)  # 存放其他任意数据,如用户ID、时间戳、功能标志
    max_tokens: Optional[int] = None  # 本次调用的最大token限制(用于长度优化)
    model_name: Optional[str] = None  # 目标模型名称(用于格式适配)
    stop_processing: bool = False  # 紧急停止信号,如果某个装饰器设置此标志,则跳过后续装饰器

    def to_openai_messages(self) -> List[Dict[str, str]]:
        """将上下文转换为OpenAI Chat API要求的消息格式。"""
        messages = []
        if self.system_message:
            messages.append({"role": "system", "content": self.system_message})
        messages.extend(self.conversation_history)
        messages.append({"role": "user", "content": self.current_text})
        return messages

    def to_simple_prompt(self) -> str:
        """转换为简单的单字符串Prompt格式(适用于补全模型)。"""
        prompt = ""
        if self.system_message:
            prompt += f“System: {self.system_message}\n\n”
        for msg in self.conversation_history:
            prompt += f“{msg['role'].capitalize()}: {msg['content']}\n”
        prompt += f“User: {self.current_text}\nAssistant:”
        return prompt

这个 PromptContext 是整个系统的灵魂。所有装饰器都接收一个 context 对象,修改它,然后返回它。

3.2 定义装饰器基类与链式执行器

接下来,定义装饰器的抽象接口和一个负责执行链的控制器。

from abc import ABC, abstractmethod
from typing import Callable

class PromptDecorator(ABC):
    """所有Prompt装饰器的抽象基类。"""
    
    @abstractmethod
    def decorate(self, context: PromptContext) -> PromptContext:
        """对传入的上下文进行处理,并返回处理后的新上下文。"""
        pass

    def __call__(self, context: PromptContext) -> PromptContext:
        """使装饰器实例可调用。"""
        return self.decorate(context)


class DecoratorChain:
    """装饰器链,负责按顺序执行一系列装饰器。"""
    
    def __init__(self, decorators: List[PromptDecorator]):
        self.decorators = decorators
    
    def run(self, initial_context: PromptContext) -> PromptContext:
        """运行整个装饰器链。"""
        context = initial_context
        for decorator in self.decorators:
            if context.stop_processing:
                print(f“警告:处理被标记为停止,跳过装饰器 {decorator.__class__.__name__}”)
                break
            context = decorator(context)
        return context
    
    def add_decorator(self, decorator: PromptDecorator, position: Optional[int] = None):
        """向链中添加装饰器。"""
        if position is None:
            self.decorators.append(decorator)
        else:
            self.decorators.insert(position, decorator)

3.3 实现几个实用的具体装饰器

现在,我们可以实现一些解决实际问题的装饰器了。

3.3.1 基础装饰器:系统指令设定
class SystemInstructionDecorator(PromptDecorator):
    """为对话设定系统角色和指令。"""
    
    def __init__(self, instruction: str):
        self.instruction = instruction
    
    def decorate(self, context: PromptContext) -> PromptContext:
        context.system_message = self.instruction
        # 可以在metadata里做个记录
        context.metadata[‘system_instruction_set’] = True
        return context
3.3.2 核心装饰器:上下文管理与长度优化

这是解决“prompt too large”问题的关键。

class ContextManagementDecorator(PromptDecorator):
    """
    智能管理对话历史,防止上下文溢出。
    策略:当历史对话的估计token数超过阈值时,对最早的历史进行总结或丢弃。
    """
    
    def __init__(self, max_history_tokens: int = 2000, model_name: str = “gpt-3.5-turbo”):
        self.max_history_tokens = max_history_tokens
        # 一个简单的token估算函数(实际应用应使用tiktoken等库)
        self.encoder = self._get_encoder(model_name)
    
    def _get_encoder(self, model_name: str) -> Callable[[str], int]:
        # 这里简化处理,实际应使用对应模型的tokenizer
        # 例如:对于OpenAI模型,使用 tiktoken.encoding_for_model(model_name)
        # 此处返回一个按字数粗略估算的函数
        return lambda text: len(text) // 4  # 假设1个token约等于4个字符
    
    def _estimate_tokens(self, messages: List[Dict]) -> int:
        total = 0
        for msg in messages:
            total += self.encoder(msg[‘content’])
        return total
    
    def decorate(self, context: PromptContext) -> PromptContext:
        if not context.conversation_history:
            return context
        
        current_history_tokens = self._estimate_tokens(context.conversation_history)
        
        if current_history_tokens <= self.max_history_tokens:
            return context  # 历史长度在安全范围内,无需处理
        
        # 超出限制,需要裁剪
        print(f“警告:对话历史过长({current_history_tokens} tokens),进行裁剪。”)
        # 策略1:简单丢弃最老的对话轮次,直到满足要求
        while (context.conversation_history and 
               self._estimate_tokens(context.conversation_history) > self.max_history_tokens):
            removed = context.conversation_history.pop(0) # 移除最早的一轮
            print(f“已移除历史记录:{removed[‘role’]}: {removed[‘content’][:50]}...”)
        
        # 更高级的策略2:可以调用大模型本身,对移除的旧历史进行总结,并将总结作为一条新消息插入。
        # 例如:
        # summary = self._summarize_history(removed_messages)
        # if summary:
        #     context.conversation_history.insert(0, {“role”: “system”, “content”: f“之前对话的摘要:{summary}”})
        
        context.metadata[‘history_trimmed’] = True
        return context

注意 :这里的token估算非常粗糙。在生产环境中, 必须使用准确的tokenizer ,比如OpenAI的 tiktoken 、Hugging Face的 transformers 库。错误估计token数会导致API调用失败或额外费用。

3.3.3 功能装饰器:输出格式约束
class OutputFormatDecorator(PromptDecorator):
    """约束模型输出的格式,例如JSON、Markdown、列表等。"""
    
    def __init__(self, format_type: str = “text”):
        self.format_type = format_type.lower()
        self.format_instructions = {
            “json”: “请将你的输出严格格式化为一个合法的JSON对象。不要包含任何额外的解释或标记。",
            “markdown”: “请使用Markdown格式来组织你的回答,合理使用标题、列表、代码块等元素。",
            “list”: “请以清晰的项目符号列表形式给出你的回答。",
            “bullet”: “请以清晰的要点列表形式给出你的回答。",
            “text”: “” # 无特殊格式要求
        }
    
    def decorate(self, context: PromptContext) -> PromptContext:
        instruction = self.format_instructions.get(self.format_type)
        if instruction:
            # 将格式指令追加到当前的用户输入中
            context.current_text = f“{context.current_text}\n\n{instruction}”
            context.metadata[‘output_format’] = self.format_type
        return context
3.3.4 安全与过滤装饰器
class InputSanitizationDecorator(PromptDecorator):
    """对用户输入进行基本的清洗和过滤。"""
    
    def __init__(self, blocked_phrases: List[str] = None):
        self.blocked_phrases = blocked_phrases or []
    
    def decorate(self, context: PromptContext) -> PromptContext:
        original_text = context.current_text
        # 示例:过滤掉一些明显的攻击性词汇或无关字符
        for phrase in self.blocked_phrases:
            if phrase in original_text:
                # 可以选择替换、标记或停止处理
                context.current_text = original_text.replace(phrase, “[内容已过滤]”)
                context.metadata[‘input_filtered’] = True
                # 如果遇到极端情况,可以设置停止信号
                # context.stop_processing = True
                # break
        return context

3.4 组装与使用:一个完整的例子

现在,我们把所有零件组装起来,看看它如何工作。

def main():
    # 1. 初始化一个上下文
    context = PromptContext(
        raw_input=“对比一下Python和JavaScript在异步编程上的区别”,
        current_text=“对比一下Python和JavaScript在异步编程上的区别”, # 初始时与raw_input相同
        model_name=“gpt-4”,
        max_tokens=1500,
        conversation_history=[ # 模拟一段历史对话
            {“role”: “user”, “content”: “什么是异步编程?”},
            {“role”: “assistant”, “content”: “异步编程是一种...允许任务在等待操作完成时让出控制权的编程模式。”}
        ]
    )
    
    # 2. 创建装饰器链
    chain = DecoratorChain([
        InputSanitizationDecorator(blocked_phrases=[“恶意词汇”]), # 第一关:安全过滤
        SystemInstructionDecorator(instruction=“你是一位资深的编程语言专家,擅长用通俗易懂的语言解释技术概念。”), # 设定角色
        ContextManagementDecorator(max_history_tokens=1000), # 管理历史长度
        OutputFormatDecorator(format_type=“markdown”), # 要求输出Markdown格式
    ])
    
    # 3. 运行装饰器链
    processed_context = chain.run(context)
    
    # 4. 查看处理结果
    print(“处理后的系统指令:”, processed_context.system_message)
    print(“处理后的当前输入:”, processed_context.current_text)
    print(“处理后的历史长度:”, len(processed_context.conversation_history))
    print(“元数据:”, processed_context.metadata)
    
    # 5. 转换为模型所需的格式并调用(模拟)
    messages = processed_context.to_openai_messages()
    print(“\n--- 最终发送给API的消息 ---“)
    for msg in messages:
        print(f“{msg[‘role’].upper()}: {msg[‘content’][:100]}...” if len(msg[‘content’]) > 100 else f“{msg[‘role’].upper()}: {msg[‘content’]}”)
    
    # 这里可以替换为实际的模型调用
    # response = openai_chat_client(messages)
    # print(“AI回复:”, response)

if __name__ == “__main__”:
    main()

运行这段代码,你会看到原始的输入“对比一下Python和JavaScript...”被一步步加工。它先被安全检查,然后被赋予了“编程专家”的系统指令,接着历史对话被检查(在这个例子中历史很短,不会触发裁剪),最后用户问题的末尾被追加了“请使用Markdown格式...”的指令。最终,生成了一个结构清晰、包含角色、历史和格式要求的消息列表,可以直接发送给ChatGPT的API。

4. 高级应用与模式扩展

基础的装饰器链已经很强大了,但在实际复杂应用中,我们还可以进行更多扩展。

4.1 条件装饰器与动态路由

不是所有装饰器都需要在每个请求中运行。我们可以创建 条件装饰器 ,根据上下文内容决定是否执行或如何执行。

class ConditionalDecorator(PromptDecorator):
    """根据上下文元数据或输入内容,决定是否应用子装饰器。"""
    
    def __init__(self, condition_func: Callable[[PromptContext], bool], true_decorator: PromptDecorator, false_decorator: Optional[PromptDecorator] = None):
        self.condition_func = condition_func
        self.true_decorator = true_decorator
        self.false_decorator = false_decorator
    
    def decorate(self, context: PromptContext) -> PromptContext:
        if self.condition_func(context):
            return self.true_decorator(context)
        elif self.false_decorator:
            return self.false_decorator(context)
        else:
            return context

# 使用示例:只有当用户输入是代码相关问题时,才添加“代码专家”角色
def is_code_related(context: PromptContext) -> bool:
    keywords = [‘代码’, ‘编程’, ‘函数’, ‘bug’, ‘Python’, ‘Java’]
    return any(keyword in context.current_text.lower() for keyword in keywords)

code_expert_decorator = SystemInstructionDecorator(“你是一位顶尖的代码审查和调试专家。”)
generic_decorator = SystemInstructionDecorator(“你是一个乐于助人的AI助手。”)

conditional_role = ConditionalDecorator(is_code_related, code_expert_decorator, generic_decorator)
# 将这个conditional_role加入装饰器链即可

4.2 装饰器与工具(Tools/Function Calling)的集成

在AI Agent场景中,大模型需要知道它能调用哪些工具(函数)。我们可以用一个装饰器来动态管理工具描述,并将其注入到Prompt中。

class ToolDescriptionDecorator(PromptDecorator):
    """将可用的工具描述注入到系统指令中。"""
    
    def __init__(self, tools: List[Dict]): # tools格式参考OpenAI Function Calling
        self.tools = tools
    
    def decorate(self, context: PromptContext) -> PromptContext:
        if not self.tools:
            return context
        
        tools_json_str = json.dumps(self.tools, indent=2, ensure_ascii=False)
        tool_instruction = f“\n\n你可以使用以下工具。如果需要使用,请严格按照指定的JSON格式请求。\n可用工具:\n{tools_json_str}”
        
        # 追加到现有的系统指令后面
        if context.system_message:
            context.system_message += tool_instruction
        else:
            context.system_message = f“你是一个可以调用工具的助手。{tool_instruction}”
        
        context.metadata[‘tools_injected’] = True
        context.metadata[‘available_tools’] = [t[‘function’][‘name’] for t in self.tools]
        return context

4.3 元提示(Meta-Prompting)与自我优化

装饰器甚至可以用于实现“元提示”策略,即让模型在回答前先进行一步思考规划。著名的“Chain-of-Thought”(思维链)就可以通过装饰器实现。

class ChainOfThoughtDecorator(PromptDecorator):
    """在用户问题前添加指令,要求模型展示其推理过程。"""
    
    def __init__(self, enable: bool = True):
        self.enable = enable
    
    def decorate(self, context: PromptContext) -> PromptContext:
        if not self.enable:
            return context
        # 在问题前添加要求思考的指令
        cot_prompt = “请按步骤思考,并在最终答案前以‘思考:’为前缀写出你的推理过程。"
        context.current_text = f“{cot_prompt}\n问题:{context.current_text}”
        context.metadata[‘chain_of_thought_enabled’] = True
        return context

5. 实战心得与避坑指南

在实际项目中应用Prompt装饰器模式一年多,我积累了一些宝贵的经验和教训。

5.1 装饰器的顺序至关重要

装饰器链是顺序执行的,顺序不同,结果可能天差地别。

  • 安全过滤应最早 InputSanitizationDecorator 必须放在最前面,防止恶意输入污染后续处理逻辑或元数据。
  • 上下文管理宜早不宜晚 ContextManagementDecorator 应该在添加新的系统指令或用户输入 之前 运行,这样它裁剪的是“旧历史”,不会误伤本轮对话刚添加的、重要的指令。
  • 角色设定在格式约束前 :先通过 SystemInstructionDecorator 告诉模型“你是谁”,再通过 OutputFormatDecorator 告诉它“用什么格式回答”。如果反过来,格式指令可能会被模型误认为是角色描述的一部分。
  • 经验法则 :遵循“数据清洗 -> 上下文准备 -> 角色与约束设定 -> 格式与优化”的大致顺序。

5.2 谨慎估算Token与处理超长内容

“Context Overflow”是线上事故的常客。

  • 必须使用官方Tokenizer :千万不要用 len(text) // 4 这种粗糙估计上生产环境。对于OpenAI模型,务必使用 tiktoken 。对于本地模型,使用其对应的 transformers 分词器。
  • 为系统指令和格式预留空间 :你的装饰器添加的指令本身也占Token。在设置 max_history_tokens 时,要从模型的总上下文窗口(如GPT-4的128K)中,减去预估的用户本次输入长度、系统指令长度、以及你希望模型生成的最大回复长度。
  • 设计优雅的降级策略 :当历史必须被裁剪时,直接丢弃是最简单的,但可能丢失重要信息。更优的策略是:
    1. 总结摘要 :调用一次大模型(用小模型、低成本模式),将过长的旧历史总结成一段简短的摘要,然后替换掉原来的大段历史。
    2. 重要性排序 :如果历史消息有重要性标记(例如用户手动标记、或根据消息类型自动标记),优先丢弃重要性低的消息。
    3. 分片处理 :对于超长的单次输入(如一篇长文档),可以先用装饰器将其切分成块,分别总结或提取关键信息,再将摘要作为上下文。

5.3 装饰器的可测试性与调试

装饰器模式的一个巨大优势是易于单元测试。

  • 为每个装饰器编写单元测试 :由于每个装饰器功能单一,输入输出明确(都是 PromptContext ),可以很容易地构造测试用例,验证其在各种边界条件下的行为。
  • 记录详细的元数据 :如上面的示例,在每个装饰器中,都将关键操作记录到 context.metadata 中。这相当于一个 审计日志 ,在调试时非常有用。你可以看到哪个装饰器修改了什么,触发了什么条件。
  • 实现一个“调试模式”装饰器 :它可以被插入到链的任何位置,将当前上下文的状态(如current_text的前N个字符、metadata等)打印到日志或控制台,帮助你可视化Prompt的演变过程。

5.4 性能考量

装饰器链会增加额外的计算开销,尤其是在每个请求都运行大量复杂装饰器时。

  • 避免在装饰器内进行重型IO操作 :比如网络请求、复杂的数据库查询。如果必须,考虑使用缓存或异步方式。
  • 有些装饰器可以预先计算 :例如,如果系统指令是固定的, SystemInstructionDecorator 的结果可以被缓存,而不是每次重新拼接字符串。
  • 链的长度要合理 :不是功能越多越好。为不同的业务场景(如客服、代码生成、内容创作)配置不同的、精简的装饰器链。

6. 与其他技术栈的融合

Prompt装饰器是一种设计模式,可以无缝集成到现有的AI应用开发生态中。

  • 与LangChain结合 :你可以将 DecoratorChain run 方法包装成一个LangChain的 Runnable ,然后将其与 LCEL 组合。或者,直接将每个装饰器实现为LangChain的 RunnableLambda ,利用其强大的流式、批量处理能力。
  • 与Spring AI结合 :在Spring AI中,你可以创建一个自定义的 PromptTemplate ChatClient 的装饰器( Decorator 接口),在 call() 方法内部实现你的装饰器链逻辑,对传入的 Prompt 进行加工,然后再调用真正的模型。
  • 配置化与动态加载 :将装饰器链的配置(包括装饰器类型、顺序、参数)放在外部配置文件(如YAML、JSON)或数据库中。这样,你可以动态调整Prompt策略,无需重启服务,实现热更新。

最后一点体会 :引入Prompt装饰器模式后,最直观的感受是代码的“脏乱差”消失了。以前散落在各处的字符串模板和条件判断,现在被收拢到一个个职责单一的装饰器类中。新同事接手项目,要加一个“所有回答都附带免责声明”的需求,我不再需要去搜索所有调用模型的地方,而是只需要在对应的装饰器链配置里添加一个 DisclaimerDecorator 。这种模块化、声明式的管理方式,让复杂AI应用的迭代和维护变得可控和愉悦。它可能不是银弹,但绝对是应对日益复杂的Prompt工程挑战的一把利器。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐