基于Function Calling为AI编程助手注入幽默感:从Prompt工程到Skill开发实战 1. 项目缘起当严肃的AI编程遇上“抽象”的丁真最近在折腾AI编程助手特别是那些能集成到IDE里的智能代码补全工具比如基于Codex或者Claude的Skill。用久了总觉得它们太“正经”了——回答一板一眼代码建议精准但冰冷长时间对着屏幕氛围难免有些沉闷。就在琢磨怎么给枯燥的编码过程加点乐子的时候一个有点“抽象”的想法冒了出来能不能给这些AI编程助手装上一个“丁真语录”的Skill这里的“丁真语录”指的并不是任何具体人物的言论而是一种网络文化现象的代称它代表着一种出其不意、带有独特幽默感和生活气息的文本风格。而“VibeCoding”可以理解为一种注重编码氛围和体验的编程方式它强调开发过程本身的心流状态和愉悦感。我的目标就是尝试将这种带有轻松、幽默特质的文本生成能力以Skill技能/插件的形式注入到AI编程助手中。让它不只是在代码层面提供帮助还能在开发者需要放松、或者遇到棘手bug感到烦躁时用一点无伤大雅的“笑料”调节一下气氛实现所谓的“VibeCoding”——让编程的“氛围”更轻松一些。这听起来像是个不务正业的“玩具项目”但深入想想其实触及了几个挺有意思的点一是AI工具的功能边界与个性化扩展二是如何将非结构化的、充满网络语境的文化元素转化为机器可理解、可调用的“技能”三是在实用工具中融入人文与幽默感的尝试。它考验的不是多高深的算法而是对现有AI工具链的理解、巧妙的工程实现以及那么一点点“玩”的心态。2. 核心思路拆解从“梗”到可执行的Skill要实现这个想法不能停留在空想。我们需要把“给AI装上丁真语录Skill”这个模糊的目标拆解成一系列可执行的技术步骤。整个流程的核心在于我们并非要训练一个全新的、会讲笑话的AI大模型而是利用现有大模型的对话和文本生成能力通过“技能”这个中间层去引导和约束它的输出使其符合我们想要的风格。2.1 目标AI平台的选定与Skill机制理解首先得确定我们的“宿主”是谁。从相关热词来看Claude、Codex通常通过OpenAI API或GitHub Copilot体现以及各类AI Agent框架是主要候选。它们都支持通过Skill或类似插件机制扩展功能。Claude Claude Code SkillAnthropic的Claude模型特别是通过其API或Slack等集成环境支持用户自定义一些指令集或上下文这可以视作一种简单的Skill。它的优势在于对话能力强理解上下文细腻非常适合进行风格化文本生成。Codex / GitHub Copilot这是最直接的编程场景。Copilot本身可以通过类似“注释提示”的方式来影响其补全但更灵活的扩展可能需要借助其API或第三方插件如某些编辑器插件通过预设的“prompt工程”来模拟一个Skill的行为。AI Agent框架如Spring AI、自定义Agent这是最强大和灵活的方式。像Spring AI这类框架允许你以编程方式定义复杂的Agent工作流其中一个环节就可以是一个专门负责生成“趣味回复”的Skill模块。Hermes Skill、Ponytail Skill等热词也指向了特定平台或社区的Skill开发生态。我个人的选择与理由为了最大化控制力和展示效果我决定基于一个通用的、支持Function Calling或Tool Calling的大模型API例如OpenAI GPT-4或Claude 3来构建一个简易的AI Agent并将“丁真语录生成器”作为其内置的一个Tool即Skill。这样既能清晰展示Skill的集成逻辑又不受特定封闭平台如某些已封装好的AI聊天产品的限制。我们选用的核心模型需要具备优秀的指令跟随和风格模仿能力。2.2 “丁真语录”语料库的构建与抽象化处理这是项目的灵魂也是最需要谨慎处理的部分。我们需要的不是一个固定的列表而是一个能够让AI学会这种风格的本质特征。风格抽象而非内容复制我们绝不复制、搬运任何特定的网络文本内容。而是通过分析总结出这种风格在语言上的特征例如频繁使用特定的语气词和感叹词句式结构上的某种“意外”转折比如前半句很正经后半句突然接地气比喻和类比的对象常常来源于日常生活或自然景观词汇选择在书面语和口语化表达间跳跃等。构建“风格描述”与“示例模板”我们将创建一份“风格指南”作为核心Prompt。例如风格定义生成一种轻松、幽默、带有质朴生活气息和一点点无厘头转折的短句。避免复杂词汇和长句善用“嘛”、“呀”、“咯”等语气词比喻常涉及“马儿”、“雪山”、“珍珠”、“电子烟”此处仅为举例说明一种网络梗的常见元素实际应用中将使用更通用、安全的比喻如“像刚充电的机器人”、“代码像草原上的野马”等意象。句子通常包含一个看似深刻的观察但结论却意外地简单或朴实。生成示例基于风格描述我们可以让AI自己生成一批符合该风格的例句作为后续学习的参考样本。这个过程是AI创造内容而非我们输入特定内容。例如AI可能生成“调试代码就像在草原上找一匹特定的马你以为它跑了很远其实它就在你眼皮子底下吃草。”“这个bug嘛它不想让你找到的时候就像融进奶茶里的糖你看不见但你知道它就在那儿。”2.3 Skill的两种实现路径Prompt工程与函数调用有了风格定义接下来就是如何让AI掌握这个“技能”。2.3.1 Prompt Engineering提示词工程路径这是最简单直接的“软Skill”。我们设计一个系统级的提示词System Prompt将其注入到与AI对话的上下文中。你是一个AI编程助手主要帮助用户解决代码问题。此外你还有一个特殊技能当用户感到疲惫、烦躁或单纯想放松时你可以应要求生成一种特定风格的、轻松幽默的短句来调节气氛。这种风格的特点是[此处插入上述“风格描述”]。 当用户输入中包含“讲个笑话”、“来点乐子”、“丁真模式”等关键词时请优先使用这个技能生成一句符合上述风格的话。请注意你的主要身份仍是编程助手此技能仅作为调剂。优点实现简单无需修改代码架构在任何支持自定义系统提示的AI对话界面如OpenAI Playground, Claude Console 甚至一些ChatGPT自定义指令中都能立即生效。缺点技能触发不够精确容易和正常编程问答混淆技能是“被动”的无法被AI主动、智能地调用。2.3.2 Function/Tool Calling函数调用路径这是更工程化、更接近真正“Skill”或“Plugin”的方式。我们将“生成趣味语录”定义为一个标准的工具Tool让AI在认为合适的时候可以主动提议调用或者由用户明确指令调用。我们以OpenAI的Function Calling为例# 定义“生成趣味语录”这个工具 tools [ { type: function, function: { name: generate_funny_quote, description: 当检测到用户情绪需要调节、或用户明确要求时生成一句轻松幽默、带有生活气息的短句用于缓解编程疲劳。, parameters: { type: object, properties: { context: { type: string, description: 当前的编程上下文或用户情绪线索例如‘遇到复杂bug’‘代码编译通过’‘感到疲惫’等。 } }, required: [context] } } } ] # 在对话中AI可能会分析用户消息“唉这个循环怎么也调不对头大了。” # AI的响应会包含一个建议调用此函数的请求。 # 然后我们的程序需要执行这个函数其内部逻辑就是根据传入的context结合我们预设的“风格指南”Prompt调用一次AI生成内容。 def generate_funny_quote(context): # 构建一个专门用于生成语录的Prompt generation_prompt f 请根据以下场景生成一句轻松幽默、带有生活气息的短句来调节气氛。 场景{context} 风格要求[此处插入详细的风格描述]。 输出仅一句话。 # 调用AI生成接口例如使用另一个更便宜的模型或者同一模型的另一个调用 quote call_ai_completion(generation_prompt) return quote优点技能边界清晰与核心的编程问答逻辑解耦AI可以主动判断何时使用该技能更智能符合主流的AI Agent开发范式易于集成和扩展。缺点实现复杂度较高需要编写实际的代码来处理函数调用和响应。我的实现选择为了更贴近“Skill”的概念和展示集成的完整性我采用函数调用路径。这能更好地模拟在VSCode插件或独立AI Agent中一个功能模块是如何被添加和工作的。3. 实战开发构建一个简易的“氛围编程”AI Agent现在让我们动手基于Python和OpenAI API或其他兼容Function Calling的API构建一个具备“趣味语录”Skill的简易AI编程助手原型。我们将这个项目命名为“VibeCoder”。3.1 环境准备与依赖安装首先确保你有一个Python环境3.8和一个可用的OpenAI API密钥或其他大模型平台的API密钥如DeepSeek、智谱AI等需支持Function Calling。# 创建项目目录并进入 mkdir vibe_coder cd vibe_coder # 创建虚拟环境可选但推荐 python -m venv venv # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate # 安装核心依赖 pip install openai python-dotenv创建一个.env文件来安全地存储你的API密钥OPENAI_API_KEY你的_api_密钥_在这里 MODEL_NAMEgpt-4o-mini # 或 gpt-3.5-turbo, claude-3-haiku-20240307 等需对应库支持3.2 核心Agent与Skill逻辑编写我们创建一个vibe_coder.py文件。import os import json from openai import OpenAI from dotenv import load_dotenv # 加载环境变量 load_dotenv() class VibeCoderAgent: def __init__(self): self.client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.model os.getenv(MODEL_NAME, gpt-4o-mini) # 定义我们的工具Skills列表 self.tools [ { type: function, function: { name: generate_funny_quote, description: 当用户表达出挫折、疲惫、无聊情绪或明确要求轻松一下时调用此函数生成一句幽默、生活化的短句来调节编程氛围。, parameters: { type: object, properties: { user_mood_context: { type: string, description: 从用户当前消息中提炼出的情绪或场景关键词如‘调试失败’、‘代码冗长’、‘庆祝成功’、‘需要提神’。 } }, required: [user_mood_context] } } } # 未来可以在这里添加更多Skill例如code_review, explain_concept, search_web等 ] # 系统提示定义Agent的主要角色和技能边界 self.system_prompt 你是一个名为VibeCoder的AI编程助手性格友好且略带幽默感。你的主要任务是帮助用户解决编程问题编写、解释、调试代码。 你拥有一个特殊技能generate_funny_quote可以在适当的时候用来活跃气氛缓解用户的疲劳感。请根据对话上下文智能判断是否需要使用该技能。 你的所有代码回答应当专业且准确趣味性回答应当简短且不影响主要的技术帮助。 def _call_quote_skill(self, mood_context): 内部函数真正执行‘生成趣味语录’技能的逻辑 # 这里是技能的核心Prompt定义了“风格” style_guide 请生成一句轻松幽默的短句。要求 1. 语言口语化带点俏皮可以使用“嘛”、“呀”、“呢”等语气词。 2. 比喻要贴近日常生活或自然事物比如可以把代码比作“拼图”、“乐高”、“做菜”把Bug比作“捉迷藏的小孩”、“衣服上的线头”。 3. 句子结构可以有一个小小的转折或意外的结论。 4. 绝对不要涉及任何真人真事、网络热点事件或具有特定指向性的梗。 5. 回应需要贴合当前场景{context} 输出仅一句话不要加引号。 prompt style_guide.format(contextmood_context) try: response self.client.chat.completions.create( modelself.model, # 也可以为这个技能专门指定一个更轻量的模型 messages[{role: user, content: prompt}], max_tokens50, temperature0.9, # 温度调高增加创造性 ) return response.choices[0].message.content.strip() except Exception as e: return f技能冷却中... 其实我想说代码就像生活偶尔出点小差错才真实嘛。 def chat(self, user_input): 主聊天循环 messages [ {role: system, content: self.system_prompt}, {role: user, content: user_input} ] # 第一步让AI判断是否需要调用工具以及调用哪个工具 response self.client.chat.completions.create( modelself.model, messagesmessages, toolsself.tools, tool_choiceauto, # 由模型决定是否调用工具 ) response_message response.choices[0].message tool_calls response_message.tool_calls # 第二步如果有工具调用则执行对应的函数 if tool_calls: available_functions { generate_funny_quote: self._call_quote_skill, } messages.append(response_message) # 将包含工具调用请求的AI回复加入历史 for tool_call in tool_calls: function_name tool_call.function.name function_to_call available_functions[function_name] function_args json.loads(tool_call.function.arguments) # 执行技能函数 function_response function_to_call(**function_args) # 将技能执行结果作为“工具”的回复追加给AI让它来组织最终的回答 messages.append({ tool_call_id: tool_call.id, role: tool, name: function_name, content: function_response, }) # 第三步AI根据工具执行结果生成面向用户的最终回复 second_response self.client.chat.completions.create( modelself.model, messagesmessages, ) final_reply second_response.choices[0].message.content else: # 如果没有工具调用直接使用第一次的回复 final_reply response_message.content return final_reply # 简易的交互循环 if __name__ __main__: agent VibeCoderAgent() print(VibeCoder 已上线输入你的编程问题或随便聊聊输入‘退出’结束。) while True: try: user_input input(\n你: ) if user_input.lower() in [退出, exit, quit]: break reply agent.chat(user_input) print(f\nVibeCoder: {reply}) except KeyboardInterrupt: break print(再见代码写累了记得望望窗外)3.3 代码详解与关键设计抉择双阶段调用设计这是Function Calling的标准流程。第一阶段AI根据对话历史和工具定义判断是否需要调用generate_funny_quote。如果需要它不会直接生成语录而是返回一个“函数调用请求”。第二阶段我们的程序捕获这个请求执行本地函数_call_quote_skill该函数内部再调用一次AI生成符合风格的句子然后将结果返回给AI。第三阶段AI将技能生成的结果和之前的对话历史结合组织成一句自然的回复给用户。这样做的好处是最终回复的语调和整合由主AI模型完成显得更连贯。技能隔离_call_quote_skill函数是技能的独立实现。它有自己的Promptstyle_guide和参数如更高的temperature。这意味着我们可以独立优化这个技能而不会影响主Agent的编程问答性能。未来甚至可以把这个技能替换成另一个微调的小模型进一步降低成本。安全与风格把控在style_guide中我明确加入了“绝对不要涉及任何真人真事、网络热点事件或具有特定指向性的梗”的指令。这是至关重要的安全阀。我们的目标是创造一种通用的、无害的、轻松幽默的风格而不是复现任何具体的网络模因。所有比喻都转向了更通用的“拼图”、“乐高”、“做菜”、“捉迷藏”等意象。触发逻辑技能的触发依赖于主AI模型对tool_choiceauto的判断。我们在工具描述description里写道“当用户表达出挫折、疲惫、无聊情绪或明确要求轻松一下时调用”。AI会基于对用户消息语义的理解来决定是否调用。用户也可以直接说“讲个笑话吧”、“来点轻松的”这样触发的概率会更高。4. 效果实测、调优与“Vibe”的边界写完代码跑起来试试看。以下是一些模拟对话的实测结果用户这个递归函数老是栈溢出心态崩了。VibeCoder栈溢出就像叠罗汉叠太高了总得有人先下来歇歇。别急我们先看看基线条件是不是没拦住它。分析AI识别出“心态崩了”的负面情绪调用了generate_funny_quote技能生成了关于“叠罗汉”的比喻并将结果与专业的建议“看看基线条件”自然地结合在了一起。用户终于把那个复杂的SQL查询优化好了VibeCoder搞定这感觉就像在乱糟糟的抽屉里一下子找到了那根对的数据线浑身舒畅下次遇到复杂的JOIN还可以试试用CTE分段处理。分析AI识别出积极的成就情绪也选择了调用技能来“庆祝”生成了“找数据线”的比喻并顺势提供了进一步的专业建议。用户Python里怎么用列表推导式VibeCoder列表推导式是Python的语法糖用一行代码就能生成列表。基本格式是 [expression for item in iterable if condition]。比如要生成一个0-9的平方列表可以写 [x**2 for x in range(10)]。分析这是一个纯粹的技术问题没有情绪线索。AI没有调用趣味技能直接给出了专业解答。这说明技能触发机制工作正常没有过度干扰核心功能。4.1 如何微调技能效果与触发灵敏度实测中可能会发现两个问题一是技能触发的频率不合适太多或太少二是生成的句子风格不够“对味”。调整触发频率修改工具描述description。如果想让它更活跃可以改为“在对话中适时地、较为频繁地使用此技能来保持轻松氛围”。如果想更克制可以改为“仅在用户明确表达强烈负面情绪或直接要求时使用此技能”。更精细的控制可以通过在system_prompt中强调主次身份来实现。优化生成风格修改_call_quote_skill函数中的style_guide。这是调优的重点。你可以增加示例在Prompt里加入2-3条AI自己生成的、你认为风格完美的例句作为“Few-shot learning”的样本。调整比喻库明确列举你希望出现的比喻类型如“可以使用与烹饪、园艺、音乐、运动、天气相关的比喻”。控制长度和结构明确要求“句子长度在15字以内”或“采用‘事情A就像事情B’的句式”。4.2 “氛围编程”的边界与注意事项给AI加入幽默感是一把双刃剑在追求“Vibe”的同时必须明确边界。注意技能永远应是辅助与调剂不能喧宾夺主。一个编程助手核心价值是准确、高效地解决代码问题。趣味性内容必须简短、适时、且不能包含任何可能分散注意力或引起不适的信息。场景错配风险当用户正在处理紧急线上故障或进行严肃的技术讨论时不合时宜的幽默会非常恼人。我们的技能描述和系统提示中必须强调“根据上下文智能判断”。风格一致性挑战网络流行语迭代极快今天的“梗”明天可能就过时甚至引发误解。因此我们必须像本项目所做的那样剥离具体梗抽象其幽默逻辑。我们创造的是“一种带有生活气息的、意外转折的幽默风格”而不是“丁真语录复读机”。这样技能的生命力会更持久也更安全。计算成本考量每次调用技能意味着至少两次API调用一次判断一次生成。对于高频使用的编程助手这会增加成本。解决方案可以是为技能调用设置一个冷却时间或者为趣味生成使用成本更低的轻量级模型。用户偏好差异幽默非常主观。你认为有趣的别人可能觉得无聊或尴尬。理想的实现应该允许用户自定义风格强度甚至开关这个技能。这可以通过在Agent初始化时加载用户配置来实现。5. 从原型到产品集成与扩展思路我们这个命令行原型证明了概念的可行性。但要实现真正的“VibeCoding”体验需要将其集成到开发者日常的工作流中。5.1 集成到代码编辑器如VSCode这是最直接的场景。可以开发一个VSCode插件插件核心就是这个VibeCoderAgent类。触发方式快捷键用户按下CtrlShiftP或自定义快捷键输入“Good Vibe”或“轻松一下”插件调用技能并弹出一个信息提示框。状态栏在编辑器状态栏添加一个图标点击即可生成一句趣味语录。智能感知插件可以分析当前文件的活动如连续编码时间、调试器启动停止、错误面板信息在特定事件如清除所有错误后自动在右下角弹出“温馨语录”。技术实现使用VSCode的Extension API用Node.js或Python通过PYTHONPATH调用实现后台服务。核心的AI交互逻辑可以封装为一个独立的服务进程。5.2 作为AI Agent的标准化Skill模块在更复杂的AI Agent系统中我们的“趣味语录生成器”可以被打包成一个标准的Skill模块。标准化接口定义清晰的输入context: string、输出quote: string和元数据name,description,version。技能市场像skill creator、skill推荐这些热词暗示的未来可能会有AI Skill的应用商店。你可以将这个Skill打包发布其他开发者可以一键安装到他们的编程Agent中。组合使用这个Skill可以和其他Skill组合。例如一个“代码审查”Skill在指出一段低效代码后可以链式调用“趣味语录”Skill来缓和语气“这里的循环可以优化不然它跑起来就像拖着行李箱赶地铁有点费劲哦。”5.3 个性化与社区化演进一个技能要想有生命力需要进化。用户风格训练允许用户对生成的语录点赞/点踩。利用这些反馈数据可以微调技能内部的生成模型使其更符合该用户的幽默口味。主题包扩展“趣味语录”可以不止一种风格。可以开发“科幻风”、“武侠风”、“哲学沉思风”等不同的风格包让用户自由切换。skill语言学习这个热词甚至启发我们可以做一个“用趣味例句学编程术语”的衍生技能。社区贡献建立一个安全的“比喻库”和“句式模板”库允许社区在符合安全规范的前提下贡献创意不断丰富技能的“语料”但核心生成逻辑仍由AI把控避免直接引入未过滤的UGC内容。回过头看“给AI装上「丁真语录」skill”这个项目其价值远不止于博人一笑。它是一个绝佳的练手项目让你亲身体验从创意发想到工程落地的全过程如何将一个模糊的文化概念抽象为机器可理解的指令Prompt工程如何利用现代AI的Function Calling机制构建可扩展的技能系统如何在实用工具中寻找严肃与趣味之间的平衡点。它最终实现的不是某个具体梗的搬运而是一种让冷冰冰的人机交互多一点点温度、一点点意外之喜的可能性。这或许就是“VibeCoding”想追求的那种更愉悦、更人性化的编码体验吧。