通过AutoDL 将RevitAPI与RevitSDK 融合成为RevitRAG
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中,但是注意数据要提前拆分完成,通过压缩包一次性传输,通过下载就可以把文件直接传递到服务器中

设置
- 获取 RevitAPI.chm 并用 7-zip 或其他工具解压
- 获取数据文件夹 ->
./html - 使用
./split_revit.ipynb获取类数据- 类名
- 类信息
- 类摘要
- 类备注
- 参数
- 异常
- 保存数据
- 将
name - info嵌入并保存到python_revit_train/chromadb0815_api_1.db - 其他内容保存到
python_revit_train/revit_api.db

- 将
切分 SDK 示例代码

设置
- 查找所有文件夹
- 获取
ReadMe.rtf和所有的.cs文件 - 使用
./extra_data/获取所有代码 - 将数据保存到
./extra_data/project_dataset.json - 保存到 chromadb 数据库
python_revit_train/chromadb0818_code_1.db
RAG 中的工作流

设置
-
用户输入 :
query: 创建结构柱 -
使用提示词设置检索用户输入
Keywords: structural columns, create, NewFamilyInstance, Level, XYZ, FamilySymbolf""" 你是一位专业的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功能直接相关。 - 避免使用通用术语 """ -
嵌入检索查询
-
从
python_revit_train/chromadb0818_code_1.db和python_revit_train/chromadb0815_api_1.db获取 top_k 结果- API : 30
- 代码 : 5
-
通过查询重排,获取一半的结果
- API : 15
- 代码 : 3
-
使用回答提示词
- 在这个提示词中,我告诉大语言模型需要根据四个设置进行思考,然后输出答案,用这种方式,可以让大语言模型重新检查其响应
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. 给用户一个完整的代码解决方案 -
输出结果
根据提供的参考资料,我可以给你一个使用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 -->
```
```
更多推荐



所有评论(0)