多轮约束下的代码编写:基于智谱AI的智能开发实践 作者介绍作者王嘉玙璠女西安工程大学电子信息学院,2025级研究生研究方向3D点云、零样本电子邮箱bayoulove1gmail.com作者李逸超男西安工程大学电子信息学院2025级研究生张宏伟人工智能课题组研究方向机器视觉与人工智能联系邮箱2317314922qq.com前言:你有没有遇到过这样的情况用AI写代码时需求一变AI就“失忆”了明明之前说好的逻辑改了几轮后AI竟然忘了最基础的要求本文分享一种多轮约束代码生成框架基于智谱AI GLM-4系列模型解决传统AI代码生成中的需求变更频繁和上下文丢失两大痛点。一、痛点分析传统AI代码生成的局限在实际开发中我们常常遇到需求变更频繁AI难以同步更新生成结果偏离预期上下文丢失多轮修改后AI忘记早期约束重复劳动每次微调都可能重写大量代码约束冲突后期约束破坏前期架构设计这些问题严重影响了开发效率和代码质量。二、解决方案多轮约束代码生成框架我们提出的框架核心逻辑如下用户输入约束1 → AI生成初始代码用户输入约束2 → AI整合约束12生成优化代码用户输入约束3 → AI整合所有约束生成完整代码关键能力累积记忆永久保留所有历史约束不遗漏任何细节全量生成每轮输出完整可运行代码避免逻辑断层版本管理支持约束的增删改查可回溯任意历史状态三、技术架构模块化设计系统由以下模块组成模块功能CLI交互界面提供命令式操作环境约束管理模块持久化存储与逻辑校验对话历史维护动态管理messages数组智谱API调用集成GLM-4系列模型代码提取导出自动保存为物理文件四、实现原理基于消息数组的状态维护我们维护一个messages数组包含系统提示词、用户约束和助手响应[{role:system,content:你是Python专家...},{role:user,content:[约束1] 实现基础KNN},{role:assistant,content:[代码V1]},{role:user,content:[约束2] 添加标准化处理}]每次请求都发送完整的历史约束序列让模型具备全局视野确保新代码不破坏旧约束。五、实战案例鸢尾花KNN分类器我们通过7轮约束AI自动完成了从数据加载到模型部署的完整代码使用sklearn鸢尾花数据集实现基础KNN按7:3划分训练集与测试集对特征数据标准化使用5折交叉验证寻找最优K值输出分类报告与混淆矩阵使用joblib持久化模型创建预测函数✅AI产出的代码逻辑严密符合工业级标准。六、核心代码实现ConstraintCodeGenerator类pythonclassConstraintCodeGenerator:def__init__(self):self.constraints[]self.history[]defadd_constraint(self,text):self.constraints.append(text)returnself.refresh_code()defrefresh_code(self):promptformat_prompt(self.constraints)returncall_zhipu_api(prompt)状态解耦约束与对话历史独立存储全量刷新每次基于当前所有约束重新生成API抽象可无缝切换GLM-4-Flash或GLM-4.7模型七、交互指令示例指令功能add 使用Pandas读取CSV添加新约束list查看当前约束remove 1删除约束1modify 2修改约束2export导出最终代码八、API优化建议参数推荐值说明temperature0.1~0.3确保确定性top_p0.7平衡多样性与准确度max_tokens4096防止长代码截断streamFalse便于全量解析模型选择glm-4-flash快速迭代适合简单逻辑glm-4.7复杂架构设计增强指令遵循能力九、实验结果与问题分析Q1添加更多约束后生成时间是否变长✅会变长但在GLM-4-Flash的131K上下文中几百到几千tokens的增量影响不大。主要耗时在API调用和生成过程。Q2重复添加相同约束会发生什么⚠️约束列表会出现重复项代码变化不大但会浪费token建议避免重复添加。Q3代码是否只是简单变长❌不是。代码结构会优化逻辑更清晰功能更完善而非简单堆砌。Q4如何用它修改代码中的错误✅不能直接添加错误信息而是通过新增约束让AI分析错误并生成正确代码。十、完整参考代码import os import re from datetime import datetime from openai import OpenAI # 配置 # 请在这里替换成您的API Key YOUR_API_KEY 824b44b35fc34b5390e568cdedce281f.i45FXdEp6dMZPBa2 # 初始化客户端 client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://open.bigmodel.cn/api/paas/v4/ ) # 多轮约束代码生成器 class MultiTurnCodeGenerator: def __init__(self): self.constraints [] # 存储所有约束 self.conversation_history [] # 存储对话历史 self.current_code # 初始化系统提示 self.conversation_history.append({ role: system, content: 你是一个专业的Python开发工程师。用户会逐步提出代码约束条件你需要 1. 记住并遵守所有历史提出的约束 2. 每次生成完整的代码不要只给修改部分 3. 代码必须包含完整的注释、文档字符串和类型注解 4. 包含适当的错误处理 5. 每次回复格式先列出所有当前约束然后给出完整的代码 }) def add_constraint(self, constraint): 添加新约束并生成代码 if not constraint.strip(): return False, 约束不能为空 # 添加约束 self.constraints.append(constraint) # 构建用户消息 constraints_text \n.join([f{i1}. {c} for i, c in enumerate(self.constraints)]) user_message f请根据以下所有约束条件生成Python代码 当前约束列表 {constraints_text} 请生成完整、可运行的代码。 self.conversation_history.append({role: user, content: user_message}) try: response client.chat.completions.create( modelglm-4-flash, messagesself.conversation_history, temperature0.5, max_tokens4096 ) assistant_reply response.choices[0].message.content self.conversation_history.append({role: assistant, content: assistant_reply}) # 提取代码 self.current_code self._extract_code(assistant_reply) return True, assistant_reply except Exception as e: # 失败时移除刚添加的约束和消息 self.constraints.pop() self.conversation_history.pop() return False, fAPI调用失败: {e} def _extract_code(self, response): 从回复中提取代码 # 匹配Python代码块 patterns [ rpython\n(.*?)\n, r\n(.*?)\n, rpython(.*?) ] for pattern in patterns: match re.search(pattern, response, re.DOTALL) if match: return match.group(1).strip() return response def remove_constraint(self, index): 删除指定约束 if 1 index len(self.constraints): removed self.constraints.pop(index - 1) print(f已删除约束 {index}: {removed}) # 重新生成代码 if self.constraints: self._regenerate() else: self.current_code return True else: print(f约束编号 {index} 无效) return False def _regenerate(self): 基于当前约束重新生成代码 if not self.constraints: return # 重置对话历史保留系统提示 self.conversation_history [self.conversation_history[0]] # 重新生成 constraints_text \n.join([f{i1}. {c} for i, c in enumerate(self.constraints)]) user_message f请根据以下所有约束条件生成代码\n{constraints_text} self.conversation_history.append({role: user, content: user_message}) try: response client.chat.completions.create( modelglm-4-flash, messagesself.conversation_history, temperature0.5, max_tokens4096 ) assistant_reply response.choices[0].message.content self.conversation_history.append({role: assistant, content: assistant_reply}) self.current_code self._extract_code(assistant_reply) except Exception as e: print(f重新生成失败: {e}) def list_constraints(self): 列出所有约束 if not self.constraints: print(暂无约束条件) else: print(\n当前约束列表) for i, c in enumerate(self.constraints, 1): print(f {i}. {c}) def show_code(self): 显示当前代码 if self.current_code: print(\n * 60) print(当前代码) print( * 60) print(self.current_code) print( * 60) else: print(暂无代码请先添加约束) def export_code(self, filenameNone): 导出代码到文件 if not self.current_code: print(没有可导出的代码) return if filename is None: timestamp datetime.now().strftime(%Y%m%d_%H%M%S) filename fgenerated_code_{timestamp}.py # 添加文件头 header f 自动生成的代码 生成时间: {datetime.now().strftime(%Y-%m-%d %H:%M:%S)} 约束条件数量: {len(self.constraints)} 约束列表: {chr(10).join([f- {c} for c in self.constraints])} with open(filename, w, encodingutf-8) as f: f.write(header self.current_code) print(f✅ 代码已导出到: {filename}) return filename # 交互式界面 def print_help(): 打印帮助信息 print( 命令说明 add 约束 - 添加新的约束条件 list - 列出所有约束 show - 显示当前生成的代码 remove 编号 - 删除指定约束 export [文件名] - 导出代码到文件 clear - 清空所有约束 help - 显示帮助 exit - 退出程序 示例 add 函数名使用蛇形命名法 add 添加完整的文档字符串 remove 2 export my_code.py ) def main(): 主程序 print(\n * 70) print( 多轮约束代码生成器) print( * 70) print(\n您可以逐步添加约束AI会基于所有历史约束生成代码) print(输入 help 查看命令说明) print( * 70) generator MultiTurnCodeGenerator() round_num 1 while True: try: user_input input(f\n[{round_num}] ).strip() if not user_input: continue # 解析命令 parts user_input.split(maxsplit1) command parts[0].lower() args parts[1] if len(parts) 1 else # 处理命令 if command exit: print(\n 再见) break elif command help: print_help() elif command add: if not args: print(❌ 请提供约束内容例如: add 函数名使用蛇形命名法) else: print(f⏳ 正在添加约束: {args}) success, result generator.add_constraint(args) if success: print(f\n✅ 约束已添加当前共有 {len(generator.constraints)} 条约束) generator.show_code() round_num 1 else: print(f❌ {result}) elif command list: generator.list_constraints() elif command show: generator.show_code() elif command remove: if not args: print(❌ 请提供约束编号例如: remove 2) else: try: index int(args) generator.remove_constraint(index) if generator.current_code: generator.show_code() round_num len(generator.constraints) 1 except ValueError: print(❌ 请输入有效的数字编号) elif command export: filename args if args else None generator.export_code(filename) elif command clear: confirm input(⚠️ 确认清空所有约束和代码(y/n): ) if confirm.lower() y: generator.constraints [] generator.conversation_history [generator.conversation_history[0]] generator.current_code round_num 1 print(✅ 已清空所有约束) else: print(f❌ 未知命令: {command}) print(输入 help 查看可用命令) except KeyboardInterrupt: print(\n\n 再见) break except Exception as e: print(f❌ 错误: {e}) # 快速演示 def demo_mode(): 演示模式自动演示多轮约束编程 print(\n * 70) print( 演示模式 - 多轮约束编程示例) print( * 70) generator MultiTurnCodelistGenerator() # 示例约束序列 demo_constraints [ 写一个函数判断一个整数是否为质数, 函数名使用 is_prime使用蛇形命名法, 添加完整的文档字符串说明函数功能、参数和返回值, 使用类型注解Type Hints, 添加错误处理如果输入不是整数则抛出 TypeError, 性能优化只需要检查到平方根即可 ] print(\n将依次添加以下约束) for i, c in enumerate(demo_constraints, 1): print(f {i}. {c}) input(\n按 Enter 开始演示...) for i, constraint in enumerate(demo_constraints, 1): print(f\n{*60}) print(f第 {i} 轮约束: {constraint}) print(*60) success, result generator.add_constraint(constraint) if success: print(f\n✅ 约束已添加当前共有 {i} 条约束) generator.show_code() else: print(f❌ 失败:list {result}) if i len(demo_constraints): input(\n按 Enter 继续下一轮...) print(\n * 70) print( 演示完成) print( * 70) # 导出最终代码 generator.export_code(demo_output1.py) # 程序入口 list if __name__ __main__: print(\n请选择模式) print( 1. 交互模式逐步添加约束) print( 2. 演示模式自动演示示例) choice input(\n请输入选择 (1/2): ).strip() if choice 2: demo_mode() else: main()