百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

适用于 CAD 的自适应 RAG:使用 LlamaIndex 和 Vertex AI 生成动态对象

zhezhongyun 2025-04-27 17:32 43 浏览

高级技术架构概述


在本文中,我将介绍专业人士如何利用 AI 在 AutoCAD 中创建 2D 对象以及在 Autodesk Fusion 中创建 3D 对象。其目标不是取代人类的专业知识,而是实现约 80% 工作的自动化,让设计师和工程师专注于改进和创造性决策。

我使用 LlamaIndex 和 Vertex AI 框架创建了一个 RAG 流程。代码完全由 LLM 从头开始生成,并且在编译时遇到错误时能够进行调试。在本文结束时,您将看到 AI 生成的 CAD 对象的真实示例,包括轴流涡轮叶轮、螺栓和外壳蓝图。

AI辅助CAD工作流程包括四个主要阶段:

  1. 初始化和配置
  2. 文档解析和向量索引
  3. 查询转换和代码生成
  4. 代码验证和执行

让我们详细探讨每个阶段。

初始化 Google Vertex AI 环境。

在这里您需要配置所有必要的 GCP 资源。您需要创建并配置您的向量搜索索引和端点。创建后,将您的向量搜索索引部署到您的端点。在此过程中,我使用 Google 的 LLM 和嵌入模型。
*如果您使用的是 Google 服务,则需要更改 LlamaIndex 设置

以下是我的配置示例:

## 向量搜索索引参数
distance_measure_type= "DOT_PRODUCT_DISTANCE" , 
precise_neighbors_count=150, 
shard_size= "SHARD_SIZE_SMALL" , 
index_update_method= "STREAM_UPDATE" 

## 将向量搜索索引部署到端点
display_name=VS_INDEX_NAME, 
machine_type= "e2-standard-16" , 
min_replica_count=1, 
max_replica_count=1, 

##Gemini 2.0 Pro
 llm = Gemini( 
    model= "models/gemini-2.0-pro-exp" , 
    temperature=0.1, 
    max_output_tokens=8192, 
) 

## 文本嵌入模型
embed_model = VertexTextEmbedding( 
    model_name= "textembedding-gecko@003" , 
    project=PROJECT_ID, 
    location=REGION, 
    credentials=credentials 
) 

##更改Llamaindex 从 OpenAI 到 Google Models 的默认设置
Settings.embed_model = embed_model 
Settings.llm = llm 

#### 以下代码将向您显示所有可用的 LLM ####
 for m in genai.list_models(): 
    if "generateContent" in m.supported_generation_methods: 
        print(m.name)

骆驼指数

我们使用Llama Parser从 PDF 文件中提取数据。这个强大的工具可以免费使用 - 只需在 Llama Cloud 上创建一个帐户即可生成您的 API 密钥。您可以在此处了解有关 Llama Parser 的更多信息。

对于元数据,您可以为每个文件定义自己的元数据,也可以利用 LlamaIndex 的内置工具,例如MetadataMode,它可以使用相关元数据自动标记文档。

使用SimpleDirectoryReader加载文档后,我们使用VectorStoreIndex将它们插入到向量索引中。此过程将文本数据存储为嵌入向量,从而使检索更加高效。

最后一步是创建检索器和查询引擎,使系统能够有效地搜索和返回相关信息。

以下是我的配置示例:

## 设置文档解析器
llamaparse_api_key = "_____"
 parser = LlamaParse( 
    api_key=llamaparse_api_key, 
    result_type= "markdown"
 ) 

## 加载文档
documents = SimpleDirectoryReader( 
    input_files=pdf_files, 
    file_extractor={ ".pdf" : parser} 
).load_data() 

## 将文档加载到向量索引中
vector_index = VectorStoreIndex.from_documents( 
    processed_documents, 
    storage_context=storage_context 
) 

## 创建检索器
index = VectorStoreIndex.from_documents([], storage_context=storage_context) 
trieser = index.as_retriever(similarity_top_k=5)   # 根据需要调整 K 

## 创建查询引擎
query_engine = RetrieverQueryEngine(retriever=retriever)

用户输入

虽然本文重点介绍 AI 工作流程而非 UI 设计,但我构建了一个轻量级 Gradio 界面来展示真实世界的可用性。您将在本文后面通过 GIF 看到它的实际效果。

查询转换

