TomHouse - TomHanck4
type: channel
link: http://blog.fangsiyuan.top/index.php/author/1/
description: TomHanck4
items: 如何使用 LoRA 微调 DeepSeek R1
items: 搭建开发环境
items: revit二次开发入门
items: BIM 工作组织
items: 项目一：Revit电缆自动布置
items: 第十四章结课考试
items: 第十三章综合项目--模拟打斗程序
items: 第十二章文件处理
items: 第十一章调试与异常
items: 第十章集合与泛型

如何使用 LoRA 微调 DeepSeek R1
type: item
date: 2025-06-07T18:03:00+08:00
description: How to Fine-Tune DeepSeek R1 Using LoRA如何使用 LoRA 微调 DeepSeek R1This guide walks through fine-tuning DeepSeek R1 using LoRA, a Parameter-Efficient Fine-Tuning (PEFT) method that updates only a small portion of model parameters to improve function calling. It covers dataset preparation, model configuration, and training using Hugging Face tools, making fine-tuning efficient and resource-friendly. The result is a model that performs function calls accurately following the dataset design. 本指南介绍如何使用 LoRA 对 DeepSeek R1 进行微调，LoRA 是一种参数高效微调 （PEFT） 方法，仅更新一小部分模型参数以改进函数调用。它涵盖了数据集准备、模型配置和使用 Hugging Face 工具进行训练，使微调变得高效且资源友好。结果是一个按照数据集设计准确执行函数调用的模型。DeepSeek is quickly gaining attention for its impressive performance and cost efficiency, so I decided to write about fine-tuning it. In this post, we’ll work with a smaller DeepSeek model and demonstrate how to apply supervised fine-tuning (SFT) using a Parameter-Efficient Fine-Tuning (PEFT) approach via Low-Rank Adaptation (LoRA). We’ll be fine-tuning the model on a function calling dataset, showing how you can quickly and efficiently adapt large language models (LLMs) to improve their function calling capabilities. With this pipeline, you can easily swap out the dataset or model to fine-tune models on specific domains. DeepSeek 因其令人印象深刻的性能和成本效益而迅速受到关注，因此我决定写一篇关于微调它的文章。在本文中，我们将使用一个较小的 DeepSeek 模型，并演示如何通过低秩自适应 （LoRA） 使用参数高效微调 （PEFT） 方法应用监督微调 （SFT）。我们将在函数调用数据集上微调模型，展示如何快速有效地调整大型语言模型 （LLM） 以改进其函数调用功能。使用此管道，您可以轻松换出数据集或模型，以微调特定域上的模型。What is Parameter-Efficient Fine-Tuning (PEFT) and LoRA?什么是参数高效微调 （PEFT） 和 LoRA？Full fine-tuning of LLMs can be resource intensive. PEFT techniques, such as LoRA, offer an elegant solution by adjusting only a small subset of parameters. LoRA works by freezing the model’s weights and injecting trainable, low-rank matrices into key layers. 对 LLM 进行全面微调可能会占用大量资源。PEFT 技术（如 LoRA）通过仅调整一小部分参数来提供优雅的解决方案。LoRA 的工作原理是冻结模型的权重，并将可训练的低秩矩阵注入关键层。Consider a weight matrix ( W ) in a Transformer layer. Instead of updating ( W ) …

搭建开发环境
type: item
date: 2024-12-10T13:38:24+08:00
description: Revit二次开发环境搭建Visual studio下载Visual studio，可以通过百度，在官网 https://visualstudio.microsoft.com/zh-hans/下载社区版

