当前位置: 首页 > news >正文

多轮约束下的代码编写:基于智谱AI的智能开发实践

作者介绍

作者:王嘉玙璠,女,西安工程大学电子信息学院,2025级研究生

研究方向:3D点云、零样本

电子邮箱:bayoulove1@gmail.com

作者:李逸超,男,西安工程大学电子信息学院,2025级研究生张宏伟人工智能课题组

研究方向:机器视觉与人工智能

联系邮箱:2317314922@qq.com

前言:

你有没有遇到过这样的情况:用AI写代码时,需求一变,AI就“失忆”了?明明之前说好的逻辑,改了几轮后,AI竟然忘了最基础的要求?

本文分享一种多轮约束代码生成框架,基于智谱AI GLM-4系列模型,解决传统AI代码生成中的需求变更频繁上下文丢失两大痛点。

一、痛点分析:传统AI代码生成的局限

在实际开发中,我们常常遇到:

  • 需求变更频繁:AI难以同步更新,生成结果偏离预期
  • 上下文丢失:多轮修改后,AI忘记早期约束
  • 重复劳动:每次微调都可能重写大量代码
  • 约束冲突:后期约束破坏前期架构设计

这些问题严重影响了开发效率和代码质量。

二、解决方案:多轮约束代码生成框架

我们提出的框架核心逻辑如下:

用户输入约束1 → AI生成初始代码

用户输入约束2 → AI整合约束1+2,生成优化代码

用户输入约束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自动完成了从数据加载到模型部署的完整代码:

  1. 使用sklearn鸢尾花数据集实现基础KNN
  2. 按7:3划分训练集与测试集
  3. 对特征数据标准化
  4. 使用5折交叉验证寻找最优K值
  5. 输出分类报告与混淆矩阵
  6. 使用joblib持久化模型
  7. 创建预测函数

AI产出的代码逻辑严密,符合工业级标准。

六、核心代码实现:ConstraintCodeGenerator类

python

classConstraintCodeGenerator:

def__init__(self):

self.constraints=[]

self.history=[]

defadd_constraint(self,text):

self.constraints.append(text)

returnself.refresh_code()

defrefresh_code(self):

prompt=format_prompt(self.constraints)

returncall_zhipu_api(prompt)

  • 状态解耦:约束与对话历史独立存储
  • 全量刷新:每次基于当前所有约束重新生成
  • API抽象:可无缝切换GLM-4-Flash或GLM-4.7模型

七、交互指令示例

指令

功能

add 使用Pandas读取CSV

添加新约束

list

查看当前约束

remove 1

删除约束1

modify 2

修改约束2

export

导出最终代码

八、API优化建议

参数

推荐值

说明

temperature

0.1~0.3

确保确定性

top_p

0.7

平衡多样性与准确度

max_tokens

4096

防止长代码截断

stream

False

便于全量解析

模型选择:

  • 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_key=YOUR_API_KEY, base_url="https://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"{i+1}. {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( model="glm-4-flash", messages=self.conversation_history, temperature=0.5, max_tokens=4096 ) 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, f"API调用失败: {e}" def _extract_code(self, response): """从回复中提取代码""" # 匹配Python代码块 patterns = [ r'```python\n(.*?)\n```', r'```\n(.*?)\n```', r'```python(.*?)```' ] 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"{i+1}. {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( model="glm-4-flash", messages=self.conversation_history, temperature=0.5, max_tokens=4096 ) 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, filename=None): """导出代码到文件""" if not self.current_code: print("没有可导出的代码") return if filename is None: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"generated_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', encoding='utf-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(maxsplit=1) 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()
http://www.cnnetsun.cn/news/2630195.html

相关文章:

  • 不是所有 AI 产品都适合出海,真需求和全球化幻觉差在哪? | 嗨点小圆桌
  • 【AI语音合成终极测评】:12款主流TTS引擎逼真度横评,附客观MOS分与自然度雷达图
  • np.diff不只是算差值:在Pandas数据清洗与特征工程中的3个实战技巧
  • 别再死记硬背了!用Python动手实现一个简易GNSS/INS松组合滤波器(附代码)
  • AI Agent能对接医药代表管理的主数据系统吗?2026医药合规下的数据集成与智能自动化实践
  • ThinkPad X1 Carbon 指纹识别在 Ubuntu 20.04 上复活记:从‘设备繁忙’到登录秒开的保姆级排错指南
  • Android Vulkan开发中samplerExternalOES与textureLod的兼容性问题解析
  • 【IEEE复现】模块化多电平直流变压器MMDC仿真(基于梯形调制、短重叠角SO模式、定电压、定功率模式)(Simulink仿真实现)
  • Linux桌面用户的福音:像用.exe一样,把AppImage软件拖到收藏夹快速启动
  • Spyglass中加密RTL代码的读取与验证方法
  • Vue-Codemirror 进阶配置:从代码提示框不显示到优雅折叠,我的踩坑实录
  • C51编译器优化与XDATA读取问题的volatile解决方案
  • Arduino旋转电位器应用:从模拟信号读取到Processing数据可视化
  • 我偷看了同事的工资条:80万年薪的程序员,到底比你多做了什么?
  • 用好 Claude Code 的七条核心法则
  • 从Ubuntu老手到麒麟新手:在银河麒麟V10上配置Qt5.12的三大认知差异
  • OrCAD建库避坑指南:从新手到高手必须知道的5个细节(以STM32为例)
  • 15.Hermes这个浏览器后门,太关键了
  • 16.Hermes缺的,可能就是这个Workspace
  • 手把手教你用Python+OpenCV将普通图片转成事件相机风格(附完整代码)
  • 为什么头部券商已全员切换?DeepSeek企业版知识库增强模块(RAG 2.0)上线即封神
  • 别再混淆了!用Python+Matplotlib亲手画NRZ和RZ信号,搞懂时频域区别
  • iPhone变身UE5虚拟摄像机:手把手教你用Live Link VCAM实现实时动捕(附安卓通用指南)
  • OpenCV实战:用掩模(Mask)直方图实现‘局部调色’和背景虚化效果
  • 主流英语语音转文字对比评测,附实用选购判断标准
  • Win11系统下Jadx反编译工具保姆级安装与使用教程(附常见启动失败解决方案)
  • 灰子学Ai: Ai编程与操作系统
  • 给Java开发者的安全自查清单:你的项目还在用有漏洞的XStream版本吗?(附CVE-2021-21351检测与升级指南)
  • 3分钟掌握米哈游游戏扫码登录:MHY_Scanner智能解决方案
  • 如何用Untrunc免费开源工具拯救损坏的视频文件:完整操作指南