当用户提交查询时,生成 CAD 对象的过程就开始了。此查询通过我的自定义transform_query()函数进行增强,该函数执行以下操作:
1. 参数提取
2. 导出说明
3. 代码结构要求
4. 错误上下文(
如果 适用

向量搜索决策

系统在 Vertex 索引中搜索类似示例(基于相似分数)。根据搜索结果,系统将遵循以下两条路径之一:

  • 如果找到匹配项:系统利用矢量搜索结果来增强代码生成。
  • 如果没有找到匹配项:它将依靠 LLM 的内置知识,使用带有详细说明的转换后的查询,同时仍然受益于增强的查询上下文。

代码清理

代码生成后,将经过清理过程:

  • 格式化并清理生成的代码
  • 修复常见的拼写错误和模式
  • 确保正确的导入和结构
  • 处理参数声明

代码验证

这是我有自定义检查的地方,下面是我已经实现的一些检查:

  • 函数定义
  • 错误处理
  • 复杂的 CAD 操作
  • 文档字符串
  • Return 语句

如果验证失败,它会返回到 LLM,并根据失败的原因提出具体的增强请求。

如果有效则继续执行代码。

错误反馈回路

该系统具有强大的错误反馈循环。当执行失败时,系统会捕获错误,为下一次尝试创建详细上下文,并将此信息反馈给 transform_query() 函数。此迭代过程每次尝试都会提高代码生成的质量,最多可重试一次以防止无限循环。输出文件将是 .step 或 .dxf,您可以在 AutoCAD 或 Autodesk Fusion 中查看。

概括


对话式设计:生成螺栓

使用 LLM 生成螺栓并将其长度修改 +5 毫米

此交互通过在多个步骤中保留先前的用户意图来展示情境感知 AI 。

初始请求:

您可以使用以下参数创建螺栓:
bolt_radius = 3   # 轴半径
bolt_length = 15   # 轴长度
head_radius = 5   # 螺栓头半径
head_height = 2   # 螺栓头高度
thread_radius = 3   # 螺纹半径(与轴相同)
 thread_pitch = 1.5   # 螺旋螺距
thread_height = bolt_length - 0.3 * thread_pitch

迭代细化:

现在可以将螺栓长度加长5毫米吗?

该系统使用保留的上下文无缝地调整原始设计,动态更新尺寸,而不需要冗余规范。

人工智能辅助房屋蓝图生成

此演示展示了 LLM 如何自动创建详细的 CAD 草图(.dxf文件),超越简单的几何图形,生成结构化、可感知图层的设计。在此示例中:

  • 自动填充布局——模型生成房间尺寸和家具位置。
  • 智能图层组织——墙壁、固定装置和家具等元素被分配不同的图层,以便于编辑。
  • 上下文感知注释——表面上的阴影图案(例如餐桌)等增强功能提供了材料清晰度(木材、金属、玻璃……)。

LLM 的目标是生成快速、结构化的蓝图,让人类设计师可以根据需要完善和增强细节。

可扩展性和定制化

示例越多,输出越智能:使用历史项目或特定风格的模板(例如,中世纪现代、简约)填充矢量数据库,系统就会调整其生成逻辑进行匹配。

领域感知灵活性:交换数据集以生成针对住宅、商业或工业用例优化的草案。

初始请求:

创建包含以下内容的 1 层房屋蓝图:
## 定义主屋尺寸(以毫米为单位)##
 width = 18000 # 房屋宽度(以毫米为
单位)长度 = 20000 # 房屋长度(
以毫米为单位) wall_thickness = 152.4 # 房屋墙壁厚度(以毫米为单位)
## 房间##
客厅、
厨房、
带主浴室和步入式衣柜的主卧室、
阳光房、
办公室、
家庭房、
车库、
洗衣房。
全浴室、
半浴室
**请确保添加沙发、床、厕所等家具......**

人工智能辅助轴流涡轮叶轮制造



初始请求:

您可以使用以下参数创建轴流涡轮叶轮:
# 轮毂参数
hub_diameter = 90.0 
hub_radius = 45.0 
hub_thickness = 30.0 
shell_thickness = 7.0   
center_hole_diameter = 20.0 
# 叶片尺寸
length = 25.0 
root_chord = 25.0 
max_thickness = 3.0   
root_twist = 0 
mid_twist = 20 
tip_twist = 30 
# 在轮毂周围创建叶片图案
num_blades = 30

尽管我们在这里询问如此具体的尺寸,如果缺少某些参数,流程将自动填充它们。

结论

我们只是触及了 AI 在 CAD 设计中所能实现的一小部分。我在这里展示的系统基于 LlamaIndex、Vertex AI 和 Gemini 构建,展示了 AI 如何自动执行参数提取、代码生成和错误调试等重复性任务,让工程师和设计师能够专注于创造力和创新。

这种方法的真正力量在于其迭代学习能力

  • 矢量存储增长:您添加到索引的示例越多(例如螺栓设计、涡轮机蓝图、建筑平面图),AI 就会变得越复杂。丰富的数据集使其能够处理越来越复杂的几何形状,从简单的螺栓到多组件组件。
  • 错误驱动改进:反馈回路确保系统从每次故障中吸取教训。例如,如果人工智能最初难以完成涡轮叶片的螺旋扫描,那么后续迭代将纳入修正,从而改善未来的输出。

这并不是要取代人类的专业知识,而是要增强它。通过自动化,80% 的基础工作专业人员可以将时间用于优化

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...