revit二次开发入门
type: item
date: 2024-05-22T08:23:23+08:00
description: 安装必要的工具：安装Revit和Visual Studio。下载并安装Revit API SDK（通常包含在Revit的安装文件中）。创建一个新的Revit插件项目：打开Visual Studio，创建一个新的C#类库项目。添加对RevitAPI.dll和RevitAPIUI.dll的引用（这些文件通常位于Revit安装目录下）。编写简单的插件：创建一个实现 IExternalCommand 接口的类，并实现 Execute 方法。这个方法是Revit调用你的插件时执行的入口点。using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; [Transaction(TransactionMode.Manual)] public class MyFirstCommand : IExternalCommand { public Result Execute( ExternalCommandData commandData, ref string message, ElementSet elements) { TaskDialog.Show("Hello", "Hello Revit!"); return Result.Succeeded; } }编译并部署插件：编译项目，生成的DLL文件就是你的插件。在Revit安装目录下创建一个名为 Addins 的文件夹，并在其中创建一个 .addin 文件，描述你的插件。<?xml version="1.0" encoding="utf-8" standalone="no"?> <RevitAddIns> <AddIn Type="Command"> <Name>MyFirstCommand</Name> <Assembly>C:\Path\To\Your\DLL\YourPlugin.dll</Assembly> <AddInId>12345678-1234-1234-1234-123456789012</AddInId> <VendorId>VENDOR_ID</VendorId> <VendorDescription>Your company description</VendorDescription> </AddIn> </RevitAddIns>运行插件：打开Revit，插件会在对应的菜单或工具栏中出现，点击它就可以运行你编写的代码。

BIM 工作组织
type: item
date: 2023-09-21T10:13:00+08:00
description: 一、项目 BIM 团队组织架构根据项目BIM技术应用目标及团队整体能力，项目BIM团队可分以下两种模式：BIM型BIM团队和项目型BIM团队。1、BIM型BIM团队在实施过程中，项目建立专职BIM团队，负责建模与模型维护，在应用的过 程中发现问题，由具有丰富现场施工经验的土建、机电、精装修、幕墙、景观等专业成员解决问题，再由BIM团队在模型中执行，形成相关的文件与成果辅助现 场施工。这种模式的实施流程路线长，项目人员、设备等投入比较大，只能在BIM 推广阶段、项目初期不具备全员应用BIM能力的情况下应用，最终将逐步由项目型BIM型团队来取代。其组织架构如下图所示。 2、项目型BIM团队项目实施过程中不组建专门的BIM实施团队，将BIM职能融入到每个部门的管理流程中，项目全员或者是项目团队中成员一人多职，转变原有工作模式，各系统员工，直接作为BIM执行落实人员，双重岗位，对项目BIM需求把握更精准，最终实现项目BIM工作的全员参与。其组织架构如下图所示。

项目一：Revit电缆自动布置
type: item
date: 2022-06-21T15:29:00+08:00
description: 项目一：Revit电缆自动布置程序开发的流程需求认识》设计规划》分析讨论》编写程序》测试检验需求认识（Requirement）。了解程序所要解决的问题是什么，有哪些 输入 及 输出 等。 设计规划（Design and Plan）。根据需求选择适合的数据结构，并以任何的表示方式 写一个算法 以解决问题。 分析讨论（Analysis and Discussion）。思考其他可能合适的算法及数据结构，再选择适当的目标。 编写程序（Coding）。把分析的结论写成初步的 程序代码 。 测试检验（Verification）。最后必须确认程序的输出是否符合需求，这个步骤细步地执行程序并进行许多的 相关测试 。分解实现步骤获取起点与终点间路径对桥架中心线进行坐标变换利用变换后的直线绘制线管延伸平行线管、使用弯头连接非平行线管Revit对应.NET Framework版本Revit版本.NET Framework版本Revit2016.NET Framework4.5Revit2017.NET Framework4.5.2Revit2018.NET Framework4.5.2Revit2019.NET Framework4.7Revit2020.NET Framework4.7Revit2021.NET Framework4.8Revit2022.NET Framework4.8添加引用添加引用RevitAPI.dll C:\Program Files\Autodesk\Revit 2019\RevitAPI.dllRevitAPIUI.dll C:\Program Files\Autodesk\Revit 2019\RevitAPIUI.dll 设置引用属性： 复制到本地—>False

