revit-api-rag

项目地址: https://github.com/imkcrevit/revit-api-rag
训练地址 : https://www.autodl.com/
这是一个使用 revit api 的 RAG 项目,通过LLM的关键词转义辅助rerank和API部分的剪枝从而实现高准确度的内容输出
但是由于现在的prompt一次性输入的内容较多导致输出慢,所以再下次更新之后会增加SDK的精确剪枝和chromadb的优化

提示

  • 这是一个小型的 RAG 项目,可以切分 revit api 并制作 RAG 数据库
  • 消耗LLM token 需要获取代码文件

环境

由于我开发的较早,AutoDL中没有12.8的适配版本,所以,需要将cuda12.8手动安装到环境中适配5090,目前的话是可以直接适配到13.0 , 可以直接默认12.8启动,能够省掉很多由于cuda不适配导致的报错在这里插入图片描述

Revit 版本

2026

图形平台

  • https://www.autodl.com/
  • 显卡 : 5090
  • cuda : 12.8
  • 嵌入和重排模型 : QWen 0.6B
  • 嵌入数据库 : chromadb
  • 数据库 : sqlite

切分 RevitAPI 文件

请添加图片描述

上传文件

因为所有的文件都是在AutoDL中处理,所以通过云盘传输的方式,通过阿里云盘绑定到AutoDL中,但是注意数据要提前拆分完成,通过压缩包一次性传输,通过下载就可以把文件直接传递到服务器中
在这里插入图片描述

设置

  1. 获取 RevitAPI.chm 并用 7-zip 或其他工具解压
  2. 获取数据文件夹 -> ./html
  3. 使用 ./split_revit.ipynb 获取类数据
    • 类名
    • 类信息
    • 类摘要
    • 类备注
    • 参数
    • 异常
  4. 保存数据
    • name - info 嵌入并保存到 python_revit_train/chromadb0815_api_1.db
    • 其他内容保存到 python_revit_train/revit_api.db
      请添加图片描述

切分 SDK 示例代码

请添加图片描述

设置

  1. 查找所有文件夹
  2. 获取 ReadMe.rtf 和所有的 .cs 文件
  3. 使用 ./extra_data/ 获取所有代码
  4. 将数据保存到 ./extra_data/project_dataset.json
  5. 保存到 chromadb 数据库 python_revit_train/chromadb0818_code_1.db

RAG 中的工作流

请添加图片描述

