[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-unit-mesh--unit-minions":3,"tool-unit-mesh--unit-minions":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",146793,2,"2026-04-08T23:32:35",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",108111,"2026-04-08T11:23:26",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":77,"owner_email":77,"owner_twitter":77,"owner_website":78,"owner_url":79,"languages":80,"stars":89,"forks":90,"last_commit_at":91,"license":77,"difficulty_score":92,"env_os":93,"env_gpu":94,"env_ram":93,"env_deps":95,"category_tags":98,"github_topics":99,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":102,"updated_at":103,"faqs":104,"releases":155},5753,"unit-mesh\u002Funit-minions","unit-minions","《AI 研发提效：自己动手训练 LoRA》，包含 Llama  （Alpaca LoRA）模型、ChatGLM （ChatGLM Tuning）相关 Lora 的训练。训练内容：用户故事生成、测试代码生成、代码辅助生成、文本转 SQL、文本生成代码……","unit-minions 是一个专注于提升软件研发效率的开源项目，旨在帮助开发者亲手训练专属的 LoRA（低秩适应）微调模型。它基于 Llama 和 ChatGLM 等主流大语言模型，提供了一套完整的教程、代码及数据集，让用户能够低成本地定制 AI 助手，以胜任用户故事生成、测试代码编写、代码辅助补全以及自然语言转 SQL 等专业任务。\n\n该项目主要解决了通用大模型在特定研发场景下专业度不足、数据隐私顾虑以及高昂的微调门槛问题。通过标准化的数据准备流程和详细的训练笔记（Notebook），unit-minions 将复杂的模型微调过程变得透明且可操作，使工程师能够根据团队的具体需求构建更懂业务逻辑的 AI 工具。\n\nunit-minions 特别适合软件开发工程师、技术团队负责人以及对大模型应用感兴趣的研究人员使用。其独特亮点在于不仅提供了现成的训练成果，更强调了“授人以渔”的完整链路：从数据清洗、指令构建到最终模型训练与评估，甚至包含了与 OpenAI 模型的效果对比视频。这使得用户不仅能获得可用的模型，还能深入理解 AI 研发提效背后的方法论，从而更好地将人工智能融入日常开发工作流","unit-minions 是一个专注于提升软件研发效率的开源项目，旨在帮助开发者亲手训练专属的 LoRA（低秩适应）微调模型。它基于 Llama 和 ChatGLM 等主流大语言模型，提供了一套完整的教程、代码及数据集，让用户能够低成本地定制 AI 助手，以胜任用户故事生成、测试代码编写、代码辅助补全以及自然语言转 SQL 等专业任务。\n\n该项目主要解决了通用大模型在特定研发场景下专业度不足、数据隐私顾虑以及高昂的微调门槛问题。通过标准化的数据准备流程和详细的训练笔记（Notebook），unit-minions 将复杂的模型微调过程变得透明且可操作，使工程师能够根据团队的具体需求构建更懂业务逻辑的 AI 工具。\n\nunit-minions 特别适合软件开发工程师、技术团队负责人以及对大模型应用感兴趣的研究人员使用。其独特亮点在于不仅提供了现成的训练成果，更强调了“授人以渔”的完整链路：从数据清洗、指令构建到最终模型训练与评估，甚至包含了与 OpenAI 模型的效果对比视频。这使得用户不仅能获得可用的模型，还能深入理解 AI 研发提效背后的方法论，从而更好地将人工智能融入日常开发工作流中。","# 《AI 研发提效研究：自己动手训练 LoRA》\n\nPS：代码补全、文档生成相关的微调见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-eval](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-eval)\n\n声明：本项目提供的数据集、LoRA 二进制，皆为 OpenAI 生成或网上公开项目。我们仅提供了模型训练相关教程，使用者实际训练的内容所造成的一切后果由使用者本人负责。\n\n对于工程师而言，我们可以显而易见的看到 ChatGPT 等大语言模型带来的影响，借此我们展开了 AI 对于研发效能提升的研究 —— 训练了几个\nLLaMA LoRA、ChatGLM LoRA 用来研究研发效能提升的方法。\n\n这个项目是我们的研究成果，包括了一些视频介绍、训练好的模型、训练代码、训练数据、训练过程中的一些记录。\n\n训练完的 LoRA 见 Release。\n\n训练 Notebook：\n\n- [LLaMA Alpaca LoRA](alpaca-lora.ipynb)\n- [ChatGLM Tuning LoRA](chatglm-tuning.ipynb)\n\nLLaMA 系列在线视频：\n\n- 《[代码辅助生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Rh411u74H\u002F)》\n- 《[测试代码生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1jg4y1G7Xc\u002F)》\n- 《[详细需求生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Us4y1N7rd\u002F)》\n- 《[文本转 SQL](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1uv4y1H7bg\u002F)》\n\nChatGLM 系列在线视频：\n\n- 《[LoRA 大比拼：ChatGLM vs LLaMA，谁更会写需求文档？](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1fv4y1n7Y3\u002F)》\n\n目录：\n\n1. [《AI 研发提效研究：自己动手训练 LoRA》](#%E3%80%8Aai-%E7%A0%94%E5%8F%91%E6%8F%90%E6%95%88%E7%A0%94%E7%A9%B6%EF%BC%9A%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E8%AE%AD%E7%BB%83-lora%E3%80%8B)\n    1. [Introduction](#introduction)\n        1. [Roadmap](#roadmap)\n        2. [Sponsors](#sponsors)\n2. [总结设计：流程标准化](#%E6%80%BB%E7%BB%93%E8%AE%BE%E8%AE%A1%EF%BC%9A%E6%B5%81%E7%A8%8B%E6%A0%87%E5%87%86%E5%8C%96)\n    1. [研发效能](#%E7%A0%94%E5%8F%91%E6%95%88%E8%83%BD)\n    2. [Unit Mesh](#unit-mesh)\n3. [数据准备](#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87)\n    1. [折分任务 + 用户故事生成](#%E6%8A%98%E5%88%86%E4%BB%BB%E5%8A%A1-+-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E7%94%9F%E6%88%90)\n        1. [步骤 1. 生成用户任务](#%E6%AD%A5%E9%AA%A4-1.-%E7%94%9F%E6%88%90%E7%94%A8%E6%88%B7%E4%BB%BB%E5%8A%A1)\n        2. [步骤 2. 分解用户任务为用户故事](#%E6%AD%A5%E9%AA%A4-2.-%E5%88%86%E8%A7%A3%E7%94%A8%E6%88%B7%E4%BB%BB%E5%8A%A1%E4%B8%BA%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B)\n    2. [代码辅助生成](#%E4%BB%A3%E7%A0%81%E8%BE%85%E5%8A%A9%E7%94%9F%E6%88%90)\n        1. [步骤 1. 准备数据](#%E6%AD%A5%E9%AA%A4-1.-%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE)\n        2. [步骤 2. 生成指令](#%E6%AD%A5%E9%AA%A4-2.-%E7%94%9F%E6%88%90%E6%8C%87%E4%BB%A4)\n        3. [类信息格式](#%E7%B1%BB%E4%BF%A1%E6%81%AF%E6%A0%BC%E5%BC%8F)\n        4. [其它：核心代码逻辑](#%E5%85%B6%E5%AE%83%EF%BC%9A%E6%A0%B8%E5%BF%83%E4%BB%A3%E7%A0%81%E9%80%BB%E8%BE%91)\n    3. [测试代码生成](#%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        1. [步骤 1. 生成测试代码](#%E6%AD%A5%E9%AA%A4-1.-%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81)\n        2. [步骤 2. 借助 OpenAI Davinci 编写实现代码（可选）](#%E6%AD%A5%E9%AA%A4-2.-%E5%80%9F%E5%8A%A9-openai-davinci-%E7%BC%96%E5%86%99%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%89)\n    4. [文本转代码](#%E6%96%87%E6%9C%AC%E8%BD%AC%E4%BB%A3%E7%A0%81)\n    5. [文本生成 repository](#%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90-repository)\n        1. [数据准备](#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87)\n        2. [输出示例：](#%E8%BE%93%E5%87%BA%E7%A4%BA%E4%BE%8B%EF%BC%9A)\n    6. [领域知识](#%E9%A2%86%E5%9F%9F%E7%9F%A5%E8%AF%86)\n4. [训练与结果](#%E8%AE%AD%E7%BB%83%E4%B8%8E%E7%BB%93%E6%9E%9C)\n    1. [基于 Meta 的 Llama 训练 LoRA](#%E5%9F%BA%E4%BA%8E-meta-%E7%9A%84-llama-%E8%AE%AD%E7%BB%83-lora)\n        1. [训练 1：测试代码生成](#%E8%AE%AD%E7%BB%83-1%EF%BC%9A%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        2. [训练 2：拆分用户故事](#%E8%AE%AD%E7%BB%83-2%EF%BC%9A%E6%8B%86%E5%88%86%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B)\n        3. [训练 3：代码辅助](#%E8%AE%AD%E7%BB%83-3%EF%BC%9A%E4%BB%A3%E7%A0%81%E8%BE%85%E5%8A%A9)\n        4. [SQL 转代码](#sql-%E8%BD%AC%E4%BB%A3%E7%A0%81)\n    2. [基于清华大学的 ChatGLM 训练 LoRA](#%E5%9F%BA%E4%BA%8E%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6%E7%9A%84-chatglm-%E8%AE%AD%E7%BB%83-lora)\n        1. [代码生成](#%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        2. [测试生成](#%E6%B5%8B%E8%AF%95%E7%94%9F%E6%88%90)\n        3. [用户故事生成](#%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E7%94%9F%E6%88%90)\n\n## Introduction\n\n相关数据转换参见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Fminions-data-prepare](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Fminions-data-prepare)\n\nPS：如果你需要的是更好的代码生成，建议采用：[https:\u002F\u002Fhuggingface.co\u002FSalesforce\u002Fcodegen-16B-mono](https:\u002F\u002Fhuggingface.co\u002FSalesforce\u002Fcodegen-16B-mono)\n\n### 云 GPU\n\n我们使用的是 OpenBayes 提供的云 GPU：https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU\n\nOpenBayes 模型可以使用：\n\n- llamba-7b-hf：https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fopen-tutorials\u002Fmodels\u002FLHney50G1TB\u002F1\u002Foverview\n- chatglm-6b: https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fopen-tutorials\u002Fmodels\u002FD24PPO2ItU4\u002F1\u002Foverview\n\n### Roadmap\n\nRoadmap：\n\n- 训练：领域知识（Done）\n- 训练：测试代码生成（Done）\n- 训练：生成用户故事（Done）\n- 训练：代码辅助生成（Done）\n- 训练：SQL 转换（Done）\n- 训练：文本转代码（Done）\n- 训练：……\n- 训练：生成 Unit Mesh 的代码块\n\n### Sponsors\n\nThanks: [AIOS Club](https:\u002F\u002Fgithub.com\u002Faios-chat) for OpenAI Key,\nThanks [OpenBayes](https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU) for Cloud GPU\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgzzengwei\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_ef4a65ef3511.png\" width=\"30px\" alt=\"gzzengwei\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftrampboy\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_8954a2f839a0.png\" width=\"30px\" alt=\"trampboy\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdaochouwangu\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_4beece7521c1.png\" width=\"30px\" alt=\"daochouwangu\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fxuzongbao\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_9361a2058f74.png\" width=\"30px\" alt=\"xuzongbao\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fstevenchendan\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_0c38beb58aba.png\" width=\"30px\" alt=\"stevenchendan\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcoderprepares\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_73cba21052de.png\" width=\"30px\" alt=\"coderprepares\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgo-maple\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_07b9f45c192f.png\" width=\"30px\" alt=\"go-maple\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faios-chat\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_19422252e26b.png\" width=\"30px\" alt=\"aios-chat\" \u002F>\u003C\u002Fa>\n\n# 总结设计：流程标准化\n\nAI 感性提效依赖于对研发效能的标准化，并尽可能细地拆分每一个步骤。\n\n## 研发效能\n\n为了训练的结果更加准确，我们详细拆分了软件开发的步骤，以确保每一步生成的是准确，进而驱动出准确的结果。如下是我们早期拆分的一小部分细流程的示例：\n\n- split_user_story_tasks\n- create_agile_user_story\n- design_restful_api\n- design_plantuml_java_datastructure\n- implementation_mock_mvc_test\n- implementation_spring_controller\n- implementation_controller_test\n- implementation_spring_service\n- ….\n\n我们需要拆分到每一个尽可能小的步骤，在每一个细化的步骤里，喂入数据，才会让 AI 产生最大的复读机效果。\n\n## Unit Mesh\n\nTodos\n\n# 数据准备\n\n我们使用非常简单的 instruct，并尽可能提供，以便于集成到工具中使用。如下：\n\n- 领域知识。instruction：领域知识。\n- 拆分任务。instruction：split user story tasks，input：折分用户故事任务\n- 需求细化。instruction：create Agile user story for following topic，input：功能的基本信息\n- 代码生成。instruction：Implement the method xxx，input：类的基本信息\n- 测试生成。instruction：Write test for follow code，input：类的基本信息\n- SQL 生成。instruction：text to sql，input：问题\n- 文本转 Java 代码。instruction：text to java code，input：问题\n\n对应的功能介绍：\n\n- 需求细化。AI 辅助将模糊的需求转变为的需求设计，比如 “注册” 功能，生成为：”作为一个用户 xxx，填入用户名、密码信息等等，接着由人类去检查和完善。\n- 代码生成。AI 辅助将详细的需求设计翻译为目标的代码，再接着由人类去检查和完善。\n- 测试生成。AI 辅助根据生成的代码生成对应的测试代码，再接着由人类去检查和完善。\n\n从测试结果来看，随着数据量的增多，比如 20000 个代码用例比 10000 个代码用例更加的 “聪明”。\n\n## 折分任务 + 用户故事生成\n\n基本思路：\n\n1. 结合常见的领域（如在线网站），借用 OpenAI 生成用户任务（如登录、浏览列表等等）\n2. 根据用户故事生成用户故事。\n3. 训练 Alpaca LoRA。\n\n如下所示：\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_c573b237aec5.jpeg)\n\n### 步骤 1. 生成用户任务\n\n1. 调用 OpenAI 按分类创建用户任务。prompt 如下：\n\n```markdown\nDesign a User Story Mapping for ${domain} application based on your understanding. Here are the requirements:\n\n1. Your user story map should include only user tasks to demonstrate how users will interact with the application.\n2. Our user story map should be based on your understanding of the ${domain} application and its users, and should be\n   designed to address their needs and pain points.\n3. You may use any tools or formats you choose to create your user story map, but it should be easily shareable and\n   understandable by stakeholders.\n4. Your expression should be more concise and clear.\n5. Your return should be like as follows:\n\n###\n\nUser Tasks:\n\n1. ...\n\n###\n```\n\n示例输出：\n\n```\nUser Tasks:\n1. Browse and search for animations and comics\n2. View details of animations and comics\n3. Create an account\n4. Log in to the account\n5. Add animations and comics to favorites\n6. Download animations and comics\n7. Share animations and comics with friends\n8. Rate and review animations and comics\n9. Create and upload animations and comics\n10. Participate in online forums and discussions\n```\n\n### 步骤 2. 分解用户任务为用户故事\n\n1. 调用 OpenAI 根据用户任务创建用户故事。prompt 如下：\n\n```markdown\n为下面的需求编写用户故事：${domain} 应用的 ${story_name} 功能。 要求如下：\n\n1. 必须要考虑尽可能考虑各种异常场景，添加更多的 AC。\n2. 你的返回模板如下所示：\n\n###\n\n用户故事：可以选择宝贝出行服务\n作为 莉莉妈\n我想 在滴滴打车的手机客户端里选择宝贝出行服务\n以便于 我能够带宝宝打车出行的时候打到有儿童座椅的车\n\nAC 1:  莉莉妈可以选择宝贝出行服务\n假设 xxx\n当 xxx\n于是 xxx\n\n###\n```\n\n示例输出：\n\n```\n用户故事：可以创建和上传动画和漫画\n作为一个 Animation and Comics 应用的用户\n我想要创建和上传动画和漫画\n以便于我可以分享我的作品给其他用户\n\nAC 1: 用户可以创建和上传动画和漫画\n假设 用户已经登录到 Animation and Comics 应用\n当 用户点击创建和上传动画和漫画按钮\n于是 用户可以创建和上传动画和漫画\n```\n\n## 代码辅助生成\n\n基本思路：\n\n![Copilot Element](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_fe1e6f8b7856.png)\n\n### 步骤 1. 准备数据\n\n1. 下载 GitHub 上的项目（需要包含测试用例）\n2. 遍历 `src\u002Fmain` 下的 Java 文件。\n3. 生成每个类的基本信息：\n\n```\nPostService(PostRepository, UserRepository, ImageService)\n- fields: postRepository:PostRepository, userRepository:UserRepository, userPosts:Set\u003CPost>, imageService:ImageService\n- methods: findAll(): List\u003CPost>, addNewPost(Post): Post, saveImageToPost(String, MultipartFile, Post): int\n```\n\n### 步骤 2. 生成指令\n\n预期 JSON 格式：\n\n- instruction: Implement the method ${methodName}\n- input: ${classInformation}\n- output: ${code}\n\n示例：\n\n```\n{\"instruction\":\"Implement the method action\",\"input\":\"com.thoughtworks.go.config.rules.AbstractDirective(DirectiveType, DirectiveType, String, String, String)\\n- fields: action:String, type:String, resource:String, configErrors:ConfigErrors, directiveType:DirectiveType\\n- methods: validate(ValidationContext): void, isInvalid(String, List\u003CString>): boolean, matchesAction(String): boolean, matchesType(Class\u003C? extends Validatable>): boolean, matchesResource(String): boolean, errors(): ConfigErrors, addError(String, String): void, equals(Object): boolean, action(): String, type(): String, resource(): String, hashCode(): int, hasErrors(): boolean, getDirectiveType(): DirectiveType\",\"output\":\"public abstract class AbstractDirective implements Directive {\\n\\n    @ConfigAttribute(value = \\\"action\\\", optional = false)\\n    protected String action;\\n\\n    @ConfigAttribute(value = \\\"type\\\", optional = false)\\n    protected String type;\\n\\n    @ConfigValue\\n    private String resource;\\n\\n    private final ConfigErrors configErrors = new ConfigErrors();\\n\\n    private DirectiveType directiveType;\\n\\n    public AbstractDirective(DirectiveType allow) {\\n        this.directiveType = allow;\\n    }\\n\\n    public AbstractDirective(DirectiveType allow, String action, String type, String resource) {\\n        this.directiveType = allow;\\n        this.action = action;\\n        this.type = type;\\n        this.resource = resource;\\n    }\\n\\n    @Override\\n    public String action() {\\n        return this.action;\\n    }\\n}\\n\"}\n```\n\n### 类信息格式\n\n格式规范：\n\n```\n包名.类名(类的构造类型)\n- fields：成员变量集合（变量名:类型）\n- methods：方法抽象集合（方法名(参数类型): 输出类型）\n```\n\n结果：\n\n```\ncom.thoughtworks.go.config.rules.AbstractDirective(DirectiveType, DirectiveType, String, String, String)\n- fields: action:String, type:String, resource:String, configErrors:ConfigErrors, directiveType:DirectiveType\n- methods: validate(ValidationContext): void, isInvalid(String, List\u003CString>): boolean, matchesAction(String): boolean, matchesType(Class\u003C? extends Validatable>): boolean, matchesResource(String): boolean, errors(): ConfigErrors, addError(String, String): void, equals(Object): boolean, action(): String, type(): String, resource(): String, hashCode(): int, hasErrors(): boolean, getDirectiveType(): DirectiveType\n```\n\n### 其它：核心代码逻辑\n\n```kotlin\nval javaProcessor = JavaProcessor(file.readText())\nval shotClass = javaProcessor.toShortClass() ?: return@forEach\n\njavaProcessor\n   .removePackage()\n   .removeAllImport()\n   .removeLicenseInfoBeforeImport()\n\njavaProcessor.splitMethods().forEach { (key, value) ->\n   CodegenPrompt(\n       instruction = \"Implement the method $key\",\n       input = shotClass.toString(),\n       output = value\n   ).let { prompt ->\n       val output = Json.encodeToString(prompt)\n       File(\"$targetPath${key}.json\").writeText(output)\n   }\n}\n```\n\n## 测试代码生成\n\n基本思路\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_9304989bf9f6.jpeg)\n\n语法分析思路：\n\n- 方式 1 - 在时间有限的情况下，基于 OpenAI 的数据来完善。但是，OpenAI 编写的测试用例不一定靠谱，所以让他生成业务代码。\n- 方式 2 - 在时间充裕的情况下，可以分析 AST 来合并第一和第二步，也是比较合理的方案，毕竟 OpenAI 的 API 很贵。\n\n### 步骤 1. 生成测试代码\n\n1. 下载 GitHub 上的项目（需要包含测试用例）\n2. 建立每个项目的 `src\u002Fmain` 下的 Java 文件 map，如果同时存在对应的测试文件，则拉入的数据集中。\n3. 并生成每个测试对应的类的基本信息（以减少 OpenAI Token 使用）：\n\n```\norg.unitmesh.processor.TestClass(String, Int)\n- fields: field1:String, field2:Int\n- methods: method1(String, Int): String, method2(): Int\n```\n\n4. 按测试用例（即 @Test 方法）拆分每个测试文件，拆成 N 个（即 test1、test2 是两个不同的数据）\n\n```java\nclass TestProcessorTest {\n    @Test\n    void test1() {\n    }\n    \n    @Test\n    void test2() {\n    }\n}\n```\n\n最后，生成的数据如下：\n\n{\"classInfo\": \"com.thoughtworks.go.security.AESEncrypter(AESCipherProvider)\\n- fields: ENCODER:Base64.Encoder, DECODER:\nBase64.Decoder, cipherProvider:AESCipherProvider, ivProvider:IVProvider\\n- methods: createIVProviderInstance():\nIVProvider, canDecrypt(String): boolean, encrypt(String): String, decrypt(String): String, createSecretKeySpec():\nSecretKeySpec\", \"testMethod\": \"public class AESEncrypterTest {\\n\\n private AESEncrypter aesEncrypter;\\n\\n @Test\\n public\nvoid shouldGenerateEncryptedText() throws CryptoException {\\n String encrypt = aesEncrypter.encrypt(\\\"p@ssw0rd\\\");\\n\nassertThat(encrypt).startsWith(\\\"AES\\\");\\n assertThat(encrypt.split(\\\":\\\")).hasSize(3);\\n }\\n}\\n\", \"id\": \"task_0\"}\n\n### 步骤 2. 借助 OpenAI Davinci 编写实现代码（可选）\n\n详细代码见：[test-to-code.py](code\u002Ftest-to-code.py)\n\n1. 将上面的数据转换为 JSONL，合并成 prompt。\n2. 让 Davinci 完成填空题。\n\n最后生成的 prompt 示例如下：\n\n```markdown\nYou are a programmer and implementation a method with TDD. Here are the requirements:\n\n1. According follows class information and tests code to write a method.\n2. Try you best to thinking corner case.\n3. You only return the code, no explain.\n\nclass information:\n\n###  \n\nio.github.robwin.swagger.test.AbstractContractValidator()\n\n- methods: findExpectedPaths(Swagger, SwaggerAssertionConfig): Map\u003CString,Path>, getPathsIncludingBasePath(Swagger):\n  Map\u003CString,Path>, getPathsWithPrefix(Swagger, String): Map\u003CString,Path>, isBlankOrSlash(String): boolean\n\n###\n\ntest code:\n\n###  \n\n\u002F**\n\n* Tests AbstractContractValidator.\n  *\u002F\n  @RunWith(Enclosed.class)\n  public class AbstractContractValidatorTest {\n\n  \u002F**\n    * Tests getPathsIncludingBasePath().\n      *\u002F\n      public static class GetPathsIncludingBasePath {\n\n      @Test\n      public void shouldReturnPathsPrefixedIfBasePathSet() {\n      \u002F\u002F given\n      Swagger swagger = buildSwaggerFrom(\"\u002Fswagger.json\");\n      \u002F\u002F when\n      Map\u003CString, Path> paths = new DummyValidator().getPathsIncludingBasePath(swagger);\n      \u002F\u002F then\n      paths.entrySet().forEach(e -> assertThat(e.getKey(), startsWith(swagger.getBasePath())));\n      }\n      }\n\n  \u002F**\n    * Tests findExpectedPaths().\n      *\u002F\n      public static class FindExpectedPaths {\n      }\n\n  private static class DummyValidator extends AbstractContractValidator {\n  }\n  }\n\n###\n\n```\n\n## 文本转代码\n\n使用的是已有的 Datasets，包括：\n\n- [text-to-sql](datasets\u002Fsql) - 用于将自然语言转换为 SQL 语句的数据集\n- [text-to-code](datasets\u002Ftext-to-code) - 用于将自然语言转换为代码的数据集\n\n不过，这两个代码集质量都不高，但是基本可用。\n\n## 文本生成 repository\n\n### 数据准备\n\n1. 解析 Kotlin 项目代码，提取出所有的类和方法。\n2. 建立 Repository 方法与类型的对应关系。\n3. 生成 Repository 方法的基本信息。\n4. 调用 OpenAI 生成数据\n\n格式如下：\n\n```\ninstruction:\n我想查找特定月份（monthly_id）下在某个日期（date）之前的所有费用（expense），以方便了解特定月份内的开销情况。\ninput:\ndata class ExpenseEntity(....)\n\noutput:\n@Query(\"SELECT * FROM expense WHERE monthly_id = :recurringExpenseId AND date \u003C :beforeDate\")\nsuspend fun getAllExpensesForRecurringExpenseBeforeDate(recurringExpenseId: Long, beforeDate: LocalDate): List\u003CExpenseEntity>\n```\n\n### 输出示例：\n\n```\nevaluate(\"text to kotlin repository with class\", \"我想查询指定年龄的用户（User）的博客数量。\\n ###data class User(var age: Int, \nval blogId: Int) data class Post(val title: String)###\", 0.1, 0.75, 40, 4, 512)\n\n@Query(\"SELECT COUNT(*) FROM User WHERE age = :age\")\nabstract fun getBlogCount(age: Int): Long\n```\n\n## 领域知识\n\n### 训练 1：PDF\n\n基本思路：\n\n1. 将 PDF 文件转换为文本\n2. 将文本按标题的方式拆分成 `instruction` 和 `output` 两部分，`input` 为 null。\n\n示例：\n\n```\ninstruction: 介绍一下财通财通宝的基金管理人、基金托管人在履行各自职责的过程中，违反《基金法》?\n\n（一）基金管理人、基金托管人在履行各自职责的过程中，违反《基金法》等法律法规的规定或者基金合同约定， 给基金财产或者基金份额持有人造成损害的，\n应当分别对各自的行为依法承担赔偿责任；因共同行为给基金财产或者基金份额持有人造成损害的，应当承担连带赔偿责任，对 损失的赔偿，仅限于直接损失。\n但是发生下列情况，当事人可以免责：  1.基金管理人及基金托管人按照中国证监会的规定或当时有效的法律法规的作为或不作为而造成的损失等； \n 2.基金管理人由于按照基金合同规定的投资原则而行使或不行使其投资权而造成的损失等；  3.不可抗力。  \n```\n\n# 训练与结果\n\n## 基于 Meta 的 Llama 训练 LoRA\n\n训练：\n\n- 方式 1：直接使用：[alpaca-lora.ipynb](alpaca-lora.ipynb)\n- 方式 2：直接使用：[OpenBayes 容器](https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fphodal\u002Fcontainers\u002FJBx5YD7HTdS) （PS：使用我的专用邀请链接，注册\n  OpenBayes，双方各获得 60 分钟 RTX 3090 使用时长，支持累积，永久有效：\n  https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU) ）\n\n训练时间：\n\n- 3400+ 用户故事，约 25 分钟\n- 8000+ 测试代码，约 1 小时\n- 10000+ 代码辅助生成，约 1.5 小时\n- 20000+ 代码辅助生成，约 3 小时\n- 40000+ 代码辅助生成，约 6 小时\n\n相关背景：\n\n1. 基础模型：Meta 开源 LLaMA 系列模型：[llama-7b-hf](https:\u002F\u002Fhuggingface.co\u002Fdecapoda-research\u002Fllama-7b-hf)\n2. Stanford Alpaca: [https:\u002F\u002Fgithub.com\u002Ftatsu-lab\u002Fstanford_alpaca](https:\u002F\u002Fgithub.com\u002Ftatsu-lab\u002Fstanford_alpaca)\n3. Alpaca Lora：[https:\u002F\u002Fgithub.com\u002Ftloen\u002Falpaca-lora](https:\u002F\u002Fgithub.com\u002Ftloen\u002Falpaca-lora)\n\n由于，我们的目标不是对模型调优、生成通用的模型，而是训练特定用途的 Lora。因此，我们没有加入：Stanford Alpaca 中的数据，\n故所需要时间更短，如 8000+ 测试代码只需要 1 小时，3400+ 的用户故事只需要 25 分钟。\n\n### 训练 1：测试代码生成\n\n训练结果（LoRA）见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.1](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.1)\n\n```\nprint(evaluate(\"write test\", \"\"\"\npublic Set\u003CString> listFilesUsingJavaIO(String dir) {\n    return Stream.of(new File(dir).listFiles())\n      .filter(file -> !file.isDirectory())\n      .map(File::getName)\n      .collect(Collectors.toSet());\n}\n\"\"\", 0.1, 0.75, 40, 4, 512))\n\n## Output:\n\npublic class ListFilesUsingJavaIOTest {\n    @Test\n    public void shouldListFilesUsingJavaIO() {\n        Set\u003CString> files = ListFilesUsingJavaIO.listFilesUsingJavaIO(new File(\"dir\"));\n        assertThat(files, containsInAnyOrder(\"file1\", \"file2\", \"file3\"));\n    }\n}\n```\n\n### 训练 2：拆分用户故事\n\n训练结果（LoRA）见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.2](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.2)\n\n注意：\n\n1. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n2. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n3. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n\n**示例输出**：\n\n```\nprint(evaluate(\"create Agile user story for following topic: \", \"购买电影票\", 0.1, 0.75, 40, 4, 512))\n\n用户故事：可以购买电影票\n作为一个电影票购买者\n我想在购买电影票应用中购买电影票\n以便于我可以购买电影票\nAC 1: 电影票购买者可以在购买电影票应用中购买电影票\n假设 电影票购买者已经登录购买电影票应用\n当 电影票购买者点击“购买电影票”按钮\n于是 电影票购买者可以在购买电影票应用中购买电影票\nAC 2: 电影票购买者可以在购买电影票应用中查看购买记录\n假设 电影票购买者已经登录购买电影票应用\n当 电影票购买者点击“查看购买记录”按钮\n于是 电影票购买者可以在购买电影票应用中查看购买记录\nAC 3: 电影票购买者可以在购买电影票应用中查看购买记录\n假设 电影票购买者已经登录购买电影票应用\n当 电影票购买者点击“查看购买记录”按��\n```\n\n### 训练 3：代码辅助\n\n训练结果（LoRA）见：https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.3\n\n**示例输出**：\n\n```\nprint(evaluate(\"Implement the method rmFiles\", \"FileUtils:\", 0.1, 0.75, 40, 4, 512))\n\npublic class FileUtils {\n\n    private FileUtils() {\n    }\n\n    public static void rmFiles(String path) {\n        File dir = new File(path);\n        File[] files = dir.listFiles();\n        if (files != null) {\n            for (File file : files) {\n                if (file.isFile()) {\n                    file.delete();\n                } else if (file.isDirectory()) {\n                    FileUtils.rmFiles(file.getAbsolutePath());\n                }\n            }\n        }\n    }\n}\n```\n\n### SQL 转代码\n\n转换脚本：[code\u002Ftext-to-sql.py](code\u002Ftext-to-sql.py)\n\n直接从：[datasets\u002Fsql\u002Fsql-train.jsonl](datasets\u002Fsql\u002Fsql-train.jsonl)\n\n**示例输出**：\n\n```\nevaluate(\"text to sql\", \"谁是最美丽的人\", 0.1, 0.75, 40, 4, 512)\nevaluate(\"text to sql\", \"小明今年几岁\", 0.1, 0.75, 40, 4, 512)\nevaluate(\"text to sql\", \"What hand guard system is used with a gas piston commando?\", 0.1, 0.75, 40, 4, 512)\n```\n\n## 基于清华大学的 ChatGLM 训练 LoRA\n\n训练：\n\n- 直接使用：[chatglm-tuning.ipynb](chatglm-tuning.ipynb)\n\n### 代码生成\n\n### 测试生成\n\n### 用户故事生成\n\n示例 1：\n\n```\nevaluate(\"Instruction: 创建用户故事\\nInput: 电影网站: 查看订单详情 \\nAnswer:\")\n\nInstruction: 创建用户故事\nInput: 电影网站: 查看订单详情 \nAnswer:\n\n用户故事:可以查看订单详情\n作为一个电影网站的用户\n我想查看订单详情\n以便于我可以了解订单的详细信息,如订单号、订单状态、订单内容等。\n\nAC 1: 用户可以查看订单详情\n假设 用户已经登录\n当 用户点击查看订单详情按钮\n于是 用户可以查看订单详情,包括订单号、订单状态、订单内容等。\n\nAC 2: 用户可以查看订单详情\n假设 用户没有登录\n当 用户点击查看订单详情按钮\n于是 用户被要求先登录,然后才能查看订单详情,包括订单号、订单状态、订单内容等。\n```\n\n示例 2：\n\n```\nevaluate(\"Instruction: 创建用户故事\\nInput: 团购网站:用户注册\\nAnswer:\")\n\nInstruction: 创建用户故事\nInput: 团购网站:用户注册\nAnswer:\n团购网站的用户注册故事:\n\n作为一个团购网站的用户\n\n我想注册一个团购网站的用户账号\n\n以便于我可以使用团购服务,如购买商品、服务等。\n\nAC 1: 团购网站的用户注册账号\n假设 用户输入了注册信息\n当 用户提交注册信息\n于是 用户可以成功注册一个团购网站的用户账号\n\nAC 2: 团购网站的用户注册账号\n假设 用户输入了错误的注册信息\n当 用户提交注册信息\n于是 用户可以被提示输入正确的注册信息,并重新提交注册信息\n```\n","# 《AI 研发提效研究：自己动手训练 LoRA》\n\nPS：代码补全、文档生成相关的微调见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-eval](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-eval)\n\n声明：本项目提供的数据集、LoRA 二进制，皆为 OpenAI 生成或网上公开项目。我们仅提供了模型训练相关教程，使用者实际训练的内容所造成的一切后果由使用者本人负责。\n\n对于工程师而言，我们可以显而易见的看到 ChatGPT 等大语言模型带来的影响，借此我们展开了 AI 对于研发效能提升的研究 —— 训练了几个\nLLaMA LoRA、ChatGLM LoRA 用来研究研发效能提升的方法。\n\n这个项目是我们的研究成果，包括了一些视频介绍、训练好的模型、训练代码、训练数据、训练过程中的一些记录。\n\n训练完的 LoRA 见 Release。\n\n训练 Notebook：\n\n- [LLaMA Alpaca LoRA](alpaca-lora.ipynb)\n- [ChatGLM Tuning LoRA](chatglm-tuning.ipynb)\n\nLLaMA 系列在线视频：\n\n- 《[代码辅助生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Rh411u74H\u002F)》\n- 《[测试代码生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1jg4y1G7Xc\u002F)》\n- 《[详细需求生成](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Us4y1N7rd\u002F)》\n- 《[文本转 SQL](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1uv4y1H7bg\u002F)》\n\nChatGLM 系列在线视频：\n\n- 《[LoRA 大比拼：ChatGLM vs LLaMA，谁更会写需求文档？](https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1fv4y1n7Y3\u002F)》\n\n目录：\n\n1. [《AI 研发提效研究：自己动手训练 LoRA》](#%E3%80%8Aai-%E7%A0%94%E5%8F%91%E6%8F%90%E6%95%88%E7%A0%94%E7%A9%B6%EF%BC%9A%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E8%AE%AD%E7%BB%83-lora%E3%80%8B)\n    1. [Introduction](#introduction)\n        1. [Roadmap](#roadmap)\n        2. [Sponsors](#sponsors)\n2. [总结设计：流程标准化](#%E6%80%BB%E7%BB%93%E8%AE%BE%E8%AE%A1%EF%BC%9A%E6%B5%81%E7%A8%8B%E6%A0%87%E5%87%86%E5%8C%96)\n    1. [研发效能](#%E7%A0%94%E5%8F%91%E6%95%88%E8%83%BD)\n    2. [Unit Mesh](#unit-mesh)\n3. [数据准备](#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87)\n    1. [折分任务 + 用户故事生成](#%E6%8A%98%E5%88%86%E4%BB%BB%E5%8A%A1-+-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E7%94%9F%E6%88%90)\n        1. [步骤 1. 生成用户任务](#%E6%AD%A5%E9%AA%A4-1.-%E7%94%9F%E6%88%90%E7%94%A8%E6%88%B7%E4%BB%BB%E5%8A%A1)\n        2. [步骤 2. 分解用户任务为用户故事](#%E6%AD%A5%E9%AA%A4-2.-%E5%88%86%E8%A7%A3%E7%94%A8%E6%88%B7%E4%BB%BB%E5%8A%A1%E4%B8%BA%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B)\n    2. [代码辅助生成](#%E4%BB%A3%E7%A0%81%E8%BE%85%E5%8A%A9%E7%94%9F%E6%88%90)\n        1. [步骤 1. 准备数据](#%E6%AD%A5%E9%AA%A4-1.-%E5%87%86%E5%A4%87%E6%95%B0%E6%8D%AE)\n        2. [步骤 2. 生成指令](#%E6%AD%A5%E9%AA%A4-2.-%E7%94%9F%E6%88%90%E6%8C%87%E4%BB%A4)\n        3. [类信息格式](#%E7%B1%BB%E4%BF%A1%E6%81%AF%E6%A0%BC%E5%BC%8F)\n        4. [其它：核心代码逻辑](#%E5%85%B6%E5%AE%83%EF%BC%9A%E6%A0%B8%E5%BF%83%E4%BB%A3%E7%A0%81%E9%80%BB%E8%BE%91)\n    3. [测试代码生成](#%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        1. [步骤 1. 生成测试代码](#%E6%AD%A5%E9%AA%A4-1.-%E7%94%9F%E6%88%90%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81)\n        2. [步骤 2. 借助 OpenAI Davinci 编写实现代码（可选）](#%E6%AD%A5%E9%AA%A4-2.-%E5%80%9F%E5%8A%A9-openai-davinci-%E7%BC%96%E5%86%99%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%89)\n    4. [文本转代码](#%E6%96%87%E6%9C%AC%E8%BD%AC%E4%BB%A3%E7%A0%81)\n    5. [文本生成 repository](#%E6%96%87%E6%9C%AC%E7%94%9F%E6%88%90-repository)\n        1. [数据准备](#%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87)\n        2. [输出示例：](#%E8%BE%93%E5%87%BA%E7%A4%BA%E4%BE%8B%EF%BC%9A)\n    6. [领域知识](#%E9%A2%86%E5%9F%9F%E7%9F%A5%E8%AF%86)\n4. [训练与结果](#%E8%AE%AD%E7%BB%83%E4%B8%8E%E7%BB%93%E6%9E%9C)\n    1. [基于 Meta 的 Llama 训练 LoRA](#%E5%9F%BA%E4%BA%8E-meta-%E7%9A%84-llama-%E8%AE%AD%E7%BB%83-lora)\n        1. [训练 1：测试代码生成](#%E8%AE%AD%E7%BB%83-1%EF%BC%9A%E6%B5%8B%E8%AF%95%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        2. [训练 2：拆分用户故事](#%E8%AE%AD%E7%BB%83-2%EF%BC%9A%E6%8B%86%E5%88%86%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B)\n        3. [训练 3：代码辅助](#%E8%AE%AD%E7%BB%83-3%EF%BC%9A%E4%BB%A3%E7%A0%81%E8%BE%85%E5%8A%A5)\n        4. [SQL 转代码](#sql-%E8%BD%AC%E4%BB%A3%E7%A0%81)\n    2. [基于清华大学的 ChatGLM 训练 LoRA](#%E5%9F%BA%E4%BA%8E%E6%B8%85%E5%8D%8E%E5%A4%A7%E5%AD%A6%E7%9A%84-chatglm-%E8%AE%AD%E7%BB%83-lora)\n        1. [代码生成](#%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90)\n        2. [测试生成](#%E6%B5%8B%E8%AF%95%E7%94%9F%E6%88%90)\n        3. [用户故事生成](#%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E7%94%9F%E6%88%90)\n\n## Introduction\n\n相关数据转换参见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Fminions-data-prepare](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Fminions-data-prepare)\n\nPS：如果你需要的是更好的代码生成，建议采用：[https:\u002F\u002Fhuggingface.co\u002FSalesforce\u002Fcodegen-16B-mono](https:\u002F\u002Fhuggingface.co\u002FSalesforce\u002Fcodegen-16B-mono)\n\n### 云 GPU\n\n我们使用的是 OpenBayes 提供的云 GPU：https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU\n\nOpenBayes 模型可以使用：\n\n- llamba-7b-hf：https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fopen-tutorials\u002Fmodels\u002FLHney50G1TB\u002F1\u002Foverview\n- chatglm-6b: https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fopen-tutorials\u002Fmodels\u002FD24PPO2ItU4\u002F1\u002Foverview\n\n### Roadmap\n\nRoadmap：\n\n- 训练：领域知识（Done）\n- 训练：测试代码生成（Done）\n- 训练：生成用户故事（Done）\n- 训练：代码辅助生成（Done）\n- 训练：SQL 转换（Done）\n- 训练：文本转代码（Done）\n- 训练：……\n- 训练：生成 Unit Mesh 的代码块\n\n### Sponsors\n\nThanks: [AIOS Club](https:\u002F\u002Fgithub.com\u002Faios-chat) for OpenAI Key,\nThanks [OpenBayes](https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU) for Cloud GPU\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgzzengwei\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_ef4a65ef3511.png\" width=\"30px\" alt=\"gzzengwei\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Ftrampboy\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_8954a2f839a0.png\" width=\"30px\" alt=\"trampboy\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fdaochouwangu\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_4beece7521c1.png\" width=\"30px\" alt=\"daochouwangu\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fxuzongbao\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_9361a2058f74.png\" width=\"30px\" alt=\"xuzongbao\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fstevenchendan\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_0c38beb58aba.png\" width=\"30px\" alt=\"stevenchendan\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcoderprepares\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_73cba21052de.png\" width=\"30px\" alt=\"coderprepares\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgo-maple\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_07b9f45c192f.png\" width=\"30px\" alt=\"go-maple\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faios-chat\">\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_19422252e26b.png\" width=\"30px\" alt=\"aios-chat\" \u002F>\u003C\u002Fa>\n\n# 总结设计：流程标准化\n\nAI 感性提效依赖于对研发效能的标准化，并尽可能细地拆分每一个步骤。\n\n## 研发效能\n\n为了训练的结果更加准确，我们详细拆分了软件开发的步骤，以确保每一步生成的是准确，进而驱动出准确的结果。如下是我们早期拆分的一小部分细流程的示例：\n\n- split_user_story_tasks\n- create_agile_user_story\n- design_restful_api\n- design_plantuml_java_datastructure\n- implementation_mock_mvc_test\n- implementation_spring_controller\n- implementation_controller_test\n- implementation_spring_service\n- ….\n\n我们需要拆分到每一个尽可能小的步骤，在每一个细化的步骤里，喂入数据，才会让 AI 产生最大的复读机效果。\n\n## Unit Mesh\n\nTodos\n\n# 数据准备\n\n我们使用非常简单的 instruct，并尽可能提供，以便于集成到工具中使用。如下：\n\n- 领域知识。instruction：领域知识。\n- 拆分任务。instruction：split user story tasks，input：折分用户故事任务\n- 需求细化。instruction：create Agile user story for following topic，input：功能的基本信息\n- 代码生成。instruction：Implement the method xxx，input：类的基本信息\n- 测试生成。instruction：Write test for follow code，input：类的基本信息\n- SQL 生成。instruction：text to sql，input：问题\n- 文本转 Java 代码。instruction：text to java code，input：问题\n\n对应的功能介绍：\n\n- 需求细化。AI 辅助将模糊的需求转变为的需求设计，比如 “注册” 功能，生成为：”作为一个用户 xxx，填入用户名、密码信息等等，接着由人类去检查和完善。\n- 代码生成。AI 辅助将详细的需求设计翻译为目标的代码，再接着由人类去检查和完善。\n- 测试生成。AI 辅助根据生成的代码生成对应的测试代码，再接着由人类去检查和完善。\n\n从测试结果来看，随着数据量的增多，比如 20000 个代码用例比 10000 个代码用例更加的 “聪明”。\n\n## 任务拆分 + 用户故事生成\n\n基本思路：\n\n1. 结合常见的领域（如在线网站），借用 OpenAI 生成用户任务（如登录、浏览列表等等）\n2. 根据用户故事生成用户故事。\n3. 训练 Alpaca LoRA。\n\n如下所示：\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_c573b237aec5.jpeg)\n\n### 步骤 1. 生成用户任务\n\n1. 调用 OpenAI 按分类创建用户任务。prompt 如下：\n\n```markdown\n为 ${domain} 应用设计一份用户故事地图，基于你的理解。以下是要求：\n\n1. 用户故事地图应仅包含用户任务，以展示用户如何与应用交互。\n2. 我们的用户故事地图应基于你对 ${domain} 应用及其用户的理解，并旨在解决他们的需求和痛点。\n3. 你可以使用任何工具或格式来创建用户故事地图，但需确保其易于分享且便于利益相关者理解。\n4. 表述应简洁明了。\n5. 返回格式如下：\n\n###\n\n用户任务：\n\n1. ...\n\n###\n```\n\n示例输出：\n\n```\n用户任务：\n1. 浏览并搜索动画和漫画\n2. 查看动画和漫画的详细信息\n3. 创建账户\n4. 登录账户\n5. 将动画和漫画添加到收藏夹\n6. 下载动画和漫画\n7. 与朋友分享动画和漫画\n8. 对动画和漫画进行评分和评论\n9. 创建并上传动画和漫画\n10. 参与在线论坛和讨论\n```\n\n### 步骤 2. 分解用户任务为用户故事\n\n1. 调用 OpenAI 根据用户任务创建用户故事。prompt 如下：\n\n```markdown\n为以下需求编写用户故事：${domain} 应用的 ${story_name} 功能。要求如下：\n\n1. 必须考虑尽可能多的异常场景，添加更多验收条件。\n2. 返回模板如下所示：\n\n###\n\n用户故事：可以选择宝贝出行服务\n作为 莉莉妈\n我想 在滴滴打车的手机客户端里选择宝贝出行服务\n以便于 我能够带宝宝打车出行的时候打到有儿童座椅的车\n\nAC 1:  莉莉妈可以选择宝贝出行服务\n假设 xxx\n当 xxx\n于是 xxx\n\n###\n```\n\n示例输出：\n\n```\n用户故事：可以创建和上传动画和漫画\n作为一个 Animation and Comics 应用的用户\n我想要创建和上传动画和漫画\n以便于我可以分享我的作品给其他用户\n\nAC 1: 用户可以创建和上传动画和漫画\n假设 用户已经登录到 Animation and Comics 应用\n当 用户点击创建和上传动画和漫画按钮\n于是 用户可以创建和上传动画和漫画\n```\n\n## 代码辅助生成\n\n基本思路：\n\n![Copilot Element](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_fe1e6f8b7856.png)\n\n### 步骤 1. 准备数据\n\n1. 下载 GitHub 上的项目（需要包含测试用例）\n2. 遍历 `src\u002Fmain` 下的 Java 文件。\n3. 生成每个类的基本信息：\n\n```\nPostService(PostRepository, UserRepository, ImageService)\n- fields: postRepository:PostRepository, userRepository:UserRepository, userPosts:Set\u003CPost>, imageService:ImageService\n- methods: findAll(): List\u003CPost>, addNewPost(Post): Post, saveImageToPost(String, MultipartFile, Post): int\n```\n\n### 步骤 2. 生成指令\n\n预期 JSON 格式：\n\n- instruction: 实现方法 ${methodName}\n- input: ${classInformation}\n- output: ${code}\n\n示例：\n\n```\n{\"instruction\":\"实现方法 action\",\"input\":\"com.thoughtworks.go.config.rules.AbstractDirective(DirectiveType, DirectiveType, String, String, String)\\n- fields: action:String, type:String, resource:String, configErrors:ConfigErrors, directiveType:DirectiveType\\n- methods: validate(ValidationContext): void, isInvalid(String, List\u003CString>): boolean, matchesAction(String): boolean, matchesType(Class\u003C? extends Validatable>): boolean, matchesResource(String): boolean, errors(): ConfigErrors, addError(String, String): void, equals(Object): boolean, action(): String, type(): String, resource(): String, hashCode(): int, hasErrors(): boolean, getDirectiveType(): DirectiveType\",\"output\":\"public abstract class AbstractDirective implements Directive {\\n\\n    @ConfigAttribute(value = \\\"action\\\", optional = false)\\n    protected String action;\\n\\n    @ConfigAttribute(value = \\\"type\\\", optional = false)\\n    protected String type;\\n\\n    @ConfigValue\\n    private String resource;\\n\\n    private final ConfigErrors configErrors = new ConfigErrors();\\n\\n    private DirectiveType directiveType;\\n\\n    public AbstractDirective(DirectiveType allow) {\\n        this.directiveType = allow;\\n    }\\n\\n    public AbstractDirective(DirectiveType allow, String action, String type, String resource) {\\n        this.directiveType = allow;\\n        this.action = action;\\n        this.type = type;\\n        this.resource = resource;\\n    }\\n\\n    @Override\\n    public String action() {\\n        return this.action;\\n    }\\n}\\n\"}\n```\n\n### 类信息格式\n\n格式规范：\n\n```\n包名.类名(类的构造类型)\n- fields：成员变量集合（变量名:类型）\n- methods：方法抽象集合（方法名(参数类型): 输出类型）\n```\n\n结果：\n\n```\ncom.thoughtworks.go.config.rules.AbstractDirective(DirectiveType, DirectiveType, String, String, String)\n- fields: action:String, type:String, resource:String, configErrors:ConfigErrors, directiveType:DirectiveType\n- methods: validate(ValidationContext): void, isInvalid(String, List\u003CString>): boolean, matchesAction(String): boolean, matchesType(Class\u003C? extends Validatable>): boolean, matchesResource(String): boolean, errors(): ConfigErrors, addError(String, String): void, equals(Object): boolean, action(): String, type(): String, resource(): String, hashCode(): int, hasErrors(): boolean, getDirectiveType(): DirectiveType\n```\n\n### 其它：核心代码逻辑\n\n```kotlin\nval javaProcessor = JavaProcessor(file.readText())\nval shotClass = javaProcessor.toShortClass() ?: return@forEach\n\njavaProcessor\n   .removePackage()\n   .removeAllImport()\n   .removeLicenseInfoBeforeImport()\n\njavaProcessor.splitMethods().forEach { (key, value) ->\n   CodegenPrompt(\n       instruction = \"实现方法 $key\",\n       input = shotClass.toString(),\n       output = value\n   ).let { prompt ->\n       val output = Json.encodeToString(prompt)\n       File(\"$targetPath${key}.json\").writeText(output)\n   }\n}\n```\n\n## 测试代码生成\n\n基本思路\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_readme_9304989bf9f6.jpeg)\n\n语法分析思路：\n\n- 方式 1 - 在时间有限的情况下，基于 OpenAI 的数据来完善。但是，OpenAI 编写的测试用例不一定靠谱，所以让他生成业务代码。\n- 方式 2 - 在时间充裕的情况下，可以分析 AST 来合并第一和第二步，也是比较合理的方案，毕竟 OpenAI 的 API 很贵。\n\n### 步骤 1. 生成测试代码\n\n1. 下载 GitHub 上的项目（需要包含测试用例）\n2. 建立每个项目的 `src\u002Fmain` 下的 Java 文件 map，如果同时存在对应的测试文件，则拉入的数据集中。\n3. 并生成每个测试对应的类的基本信息（以减少 OpenAI Token 使用）：\n\n```\norg.unitmesh.processor.TestClass(String, Int)\n- fields: field1:String, field2:Int\n- methods: method1(String, Int): String, method2(): Int\n```\n\n4. 按测试用例（即 @Test 方法）拆分每个测试文件，拆成 N 个（即 test1、test2 是两个不同的数据）\n\n```java\nclass TestProcessorTest {\n    @Test\n    void test1() {\n    }\n    \n    @Test\n    void test2() {\n    }\n}\n```\n\n最后，生成的数据如下：\n\n{\"classInfo\": \"com.thoughtworks.go.security.AESEncrypter(AESCipherProvider)\\n- fields: ENCODER:Base64.Encoder, DECODER:\nBase64.Decoder, cipherProvider:AESCipherProvider, ivProvider:IVProvider\\n- methods: createIVProviderInstance():\nIVProvider, canDecrypt(String): boolean, encrypt(String): String, decrypt(String): String, createSecretKeySpec():\nSecretKeySpec\", \"testMethod\": \"public class AESEncrypterTest {\\n\\n private AESEncrypter aesEncrypter;\\n\\n @Test\npublic void shouldGenerateEncryptedText() throws CryptoException {\\n String encrypt = aesEncrypter.encrypt(\\\"p@ssw0rd\\\");\\n\nassertThat(encrypt).startsWith(\\\"AES\\\");\\n assertThat(encrypt.split(\\\":\\\")).hasSize(3);\\n }\\n}\\n\", \"id\": \"task_0\"}\n\n### 步骤 2. 借助 OpenAI Davinci 编写实现代码（可选）\n\n详细代码见：[test-to-code.py](code\u002Ftest-to-code.py)\n\n1. 将上面的数据转换为 JSONL，合并成 prompt。\n2. 让 Davinci 完成填空题。\n\n最后生成的 prompt 示例如下：\n\n```markdown\n你是一名程序员，正在使用 TDD 方法实现一个方法。以下是需求：\n\n1. 根据以下类信息和测试代码编写方法。\n2. 尽量考虑边界情况。\n3. 只需返回代码，无需解释。\n\n类信息：\n\n###  \n\nio.github.robwin.swagger.test.AbstractContractValidator()\n\n- 方法：findExpectedPaths(Swagger, SwaggerAssertionConfig): Map\u003CString,Path>, getPathsIncludingBasePath(Swagger):\n  Map\u003CString,Path>, getPathsWithPrefix(Swagger, String): Map\u003CString,Path>, isBlankOrSlash(String): boolean\n\n###\n\n测试代码：\n\n###  \n\n\u002F**\n\n* 测试 AbstractContractValidator。\n  *\u002F\n  @RunWith(Enclosed.class)\n  public class AbstractContractValidatorTest {\n\n  \u002F**\n    * 测试 getPathsIncludingBasePath()。\n      *\u002F\n      public static class GetPathsIncludingBasePath {\n\n      @Test\n      public void shouldReturnPathsPrefixedIfBasePathSet() {\n      \u002F\u002F 给定\n      Swagger swagger = buildSwaggerFrom(\"\u002Fswagger.json\");\n      \u002F\u002F 当\n      Map\u003CString, Path> paths = new DummyValidator().getPathsIncludingBasePath(swagger);\n      \u002F\u002F 则\n      paths.entrySet().forEach(e -> assertThat(e.getKey(), startsWith(swagger.getBasePath())));\n      }\n      }\n\n  \u002F**\n    * 测试 findExpectedPaths()。\n      *\u002F\n      public static class FindExpectedPaths {\n      }\n\n  private static class DummyValidator extends AbstractContractValidator {\n  }\n  }\n\n###\n\n```\n\n## 文本转代码\n\n使用的是已有的 Datasets，包括：\n\n- [text-to-sql](datasets\u002Fsql) - 用于将自然语言转换为 SQL 语句的数据集\n- [text-to-code](datasets\u002Ftext-to-code) - 用于将自然语言转换为代码的数据集\n\n不过，这两个代码集质量都不高，但是基本可用。\n\n## 文本生成 repository\n\n### 数据准备\n\n1. 解析 Kotlin 项目代码，提取出所有的类和方法。\n2. 建立 Repository 方法与类型的对应关系。\n3. 生成 Repository 方法的基本信息。\n4. 调用 OpenAI 生成数据\n\n格式如下：\n\n```\ninstruction:\n我想查找特定月份（monthly_id）下在某个日期（date）之前的所有费用（expense），以方便了解特定月份内的开销情况。\ninput:\ndata class ExpenseEntity(....)\n\noutput:\n@Query(\"SELECT * FROM expense WHERE monthly_id = :recurringExpenseId AND date \u003C :beforeDate\")\nsuspend fun getAllExpensesForRecurringExpenseBeforeDate(recurringExpenseId: Long, beforeDate: LocalDate): List\u003CExpenseEntity>\n```\n\n### 输出示例：\n\n```\nevaluate(\"text to kotlin repository with class\", \"我想查询指定年龄的用户（User）的博客数量。\\n ###data class User(var age: Int, \nval blogId: Int) data class Post(val title: String)###\", 0.1, 0.75, 40, 4, 512)\n\n@Query(\"SELECT COUNT(*) FROM User WHERE age = :age\")\nabstract fun getBlogCount(age: Int): Long\n```\n\n## 领域知识\n\n### 训练 1：PDF\n\n基本思路：\n\n1. 将 PDF 文件转换为文本\n2. 将文本按标题的方式拆分成 `instruction` 和 `output` 两部分，`input` 为 null。\n\n示例：\n\n```\ninstruction: 介绍一下财通财通宝的基金管理人、基金托管人在履行各自职责的过程中，违反《基金法》?\n\n（一）基金管理人、基金托管人在履行各自职责的过程中，违反《基金法》等法律法规的规定或者基金合同约定， 给基金财产或者基金份额持有人造成损害的，\n应当分别对各自的行为依法承担赔偿责任；因共同行为给基金财产或者基金份额持有人造成损害的，应当承担连带赔偿责任，对 损失的赔偿，仅限于直接损失。\n但是发生下列情况，当事人可以免责：  1.基金管理人及基金托管人按照中国证监会的规定或当时有效的法律法规的作为或不作为而造成的损失等； \n 2.基金管理人由于按照基金合同规定的投资原则而行使或不行使其投资权而造成的损失等；  3.不可抗力。  \n```\n\n# 训练与结果\n\n## 基于 Meta 的 Llama 训练 LoRA\n\n训练：\n\n- 方式 1：直接使用：[alpaca-lora.ipynb](alpaca-lora.ipynb)\n- 方式 2：直接使用：[OpenBayes 容器](https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fphodal\u002Fcontainers\u002FJBx5YD7HTdS) （PS：使用我的专用邀请链接，注册\n  OpenBayes，双方各获得 60 分钟 RTX 3090 使用时长，支持累积，永久有效：\n  https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU) ）\n\n训练时间：\n\n- 3400+ 用户故事，约 25 分钟\n- 8000+ 测试代码，约 1 小时\n- 10000+ 代码辅助生成，约 1.5 小时\n- 20000+ 代码辅助生成，约 3 小时\n- 40000+ 代码辅助生成，约 6 小时\n\n相关背景：\n\n1. 基础模型：Meta 开源 LLaMA 系列模型：[llama-7b-hf](https:\u002F\u002Fhuggingface.co\u002Fdecapoda-research\u002Fllama-7b-hf)\n2. Stanford Alpaca: [https:\u002F\u002Fgithub.com\u002Ftatsu-lab\u002Fstanford_alpaca](https:\u002F\u002Fgithub.com\u002Ftatsu-lab\u002Fstanford_alpaca)\n3. Alpaca Lora：[https:\u002F\u002Fgithub.com\u002Ftloen\u002Falpaca-lora](https:\u002F\u002Fgithub.com\u002Ftloen\u002Falpaca-lora)\n\n由于，我们的目标不是对模型调优、生成通用的模型，而是训练特定用途的 Lora。因此，我们没有加入：Stanford Alpaca 中的数据，\n故所需要时间更短，如 8000+ 测试代码只需要 1 小时，3400+ 的用户故事只需要 25 分钟。\n\n### 训练 1：测试代码生成\n\n训练结果（LoRA）见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.1](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.1)\n\n```\nprint(evaluate(\"write test\", \"\"\"\npublic Set\u003CString> listFilesUsingJavaIO(String dir) {\n    return Stream.of(new File(dir).listFiles())\n      .filter(file -> !file.isDirectory())\n      .map(File::getName)\n      .collect(Collectors.toSet());\n}\n\"\"\", 0.1, 0.75, 40, 4, 512))\n\n## Output:\n\npublic class ListFilesUsingJavaIOTest {\n    @Test\n    public void shouldListFilesUsingJavaIO() {\n        Set\u003CString> files = ListFilesUsingJavaIO.listFilesUsingJavaIO(new File(\"dir\"));\n        assertThat(files, containsInAnyOrder(\"file1\", \"file2\", \"file3\"));\n    }\n}\n```\n\n### 训练 2：拆分用户故事\n\n训练结果（LoRA）见：[https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.2](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases\u002Ftag\u002Fv0.0.2)\n\n注意：\n\n1. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n2. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n3. 如果数据集太小，设置一下 val_set_size，比如：`--val_set_size 500`\n\n**示例输出**：\n\n```\nprint(evaluate(\"create Agile user story for following topic: \", \"购买电影票\", 0.1, 0.75, 40, 4, 512))\n\n用户故事：可以购买电影票\n作为一个电影票购买者\n我想在购买电影票应用中购买电影票\n以便于我可以购买电影票\nAC 1: 电影票购买者可以在购买电影票应用中购买电影票\n假设 电影票购买者已经登录购买电影票应用\n当 电影票购买者点击“购买电影票”按钮\n于是 电影票购买者可以在购买电影票应用中购买电影票\nAC 2: 电影票购买者可以在购买电影票应用中查看购买记录\n假设 电影票购买者已经登录购买电影票应用\n当 电影票购买者点击“查看购买记录”按钮\n于是 电影票购买者 kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 3: 电影票购买者 kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 4: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 5: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 6: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 7: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 8: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 9: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 10: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 11: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 12: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 13: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 14: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 15: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 16: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 17: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 18: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAC 19: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungen sehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 20: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 21: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 22: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 23: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 24: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 25: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 26: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungssehen\nAC 27: The Käufer kannn in der Kauf von Film Tickets App kaufen und die Kaufaufzeichnungsseen\nAssumption: Der Käufer hat bereits den Kauf von Film Tickets App eingeloggt\nWhen the Käufer den Knopf “View Purchase Records” drückt\nThen the K…\n\n### 用户故事生成\n\n示例 1：\n\n```\nevaluate(\"指令：创建用户故事\\n输入：电影网站：查看订单详情 \\n回答：\")\n\n指令：创建用户故事\n输入：电影网站：查看订单详情 \n回答：\n\n用户故事：可以查看订单详情  \n作为一个电影网站的用户  \n我希望查看订单详情  \n这样我就可以了解订单的详细信息，比如订单号、订单状态、订单内容等。\n\nAC 1：用户可以查看订单详情  \n假设 用户已经登录  \n当 用户点击“查看订单详情”按钮  \n于是 用户可以成功查看订单详情，包括订单号、订单状态、订单内容等。\n\nAC 2：用户可以查看订单详情  \n假设 用户没有登录  \n当 用户点击“查看订单详情”按钮  \n于是 系统会提示用户先登录，登录后才能查看订单详情，包括订单号、订单状态、订单内容等。\n```\n\n示例 2：\n\n```\nevaluate(\"指令：创建用户故事\\n输入：团购网站：用户注册\\n回答：\")\n\n指令：创建用户故事  \n输入：团购网站：用户注册  \n回答：  \n团购网站的用户注册故事：\n\n作为一个团购网站的用户  \n\n我希望注册一个团购网站的用户账号  \n\n这样我就可以使用团购服务，比如购买商品、服务等。\n\nAC 1：团购网站的用户注册账号  \n假设 用户输入了正确的注册信息  \n当 用户提交注册信息  \n于是 用户可以成功注册一个团购网站的用户账号  \n\nAC 2：团购网站的用户注册账号  \n假设 用户输入了错误的注册信息  \n当 用户提交注册信息  \n于是 系统会提示用户输入正确的注册信息，并允许用户重新提交注册信息  \n```","# unit-minions 快速上手指南\n\nunit-minions 是一个专注于**AI 研发提效**的开源项目，旨在通过训练 LLaMA 和 ChatGLM 等大模型的 LoRA（Low-Rank Adaptation）适配器，实现代码辅助生成、测试代码生成、用户故事拆分及文本转 SQL 等特定研发场景的智能化。\n\n## 环境准备\n\n在开始训练或使用模型前，请确保满足以下软硬件要求：\n\n### 系统要求\n- **操作系统**: Linux (推荐 Ubuntu 20.04+) 或 macOS\n- **GPU**: 支持 CUDA 的 NVIDIA 显卡（显存建议 16GB 以上，用于微调训练）\n- **Python**: 3.8 或更高版本\n\n### 前置依赖\n本项目主要依赖 PyTorch、Transformers 及 PEFT 库。建议使用 Conda 管理环境。\n\n```bash\n# 创建虚拟环境\nconda create -n unit-minions python=3.9\nconda activate unit-minions\n\n# 安装基础深度学习框架（根据 CUDA 版本调整）\npip install torch torchvision torchaudio --index-url https:\u002F\u002Fdownload.pytorch.org\u002Fwhl\u002Fcu118\n\n# 安装核心依赖库\npip install transformers datasets peft accelerate bitsandbytes\npip install jupyter notebook\n```\n\n> **提示**：若无本地 GPU 资源，项目推荐使用国内云 GPU 平台 **OpenBayes** 进行在线训练，已预置相关镜像和环境。\n\n## 安装步骤\n\n本项目主要为研究代码与数据集，无需复杂的安装包，直接克隆仓库即可使用。\n\n```bash\n# 克隆项目代码\ngit clone https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions.git\ncd unit-minions\n\n# 安装项目特定依赖（如有 requirements.txt）\npip install -r requirements.txt\n```\n\n若需使用数据预处理工具，可额外克隆配套仓库：\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Fminions-data-prepare.git\n```\n\n## 基本使用\n\n本项目的核心使用流程分为**数据准备**、**模型训练**和**推理应用**。以下以“代码辅助生成”为例，展示最简使用路径。\n\n### 1. 数据准备\n训练高质量的 LoRA 需要标准化的指令数据（Instruction Data）。项目定义了标准的 JSON 格式：\n\n```json\n{\n  \"instruction\": \"Implement the method findAll\",\n  \"input\": \"PostService(PostRepository, UserRepository)\\n- fields: postRepository:PostRepository...\\n- methods: findAll(): List\u003CPost>\",\n  \"output\": \"public List\u003CPost> findAll() { return postRepository.findAll(); }\"\n}\n```\n\n你可以使用 `minions-data-prepare` 工具从 GitHub 项目提取代码并生成此类数据，或直接使用项目 Release 中提供的公开数据集。\n\n### 2. 模型训练 (LoRA)\n项目提供了 Jupyter Notebook 以便快速启动训练。\n\n**启动训练：**\n```bash\n# 启动 Jupyter Notebook\njupyter notebook\n```\n\n在浏览器中打开对应的 Notebook 文件：\n- **LLaMA 系列**: 运行 `alpaca-lora.ipynb`\n- **ChatGLM 系列**: 运行 `chatglm-tuning.ipynb`\n\n**关键配置示例 (Python 代码片段):**\n在 Notebook 中，你需要指定基础模型路径和输出目录：\n\n```python\nfrom peft import LoraConfig, get_peft_model\n\n# 配置 LoRA 参数\nconfig = LoraConfig(\n    r=8, \n    lora_alpha=32, \n    target_modules=[\"q_proj\", \"v_proj\"], # 根据模型架构调整\n    lora_dropout=0.05, \n    bias=\"none\", \n    task_type=\"CAUSAL_LM\"\n)\n\n# 加载基础模型并应用 LoRA\nmodel = get_peft_model(base_model, config)\n```\n\n点击 `Run All` 即可开始微调。训练完成后，适配器权重将保存至指定目录。\n\n### 3. 推理与验证\n训练完成后，加载微调后的 LoRA 权重进行推理测试：\n\n```python\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\nfrom peft import PeftModel\n\n# 加载基础模型\nbase_model_name = \"decapoda-research\u002Fllama-7b-hf\" # 或 chatglm-6b\ntokenizer = AutoTokenizer.from_pretrained(base_model_name)\nbase_model = AutoModelForCausalLM.from_pretrained(base_model_name)\n\n# 加载训练好的 LoRA\nmodel = PeftModel.from_pretrained(base_model, \".\u002Fpath_to_your_lora_output\")\nmodel.eval()\n\n# 构造输入\nprompt = \"\"\"Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.\n\n### Instruction:\nImplement the method findAll\n\n### Input:\nPostService(PostRepository)\n- methods: findAll(): List\u003CPost>\n\n### Response:\"\"\"\n\ninputs = tokenizer(prompt, return_tensors=\"pt\")\noutputs = model.generate(**inputs, max_new_tokens=200)\nprint(tokenizer.decode(outputs[0], skip_special_tokens=True))\n```\n\n### 4. 参考资源\n- **训练好的模型**: 查看项目 [Releases](https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases) 页面下载二进制文件。\n- **视频教程**: 项目主页提供了关于代码生成、测试生成及需求拆分的详细 Bilibili 演示视频。\n- **云端体验**: 注册 [OpenBayes](https:\u002F\u002Fopenbayes.com\u002Fconsole\u002Fsignup?r=phodal_uVxU) 可直接使用预置的 `llama-7b-hf` 或 `chatglm-6b` 环境复现结果。","某电商团队的后端工程师正面临紧急需求，需要在两天内为新的“会员积分兑换系统”完成从需求拆解到核心代码及测试用例的全套开发工作。\n\n### 没有 unit-minions 时\n- **需求转化低效**：产品经理提供的粗略业务描述，需要工程师手动花费数小时拆解为标准的用户故事和开发任务，容易遗漏边界条件。\n- **重复编码耗时**：编写基础的 Repository 层代码和复杂的 SQL 查询逻辑占据了大量时间，挤占了核心业务逻辑的思考空间。\n- **测试覆盖不足**：由于工期紧张，往往只能手动编写少量核心测试用例，导致边缘场景的单元测试缺失，上线风险高。\n- **上下文切换频繁**：在查阅文档、编写 SQL、切换 IDE 写代码之间反复跳转，严重打断开发心流，降低整体产出效率。\n\n### 使用 unit-minions 后\n- **故事自动拆解**：利用训练好的 LoRA 模型，一键将模糊的业务需求转化为结构清晰、包含验收标准的用户故事列表，准确率显著提升。\n- **代码智能生成**：通过自然语言描述直接生成符合团队规范的 Repository 实现代码及对应的 SQL 语句，减少 80% 的样板代码编写时间。\n- **测试同步完备**：针对生成的业务代码，自动产出高覆盖率的单元测试用例，确保逻辑健壮性，让工程师敢于快速提交代码。\n- **流程无缝衔接**：在统一的微调模型辅助下，从需求到代码再到测试的流转更加顺畅，工程师可专注于架构设计与难点攻关。\n\nunit-minions 通过定制化训练研发专用模型，将原本割裂的开发环节串联成自动化流水线，真正实现了从“手写代码”到“指挥 AI 编程”的效能跃迁。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Funit-mesh_unit-minions_7bafd182.png","unit-mesh","AI4SE - Asymptotic AI programming","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Funit-mesh_7de67081.jpg","探索 AIGC 时代的新软件架构范式。Exploring NextGen Software Generative Architectural Paradigms  with GenAI",null,"https:\u002F\u002Funitmesh.cc\u002F","https:\u002F\u002Fgithub.com\u002Funit-mesh",[81,85],{"name":82,"color":83,"percentage":84},"Jupyter Notebook","#DA5B0B",97.6,{"name":86,"color":87,"percentage":88},"Python","#3572A5",2.4,1109,125,"2026-03-28T07:51:17",4,"未说明","训练必需（项目使用 OpenBayes 云 GPU）；支持 LLaMA-7B 和 ChatGLM-6B 模型进行 LoRA 微调",{"notes":96,"python":93,"dependencies":97},"本项目主要提供训练教程、数据集和 Notebook 脚本，未直接列出本地运行的具体环境配置。官方推荐使用 OpenBayes 云平台进行训练，该平台预置了 LLaMA-7B 和 ChatGLM-6B 模型环境。若需本地复现，需自行搭建对应大模型（LLaMA 或 ChatGLM）的 LoRA 微调环境（通常涉及 PyTorch, Transformers, PEFT 等库）。代码示例中包含 Kotlin 逻辑，数据准备阶段可能需要 Java\u002FKotlin 环境。",[93],[14,35],[100,101],"llm","lora","2026-03-27T02:49:30.150509","2026-04-09T10:05:40.895088",[105,110,115,120,125,130,135,140,145,150],{"id":106,"question_zh":107,"answer_zh":108,"source_url":109},26104,"Text-to-SQL 模型训练完成后，推理输出异常或无效，如何解决？","这通常是由于依赖包版本冲突导致的。请尝试将 lora 包中的 peft 和 transformers 库替换为兼容版本，然后重新安装依赖并重新训练模型。此外，检查生成的 adapter_model.bin 文件大小，如果文件不是十几兆（例如只有几 KB 或几百 KB），则说明训练未成功写入权重，必须修改 requirements.txt 中的版本限制后重训。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F6",{"id":111,"question_zh":112,"answer_zh":113,"source_url":114},26105,"在 Colab A100 上运行 evaluate 时无输出，且推理速度过慢（约 35 秒\u002F条），如何优化？","无输出通常是 transformers 库的版本问题，请更新或调整版本以解决。关于推理速度慢的问题，可以尝试降低计算精度（如使用 FP16 或 INT8）来提升效率。如果数据本身没有问题但推理依然缓慢，建议前往 alpaca-lora 官方仓库提交 Issue 寻求针对该框架的特定优化方案。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F13",{"id":116,"question_zh":117,"answer_zh":118,"source_url":119},26106,"OpenBayes 平台上找不到 llama-test 相关文件或内容怎么办？","平台上的预置内容可能已变动或缺失。您可以直接将本项目仓库中的 notebook 文件复制到您的 OpenBayes 环境中运行，这是最直接的替代方案。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F1",{"id":121,"question_zh":122,"answer_zh":123,"source_url":124},26107,"使用 LoRA 训练 ChatGLM 时，加载权重与不加载权重的测试结果一致，原因是什么？","这种情况通常表明 LoRA 权重未正确加载或合并到基座模型中，或者是特定于 ChatGLM 实现的兼容性问题。建议优先联系 ChatGLM 官方社区或查看其官方文档以获取针对该模型架构的正确 LoRA 加载方式。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F15",{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},26108,"训练数据中 `classInformation` 字段的格式有什么作用？是否可以省略？","`classInformation` 字段旨在模拟低成本的 Copilot 场景，通过传递上下文信息（如类的方法列表）来辅助模型生成代码。如果不按照此格式提供上下文，模型可能需要更多的训练数据才能学习到相同的逻辑，或者在推理时无法获得足够的上下文支持。用户需根据是否需要在推理时传递完整方法列表来权衡数据格式。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F2",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},26109,"Hugging Face 上的 Llama 模型地址无法打开或模型似乎已更换，如何处理？","由于 Llama 系列模型更新频繁，去年的模型链接和今年的可能不同。建议不要依赖旧的固定链接，而是结合 Hugging Face 上最新的模型发布情况，自行查找并适配最新版本的模型地址进行尝试。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F16",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},26110,"Text-to-SQL 数据集的具体来源链接在哪里？","项目中使用的一些原始数据可能不够可靠。推荐参考以下 Hugging Face 数据集作为替代或补充：https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002FAditya011\u002Fautotrain-data-nl-to-sql","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F14",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},26111,"是否有可以直接体验的项目 Demo？","目前主要通过自行运行代码来体验。您可以访问项目的 Release 页面（https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Freleases）获取相关资源，并按照文档在本地或云端环境中部署运行。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F12",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},26112,"使用原生 Alpaca+LoRA 训练自定义数据集时 Loss 不收敛（停留在 0.8 左右），如何解决？","这是一个已知问题，通常与环境配置或数据格式有关。请参考项目中其他关于训练不收敛的 Issue（如 Issue #7）排查具体原因，重点检查 bitsandbytes 库的兼容性以及数据集格式是否符合要求。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F11",{"id":151,"question_zh":152,"answer_zh":153,"source_url":154},26113,"在 RTX3090 (OpenBayes) 上运行训练脚本时报 bitsandbytes 错误或无结果，怎么解决？","这通常是由于 CUDA 环境路径配置错误或 bitsandbytes 库版本不匹配导致的。错误日志中常出现找不到 libcudart.so 或非预期路径的警告。请参考项目中关于训练报错的通用解决方案（如 Issue #7），确保 CUDA 库路径正确设置，并尝试重新安装与当前 CUDA 版本匹配的 bitsandbytes 库。","https:\u002F\u002Fgithub.com\u002Funit-mesh\u002Funit-minions\u002Fissues\u002F10",[156,160,165,170,175,180],{"id":157,"version":158,"summary_zh":77,"released_at":159},163502,"v0.0.6","2023-05-22T02:42:44",{"id":161,"version":162,"summary_zh":163,"released_at":164},163503,"v0.0.5","\u003Cimg width=\"818\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F231130548-9bffc3e8-95fa-4d64-9a8f-7da3eb8de800.png\">\n\nOpenAI 费用 \n\n\u003Cimg width=\"882\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F231165038-120da1e6-eb2e-4dd8-b5a7-8890cacb3203.png\">\n","2023-04-11T10:14:51",{"id":166,"version":167,"summary_zh":168,"released_at":169},163504,"v0.0.4","指令：“文本转 SQL”\n\n\u003Cimg width=\"672\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F230695808-8bfa806c-e838-4f7e-86fb-d5d2456451f4.png\">","2023-04-08T00:36:34",{"id":171,"version":172,"summary_zh":173,"released_at":174},163505,"v0.0.3","\r\n## 1万\r\n\r\n\u003Cimg width=\"829\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F230005957-b246ab79-1fbf-40c7-a01c-1b3bb4084a94.png\">\r\n\r\n## 2万\r\n\r\n![20k-code](https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F230121257-be3a3da6-7793-4765-a1a5-3a121f05b018.png)\r\n\r\n## 4万\r\n\r\n\u003Cimg width=\"787\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F230341909-591f2619-41b4-4f2e-a2e0-8dab81e1b63d.png\">\r\n\r\n\r\n","2023-04-05T07:00:10",{"id":176,"version":177,"summary_zh":178,"released_at":179},163506,"v0.0.2","\u003Cimg width=\"515\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F229832123-fbbba201-8c29-4381-9908-d94ed3d2748b.png\">\n","2023-04-04T14:54:02",{"id":181,"version":182,"summary_zh":183,"released_at":184},163507,"v0.0.1","测试用例与代码约 8000 个，使用机器 A100 GPU \u002F 小时\n\n\u003Cimg width=\"525\" alt=\"图片\" src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F472311\u002F229356206-589317ad-14ee-4416-87fd-a367c44bd3c5.png\">\n","2023-04-02T13:36:58"]