第十四章结课考试
type: item
date: 2022-06-20T13:47:00+08:00
description: 一、选择题(每小题2分，共20分) 1、C#是一种面向( )的语言。 A.机器 B.过程 C.对象 D.事物 2、在C#中，定义派生类时，指定其基类应使用的语句是( )。 A.Inherits B.: C.Class D.Overrides 3、类的以下特性中，可以用于方便地重用己有的代码和数据的是( )。 A.多态 B.封装 C.继承 D.抽象 4、在Array类中，可以对一维数组中的元素进行排序的方法是( )。 A.Sort() B.Clear() C.Copy() D.int.Parse() 5、将变量从字符串类型转换为数值类型可以使用的类型转换方法是( )。 A.Str() B.Cchar() C.CStr() D.int.Parse() 6、在C#中定义接口时，使用的关键字是( )。 A.interface B.: C.class D.overrides 7、以下说法正确的是( )。 A.接口可以实例化 B.类只能实现一个接口 C.接口的成员都必须是未实现的 D.接口的成员前面可以加访问修饰符 8、下列关于抽象类的说法错误的是( )。 A.抽象类可以实例化 B.抽象类可以包含抽象方法 C.抽象类可以包含抽象属性 D.抽象类可以引用派生类的实例 9.下列关于重载的说法，错误的是( )。 A.方法可以通过指定不同的参数个数重载 B.方法可以通过指定不同的参数类型重载 C.方法可以通过指定不同的参数传递方式重载 D.方法可以通过指定不同的返回值类型重载 10.关于虚方法实现多态，下列说法错误的是( )。 A.定义虚方法使用关键字virtual B.关键字virtual可以与override一起使用 C.虚方法是实现多态的一种应用形式 D.派生类是实现多态的一种应用形式二、简答题(每小题5分，共20分)二、简答题(每小题5分，共20分) l、简述private、protected、public修饰符的作用 答： 2、构造方法的特征和作用 答： 3、简述接口和抽象类的区别。 答： 4、什么是序列化和反序列化？ 答： 三、编码题(每小题20分，共60分)1、编写一个C#应用程序，该程序包括3个类：Monkey类、People类和主类Program类（20分） 要求： (1)Monkey类中有个构造方法：Monkey(String name),并且有个public void Speak()方法，在speak方法中输出“咿咿呀呀......”的信息。 (2)People类是Monkey类的子类，在People类调用Monkey的构造方法，重写方法Speak(),在Speak方法中输出“小样的，不错嘛！会说话了！”的信息。 (3)在People类中新增方法void Think(),在Think方法中输出“别说话！认真思考！”的信息。 (4)在主类Program的Main方法中创建Monkey与People类的对象类测试这2个类的功能。 2、接口和抽象类(20) 汽车租赁公司，出租汽车种类有客车、货车和皮卡三种，每辆汽车除了具有编号、名称、租金三个基本属性之外，客车有载客量，货车有载货量，皮卡则具有载客量和载货量。 实现思路： l)需要定义两个接口，一个抽象类car,三个类：PassengerCar、Truck、Pickup.. 2)抽象类汽车Car:属性有：编号No,名称：Name,租金Rent 3)接口A:定义载货量方法ZaiHuoMethod() 4)接口B:定义载客量方法ZaiKeMethod() 5)子类客车PassengerCar继承汽车租赁公司Car,特有属性：载客量ZaiKe。继承接口B. 6)子类货车Truck继承汽车租赁公司Car,特有属性：载客量ZaiHuo。继承接口A. 7)子类货车Pickup继承汽车租赁公司Car,特有属性：载客量ZaiKe。载客量ZaiHuo.继承接口A和B. 8)在主函数中分别实例化三种汽车，并输出汽车的相关信息。 3、编一个程序，定义类Student和它的成员(私有字段、属性和方法)（学号，姓名，年龄、成绩、和输出个人所有信息的方法），用类Student生成三个对象s1,s2,s3,给对象s1,s2,s3的成员赋值后，将对象添加到泛型List<Student>中，通过foreach循环遍历输出对象的所有信息。(20分)