设置

  1. 用户输入 : query: 创建结构柱

  2. 使用提示词设置检索用户输入 Keywords: structural columns, create, NewFamilyInstance, Level, XYZ, FamilySymbol

    f"""
    你是一位专业的BIM工程师,你精通Revit API,可以回答任何关于Revit API的问题。
    同时,你在C#和2D图形算法方面有很好的技术,你可以用C#编写代码来解决问题。
    如果用户的问题不是英文,你可以将其翻译成英文。
    
    你的思考链需要遵循以下步骤并进行检查:
    1. 理解用户问题,必要时将其翻译成英文。
    2. 使用提供的查询从Revit API数据库中检索相关信息。
    3. 生成有助于数据库找到最佳API参考的关键字。
    4. 需要为用户问题输出单行答案
    
    示例:
    用户问题: 结构柱着色的命令是什么?
    第一步:翻译成英文:"What is the command for coloring structural columns in Revit?"
    第二步:用户可能需要的API关键字:"structural columns, coloring Override Element Graphics"
    第三步:生成关键字:"structural columns, coloring Override Element Graphics , View Filter"
    第四步:单行输出答案。
    
    输出格式:
    
    Keywords: structural columns, coloring Override Element Graphics , View Filter , OverrideGraphicSettings ,  SetElementOverrides
    
    请记住:
    - 只在输出中提供关键字。
    - 不要包含任何额外的文本或解释。
    - 确保关键字与用户问题相关,并能帮助检索到最佳的API参考。
    - 关键字应简洁并与Revit API功能直接相关。
    - 避免使用通用术语
    
    """
    
  3. 嵌入检索查询

  4. python_revit_train/chromadb0818_code_1.dbpython_revit_train/chromadb0815_api_1.db 获取 top_k 结果

    • API : 30
    • 代码 : 5
  5. 通过查询重排,获取一半的结果

    • API : 15
    • 代码 : 3
  6. 使用回答提示词

    • 在这个提示词中,我告诉大语言模型需要根据四个设置进行思考,然后输出答案,用这种方式,可以让大语言模型重新检查其响应
    f"""
    你是一位专业的BIM工程师,你精通Revit API,可以回答任何关于Revit API的问题。
    同时,你在C#和2D图形算法方面有很好的技术,你可以用C#编写代码来解决问题。
    
    你需要基于以下几点来回答问题:
    1. 完整性:它包括从开始到提交的整个过程
    2. 专业性:正确处理Revit结构构件的特性
    3. 鲁棒性:它包括错误处理和边界条件检查
    4. 可扩展性:代码结构易于添加更多功能
    5. 最佳实践:遵循Revit API开发规范
    
    以下是Revit API的参考:
    {"API参考".join(rerank_api_chunks)}
    {"代码和文档参考".join(rerank_code_docs_chunks)}
    
    你将结合revit api和c#代码来生成一个真正的插件,并检查参数和逻辑。
    
    给用户一个专业的问题答案,如果你在参考中找不到答案,请说“我不知道”或“我在参考中找不到答案”。
    同时给出解决问题的代码,如果你无法在参考中生成代码,请说“我不知道”或“我在参考中找不到代码”。
    
    请记住:1. 必须忠于参考资料,2. 不要生成参考资料和RevitAPI中没有的代码。3. 知道用户想要什么,4. 给用户一个完整的代码解决方案
    
    
  7. 输出结果

根据提供的参考资料,我可以给你一个使用Revit API在Revit中创建结构柱的完整解决方案。这是一个遵循所有最佳实践的专业实现:

   ```csharp
   using Autodesk.Revit.DB;
   using Autodesk.Revit.DB.Structure;
   using Autodesk.Revit.UI;
   using System;

   namespace ColumnCreator
   {
       public class ColumnCreatorCommand : IExternalCommand
       {
           public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
           {
               try
               {
                   // 获取活动文档和应用程序
                   UIApplication uiApp = commandData.Application;
                   Document doc = uiApp.ActiveUIDocument.Document;

                   // 开启一个事务
                   using (Transaction trans = new Transaction(doc, "创建结构柱"))
                   {
                       trans.Start();

                       // 获取第一个标高(你也可以提示用户选择)
                       Level level = GetFirstLevel(doc);
                       if (level == null)
                       {
                           message = "项目中未找到标高";
                           return Result.Failed;
                       }

                       // 查找柱族类型(替换为你的族名称和类型)
                       FamilySymbol columnType = FindFamilySymbol(doc, "M_Wood Timber Column", "191 x 292mm");
                       if (columnType == null)
                       {
                           message = "未找到柱族";
                           return Result.Failed;
                       }

                       // 确保族类型是激活的
                       if (!columnType.IsActive)
                           columnType.Activate();

                       // 在原点(0,0,0)创建柱子
                       XYZ location = new XYZ(0, 0, 0);
                       FamilyInstance column = doc.Create.NewFamilyInstance(
                           location,
                           columnType,
                           level,
                           StructuralType.Column);

                       // 如果需要,设置柱参数
                       SetColumnParameters(column, level);

                       trans.Commit();
                   }

                   return Result.Succeeded;
               }
               catch (Exception ex)
               {
                   message = ex.Message;
                   return Result.Failed;
               }
           }

           private Level GetFirstLevel(Document doc)
           {
               FilteredElementCollector collector = new FilteredElementCollector(doc);
               collector.OfClass(typeof(Level));
               return collector.FirstElement() as Level;
           }

           private FamilySymbol FindFamilySymbol(Document doc, string familyName, string symbolName)
           {
               FilteredElementCollector collector = new FilteredElementCollector(doc);
               collector.OfClass(typeof(Family));

               foreach (Family family in collector)
               {
                   if (family.Name == familyName)
                   {
                       foreach (ElementId symbolId in family.GetFamilySymbolIds())
                       {
                           FamilySymbol symbol = doc.GetElement(symbolId) as FamilySymbol;
                           if (symbol.Name == symbolName)
                           {
                               return symbol;
                           }
                       }
                   }
               }
               return null;
           }

           private void SetColumnParameters(FamilyInstance column, Level baseLevel)
           {
               // 设置底部和顶部标高参数
               Parameter baseLevelParam = column.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_PARAM);
               Parameter topLevelParam = column.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_PARAM);

               if (baseLevelParam != null)
                   baseLevelParam.Set(baseLevel.Id);

               if (topLevelParam != null)
                   topLevelParam.Set(baseLevel.Id); // 为简单起见,顶部使用相同的标高

               // 如果需要,设置偏移量
               Parameter baseOffsetParam = column.get_Parameter(BuiltInParameter.FAMILY_BASE_LEVEL_OFFSET_PARAM);
               Parameter topOffsetParam = column.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM);

               if (baseOffsetParam != null)
                   baseOffsetParam.Set(0.0);

               if (topOffsetParam != null)
                   topOffsetParam.Set(10.0); // 示例:10英尺高
           }
       }
   }
   ```
```

这段代码演示了:

1.  **完整性**:展示了从命令执行到柱创建的整个过程
2.  **专业性**:使用所有必要的参数正确处理结构柱的创建
3.  **鲁棒性**:包括错误处理和空值检查
4.  **可扩展性**:易于通过更多参数或创建多个柱来进行扩展
5.  **最佳实践**:遵循Revit API标准并正确使用事务

使用的关键API元素:

  - `Document.Create.NewFamilyInstance()` 使用了 XYZ 位置、FamilySymbol、Level 和 StructuralType
  - 对结构柱进行正确的参数设置
  - 使用元素过滤器查找标高和族类型
  - 事务管理

你可以通过以下方式扩展此代码以创建多个柱:

1.  为多个位置添加一个循环
2.  提示用户输入位置
3.  添加更复杂的参数设置逻辑

代码与提供的API参考完全匹配,特别是:

  - `FamilyInstanceCreationData(XYZ, FamilySymbol, Level, StructuralType)`
  - `Document.NewFamilyInstance(XYZ, FamilySymbol, Element, Level, StructuralType)`
  - 参考示例中对结构参数的正确处理

<!-- end list -->

```
```
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