第十三章综合项目--模拟打斗程序
type: item
date: 2022-06-18T20:58:00+08:00
description: 第十三章综合项目--模拟打斗程序初级项目1.任务编号：2.任务名称：模拟一个打斗程序3.任务所属课程名称：类的定义、常用类、封装4.任务难度：C-简单5.任务描述：1)编写一个控制台程序，实现一个简单的战斗程序。 2)首先定义一个基类英雄(Hero) 属性：(名字Name、血量HP、蓝量MP,基础伤害下限BaseHurtLow,基础伤害上限BaseHurtHigh,基础防御下限BaseDefenseLow,基础防御上限Base DefenseHigh) 构造方法：默认属性：血量1000，蓝量800，基础伤害下限100，基础伤害上限300，基础防御下限0，基础防御上限100 方法：基础攻击Attack())基础防御Defense() 攻击伤害=攻击下限到攻击上限的一个随机值，攻击伤害应减去被攻击者的防御值 3)定义一个打斗(Battle)类，用于控制交战。 类中包涵有一个方法FightGo(Hero a,Hero b),主要作用是：a先开始攻击b一下，然后b攻击a一下，互相来回攻击直至某个对象生命值为0为止，每次攻击对方可以选择 基础攻击还是技能攻击，扣除的生命值是在自己Attacklow和AttackHigh之间取一个随机值。方法中显示每次来回打斗的信息，包括对方英雄名字，扣除的生命值及剩余 的生命值等。 在main方法中定义2个英雄Hero对象，执行FightGo方法，来完成一次战斗过程。6.提示 产生随机数可以参考Random类， 攻击进度控制System.Threading.Thread.Sleep(1000);/休眠1秒参考代码-初级先定义一个Hero类{hide}using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson13_1 { //首先定义一个基类英雄（Hero) /// /// 英雄类 /// class Hero { //属性:(名字Name、血量HP、蓝量MP,基础伤害下限BaseHurtLow,基础伤害上限BaswHurtHigh,基础防御下限BaseDefenseLow,基础防御上限BaseDefenseHigh) public string Name { get; set; } public int HP { get; set; } public int MP { get; set; } public int BaseHurtLow { get; set; } public int BaseHurtHigh { get; set; } public int BaseDefenseLow { get; set; } public int BaseDefenseHigh { get; set; } //默认属性：血量1000，蓝量800，基础伤害下限100，基础伤害上限300，基础防御下限0，基础防御上限100 public Hero(string Name) { this.Name = Name; this.HP = 1000; this.MP = 800; this.BaseHurtLow = 100; this.BaseHurtHigh = 300; this.BaseDefenseLow = 0; this.BaseDefenseHigh = 100; } /// /// 基础攻击 /// /// 攻击对象 public int Attack(Hero other) { Random rd = new Random(); //攻击伤害=攻击下限到攻击上限的一个随机值，攻击伤害应该减去被攻击者的防御值 int attackHurt = rd.Next(BaseHurtLow, BaseHurtHigh); return attackHurt - other.Denfense(); } /// /// 基础防御 /// /// <returns>英雄的防御值</returns> public int Denfense() { Random rd = new Random(); return rd.Next(BaseDefenseLow, BaseDefenseHigh); } } } {/hide}再定义一个Battle类{hide}using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson13…

第十二章文件处理
type: item
date: 2022-06-15T15:25:00+08:00
description: 第十二章文件处理目标了解System.IO命名空间文件和目录的常用操作方法使用文件流读写文本文件使用文件流读写二进制文件掌握打开文件、保存文件对话框的使用序列化和反序列化System.IO命名空间对文件操作System.lo命名空间操作各种流类数据System.Text命名空间关于字符编码的类File类文件操作静态类方法描述Create(string filePath)在指定路径下创建指定名称的文件Copy(string sourceFile,string desFile)按指定路径将源文件中的内容复制到目标文件中，如果目标文件不存在将新建目标文件Delete(string filePath)删除指定路径的文件Exists(string filePath)验证指定路径的文件是否存在Move(string sourceFile,string desFile)将指定文件移动到一个新的路径实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO;//读写文件流操作 namespace Lesson12_1 { class Program { static void Main(string[] args) { //File类内包含用于处理文件的静态方法 if (!File.Exists(@"D:\aa.txt")) { File.Create(@"D:\aa.txt"); } else { File.Copy(@"D:\aa.txt", @"D:\bb.txt"); } File.Delete(@"D:\aa.txt"); } } }using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Lesson12_2 { class Program { static void Main(string[] args) { //Directory类包含了处理目录的静态方法 Directory.CreateDirectory("@D:/测试目录"); } } }Directory类目录（文件夹）操作静态类方法描述CreateDirectory(string path)创建目录Dele(string path[,bool recursive])删除指定的目录，如果第二个参数为true则同时删除该目录下的所有文件和子目录Exists(string path)测试目录是否存在GetCurrentDirectory()获得应用程序的当前工作目录GetDirectories(string path)返回代表子目录的字符串数组GetFiles(string path)以字符串数组形式返回指定目录中的文件的名称Move(string sourcePath,string desPath)将目录及其内容移到指定的新位置读写文本文件文件流FileStream构造方法FileStream(filePath,FileMode,[FileAccess],[FileShare])filePath是string类型其余3个是枚举类流读取对象StreamWriter类流写入对象Write()WriteLine()Close()StreamReader类流读取对象ReadLine()ReadToEnd()Close()方法二进制文件的读写BinaryReader类BinaryWriter类实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Lesson12_3 { class Program { static void Main(string[] args) { //1、 FileStream fs = new FileStream(@"D:\二进制.data",FileMode.Create); //2、二进制写入对象 BinaryWriter bw = new BinaryWriter(fs); //3、写入二进制文件 for (int i = 0; i < 10; i++) { bw.Write(i); } C…

第十一章调试与异常
type: item
date: 2022-06-13T19:26:00+08:00
description: 第十一章调试与异常目标理解如何调试应用程序和排除错误掌握如何测试C#应用程序在程序中进行错误捕获和错误处理调试必要性在不熟应用程序前必须先对其进行调试在事物处理过程中，系统显示错误信息错误类型语法错误逻辑错误运行时错误调试过程观察程序运行时行为跟踪变量的值确定语义错误的位置VS中的操作步骤合理设置断点鼠标右键F9运行DebugF5F10单步执行VS.NET调试工具“局部变量”窗口“监视”窗口“即时”窗口“快速监视”窗口异常C#中的异常处理语句异常是由try语句来处理的try语句提供了一种机制来捕捉块执行过程中发生的异常C提供了3种异常处理结构：try-catchtry-catch-finallytry-finallytry块：try块监视可能抛出异常的语句。 try { //statements that may cause an exception }·try块管理包含在它内部的语句，定义与它相关的异常处理程序的范围。·try块必须至少有一个catch块。C#引发异常有以下两种方式使用显式throwi语句来引发异常控制权无条件转到处理异常的部分代码使用语句或表达式在执行过程中激发了某个异常的条件，使得操作无法正常结束，从而引发异常Try......Catch......Finally I/O设备异常 try { //程序代码 } catch(IOException E) { //错误处理代码 }System.Exception可以是系统中任何一种异常Try/catch/finally异常Catch可以多重Finally块一般清理内存用Try块中最后执行System.Exception属性含义Message描述当前异常对象的字符串Source引必当前异常对象的程序或对象名称StackTrace发异常时调用堆栈上的帧的字符串表示InnerException表示引发当前异常的内部异常对象常用异常类ArithmeticException数学运算、类型转换异常类InvalidCastException不正确转型异常。例如String转Decimal操作。IndexOutOfRangeException数组访问越界异常。NullReferenceException空引用对象异常。实例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace Lesson11_2 { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); try { //程序尝试执行的代码 list.Add(0); list.Add(1); list.Add("2"); list.Add(3); list.Add(4); Console.WriteLine(list[7]); foreach (int item in list) { Console.WriteLine(item); } } catch (IndexOutOfRangeException indexOut)//下标越界异常 { Console.WriteLine(indexOut.Message); } catch (Exception ex)//想要捕获的异常类型 { //错误处理代码 Console.WriteLine(ex.Message);//输出异常的信息 } finally { //不管有没有出现异常或者异常有没有被处理，都会最终执行的代码 Console.WriteLine("程序终止！"); } } } }Throw语句自定义异常当开发人员需要提供更为广泛的信息，或需要程序具有特殊功能时，就可以定义自定义异常。首先要创建一个自定义异常类，该类必须直接或间接派生自System.ApplicationException。using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lesson11_3 { /// /// 除数不能为0为异常 /// class MyCustomException:ApplicationException { public MyCustomException() { } public MyCustomException(str…

第十章集合与泛型
type: item
date: 2022-06-12T10:23:00+08:00
description: 第十章集合与泛型目标使用System.Array操作数组集合使用System.ArrayListi对象使用System.Hashtable对象理解泛型集合类List对象掌握Dictionary<TKey,TValue>掌握Lambda表达式IComparable接口的应用泛型接口IComparable接☐IComparer接口{dotted startColor="#ff6c6c" endColor="#1989fa"/}System.Array抽象的基类提供Createlnstance方法创建数组可以是多维的下标可设置System.Array的属性和方法属性描述Length得到数组所有维元素总个数的属性实例方法描述Copyto()将一个一维数组中的所有元素复制到另一个一维数组中GetLength()返回指定维的元素个数GetVaule通过索引返回指定元素的值SetVaule将数组中的指定元素设为指定值静态方法描述BinarySearch()使用二进制搜索方法搜索一维已排序数组中的某个值Clear()将数组中一组元素设为0或nullCopy()将数组中的一部分元素复制到另一个数组中CreateInstance()初始化Array类的实例Indexof()返回给定值在一维数组中首次出现的位置索引Last Indexof()返回给定值在一维数组中最后一次出现的位置索引Reverse()反转给定一维数组中元素的顺序Resize()将数组的大小更改为指定的新大小Sort()将数组中的元素进行排序，只能对一维数组从小到大排序实例 static void Main(string[] args) { //系统类可以按F12看定义 //用Array(抽象类)创建数组 Array arr = Array.CreateInstance(typeof(int),5);//创建int类型长度为5的数组 arr.SetValue(89, 0);//为数组元素设置值 arr.SetValue(95, 1); Console.WriteLine(arr.Length); foreach (int item in arr) { Console.WriteLine(item); } for (int i = 0; i < arr.Length; i++) { Console.WriteLine("数组中第{0}个元素是：{1}",i+1,arr.GetValue(i)); } }{dotted startColor="#ff6c6c" endColor="#1989fa"/}集合System.Collectionsi命名空间ArrayList类Hashtable类集合-ArrayList类容量可以根据需要动态扩展。通过设置ArrayList..Capacityl的值可以执行重新分配内存和复制元素等操作批量操作提供的方法在某个时间追加、插入或移出一组元素一维下标不可设置实例 static void Main(string[] args) { //实例化一个集合 ArrayList list = new ArrayList(4); list.Add(10); list.Add("FSY"); list.Add(101.101); People pl = new People(); list.Add(pl); foreach (var item in list) { Console.WriteLine(item); } list.Add("1"); //移除集合中的元素，集合容量不变 list.Remove(10); //如果添加元素时添加的个数大于容量时，容量会自动增加一倍 Console.WriteLine("集合的个数是"+list.Count); Console.WriteLine("集合的容量是"+list.Capacity); //将集合容量设置为集合的实际个数 list.TrimToSize(); Console.WriteLine("集合的个数是" + list.Count); Console.WriteLine("集合的容量是" + list.Capacity); }集合-Hashtable类将数据作为一组键值对来存储键索引器不可重复属性描述Count该属性用于获取哈希表中键值对的数量方法描述Add()将一个键值对添加到哈希表中ContainKey()测试键是否已经存在Remove()根据键将对应的键值对从哈希表移除实例 static void Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add(1,"FSY"); ht.Add(2, "ZLY"); ht.Add("FSY", …