基于LLM的自行车道CAD

LLM(大型语言模型)是强大的工具。对于许多人来说,用语言表达愿望通常比浏览复杂的 GUI 更简单。

1、系统简介和环境搭建

 urb-x.ch,这是一家专门从事自行车道建设的公司。轨道采用模块化构建块进行独特设计,可以通过多种方式进行组合。当拼凑在一起时,整个轨道网络形成了这些构建块的树形结构。

在某些方面,这个任务可以看作是一个视频游戏沙盒。可以将其视为在《过山车大亨》或《赛道狂热》中建造轨道。然而,虽然这些游戏提供了直观的设计体验,但它们无法提供土木工程项目所需的精度水平。另一方面,传统的 CAD 程序不允许大规模使用这样的模块化系统。

建立了一个无/低代码系统,让你可以轻松地创建车道,该系统构建在 Rhino 和 Grasshopper 的基础上。收获是什么?你必须投入一些时间来熟悉可用的组件。

与大多数视频游戏一样,与系统的交互可以被视为数据库系统中的事务。为此,设计了一个简单的 json/ pydantic 模式来存储轨道的配置。现在更新变成了简单的配置更新。我们将此配置称为“TrackConfig”。

{
  "version": "0.0.2",
  "library_dir": [
    "/Users/lucas/projects/gh/"
  ],
  "origin": {
    "position": [
      0.0,
      0.0,
      0.0
    ],
    "rotation": [
      0.0,
      0.0,
      0.0
    ]
  },
  "global_upgrades": {
    "PV": true,
    "HEATING": true,
    "FE3": {
      "LR": false
    }
  },
  "instance": {
    "id": "Oliver",
    "part_name": "XC50-4L",
    "children": {
      "-1": {
        "id": "Liam",
        "part_name": "XC50-4R",
        "children": {
          "-1": {
            "id": "Oliver",
            "part_name": "XC50-4R",
            "children": {
              "-1": {
                "id": "Ethan",
                "part_name": "XC50-4R",
                "children": {}
              }
            }
          }
        }
      }
    }
  },
  "configs": {},
  "selected": "Oliver"
}

作为一个项目,现在使用新的 OpenAI 函数来解析模型输出/实际上限制模型输出以匹配预期格式。

最初,目标是直接生成新的 TrackConfig。这种方法效果很好,但有一个显着的缺点:延迟非常大。不过,这还不错:大约 15 秒,这在大多数情况下仍然比使用 GUI 更快。总而言之,发现这对于迭代过程来说是不可接受的,并且希望加快速度。使用 W&B Prompts 记录所有内容,显示延迟和许多其他指标。它们工作得非常好,特别是在深入研究模型结果时!

为了应对延迟挑战,策略是减少模型所需的输出。这种方法的结果是集成了简单的更新功能。

from typing import Any, Optional, Union


from PythonModules.schema import TrackConfig, Part, PartNames


from pydantic import BaseModel, Field


class UpdatePart(BaseModel):
    """Updating or creating a part with the given id and part_name"""


    reasoning: str = Field(..., description="Answer all reasoning questions")
    id: str = Field(..., description="The unique id of a part. This is a unique random english first name.")
    part_name: PartNames = Field(..., description="The name of the part e.g. 'XS12'")
    parent: str = Field("", description="The id of the parent part or '' if the part is the root part. Usually This is the current selected part.")
    index: int = Field(-1, description="Where to insert the new part. -1 means append.")


    def __call__(self, track_config: Optional[TrackConfig] = None):
        return #code ommited




class UpdateSelection(BaseModel):
    """Select the part with the given id"""


    reasoning: str = Field(..., description="Which id's parts could be selected? Why does each part make sense or not?")
    id: str = Field(..., description="The unique id of a part. This is a unique random english first name.")


    def __call__(self, track_config: Optional[TrackConfig] = None):
        print(f"UpdateSelection(reasoning={self.reasoning}, id={id})")
        return #code ommited


# Other possible updates

虽然LLM很强大,但它们有一个一致的缺点:零样本预测可能不可靠。带有推理的输出要可靠得多。不幸的是,目前还没有任何 LangChain 链能够提供推理与 OpenAI 函数调用的组合。

公认的黑客解决方案是在函数调用中强制使用“推理”字段。前面讨论的 pydantic 模式说明了一个典型的例子。

这种策略虽然非常规,但已被证明是无价的,并且可能成为类似应用程序的关键要点。

现在,讨论延迟。如果没有推理组件,延迟会徘徊在 1.5 秒左右,这个值低得惊人。添加推理后,延迟会根据所采用的推理的深度和数量而变化。本质上,增加的运行时间与推理标记的数量成线性比例。那里相当简单。大多数情况下,延迟时间都小于 4 秒,尽管优化仍在进行中并且希望能将其降低。

借助 W&B Prompts,可以制作提示并观察其他用户如何与工具交互。这种洞察力能够分析两种提示的功效,从而进行改进,例如改进系统提示以增强预测。

让我们深入探讨提示业务。由于 GPT-3 Turbo 的上下文大小相当大,而预测令牌数量相当少,有一些空间可以使用,所以可以在提示上挥霍。

把所有认为重要的东西都扔掉了,保持干净整洁。查看下面进行的设置:

system_template = """
You are a world class assistant, helping an engineer to build an amazing street network from prefefined parts. The whole system is modular. 
You are responsible for deciding on which updates to do to the underlying configuration. The engineer will then update the configuration based on your input. 
You get access to a pointer named 'selected'. This id shows you relative to what you probably should append things to.
The whole track configuration is stored in a json file. In the instance key a tree of parts exists. The decendant of a child is the "children" field. The main child has key "-1".
The whole track consisting of a tree should make it easier to describe on where to append things.


The configuration is based on the following pydantic schema:


class PartNames(str, Enum):
    Straigt30mElement = "XS12"
    CurveRight50mRadius10mLenthgElement = "XC50-4L"
    CurveLeft50mRadius10mLenthgElement = "XC50-4R"
    DeletedElement = "Deleted"


class Origin(BaseModel):
    position: List[float] = Field(..., description="The origin position coordinates (x,y,z))")
    rotation: List[float] = Field(..., description="The origin rotation angles in degrees (x,y,z)")
    
class Part(BaseModel):
    id: str = Field(..., description="The unique id of a part. This is a unique random english first name.")
    part_name: PartNames = Field(..., description="The name of the part")
    children: Optional[Dict[str, 'Part']] = Field({}, description="Dictionary of child parts. Key=='next' is the default next part")


Part.update_forward_refs()  # This updates Element to include the recursive reference to itself


class TrackConfig(BaseModel):
    version: str = Field(..., description="The version of the track configuration")
    library_dir: List[str] = Field(..., description="List of paths to the libraries")
    origin: Origin = Field(..., description="The origin position and rotation of the track")
    global_upgrades: Dict[str, Any] = Field(..., description="Global upgrades for every element")
    instance: Part = Field(..., description="Part instances of the track")
    configs: Dict[str, Dict[str, Any]] = Field(..., description="Configuration dictionary for the track configuration")
    selected: str = Field(..., description="The id of the selected Element")


For new elements think of a new english first name as id! Think of a random name.
If not specified otherwise append or add new parts to the selected part. Never add new parts to a parent as a different child then -1, unless specified otherwise!
If a parent has other children it usually is asumed that the child with key -1 is the main child and that you should append to that one or one of its children.


Altough also visible in the schema, the following part_name's are available:
Straigt 30m Element: "XS12"
Curve Right!! 50m Radius 10m outer Length Element: "XC50-4L"
Curve Left!!  50m Radius 10m outer Length Element: "XC50-4R"


Reasons for the update fields should answer the following questions! You have to answer all of them:
- Which id do you want to update or is it a new id?
- What part_name do you want to use?
- Why this part_name?
- What parents could you use?
- If the parent already has children, why do you want to replace main child?


"""


prompt_template = """
The current configuration is as follows:
--------------------
{track_config}
--------------------
Use the given format to pick update steps from the following input:
--------------------
{input}
--------------------
Tips: Answer all questions.
Tips: Make sure to answer in the correct format!!!
"""

现在让我们看看模型调用:

class Track:
    def __init__(self, llm, system_template, prompt_template):
        self.path = "track.json"
        self.new_config = None
        prompt_msgs = [
            SystemMessage(content= system_template),
            HumanMessagePromptTemplate.from_template(prompt_template)
        ]
        prompt = ChatPromptTemplate(messages=prompt_msgs)


        self.chain = create_openai_fn_chain([UpdatePart,UpdateSelection], llm, prompt, verbose=False)


    @property
    def track_config(self):
        if not self.new_config:
            data_dict = json.load(open(self.path, "r"))
            track_config = TrackConfig(**data_dict)
            self.new_config = track_config


        return self.new_config
    
    @track_config.setter
    def track_config(self, track_config: TrackConfig):
        self.new_config = track_config
        
    def store(self):
        json.dump(self.track_config.dict(), open(self.path, "w"), indent=2)
    
    def agent(self):
        # interactively update the track_config
        # asks for user input and calls the callback function


        while prompt:=input("How should the track be updated? to quit press enter without input."):
            self(prompt)
    
    # Possibly wrap the call in retries if the to predict format is very difficult
    # @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
    def __call__(self, input) -> Any:
        json_str = json.dumps(self.track_config.dict(), indent=2)
        function:Union[UpdatePart,UpdateSelection] = self.chain.run(input = input, track_config=json_str)
        
        # call function with the track_config
        res = function(self.track_config)


        # store the new track_config
        self.store()
        
        return res


model = "gpt-3.5-turbo"
llm = ChatOpenAI(model=model,temperature=0.9)
track = Track(llm, system_template, prompt_template)

现在我们要么使用 track.agent() 方法来连续更新配置。或者使用单个命令:

track("append a new right element to the track")
track("Add a straight part to the last added track")
...

2、如何使用 W&B 提示

此处使用 W&B Prompts 主要是为了记录并查看其他人如何使用我的工具。这是一次了解人们在建造轨道时所做出的不同假设的旅程,并了解模型提出的古怪假设。您可以在函数调用的“原因”字段中发现这些模型假设。

只需设置一个环境变量,然后就可以开始了。

# we need a single line of code to start tracing LangChain with W&B
os.environ["LANGCHAIN_WANDB_TRACING"] = "true"

现在,锁链只是一场单步舞。如果能把它分成几个阶段,特别是分离出推理,那就很巧妙了。但是,这是一项正在进行的工作。

以下是 CAD 中车道的形状:

注意:我们只是在这里展示车道。为了清晰起见,所有额外的东西,如房屋、街道和桥梁,都没有显示在图中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有什么实用的还原试卷的app免费?6个软件教你快速进行还原试卷

有什么实用的还原试卷的app免费?6个软件教你快速进行还原试卷 在现代化的教学环境中,使用数字化工具进行试卷还原变得愈发重要。以下是六个实用的、免费的应用程序,它们为还原试卷提供了便捷的解决方案。 FunAI: 这款应用程序可…

QT作业5

1、聊天室 服务器端 //头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QListWidget> #include <QMessageBox> #include <QDebug> #includ…

软件验收计划书-验收规程(Word原件)

编写软件验收计划是软件开发过程中的一个关键步骤&#xff0c;其重要性体现在以下几个方面&#xff1a; 明确验收标准&#xff1a;软件验收计划详细列出了验收的标准、测试方法、测试环境等&#xff0c;确保所有相关人员对验收的期望和要求有清晰的认识。这有助于避免在验收阶段…

Electron+Vue+pyinstaller服务打包

electron环境安装略 1. electron的入口文件配置test.js, 需要在package.json 配置文件中指定main: src/test.js const { app, BrowserWindow } require(electron)const createWindow () > {const win new BrowserWindow({width: 800,height: 600})// win.loadFile(inde…

机器学习面试篇

如何理解机器学习数据集的概念 数据集是机器学习的基础&#xff0c;它包括了用于训练和测试模型所需的数据。数据集通常以矩阵的形式存在&#xff0c;其中每一行代表一个样本&#xff08;或实例&#xff09;&#xff0c;每一列代表一个特征&#xff08;或属性&#xff09;。…

浅谈C++ overload(重载) override(覆盖) overwrite(重写)

目录 1. 名词辨析2 含义解析1 overload重载2 override覆盖3 overwrite重写 3 区别4 代码示例 1. 名词辨析 关于这3个名词的中文翻译&#xff1a; overload翻译为重载&#xff0c;基本是没有歧义的&#xff1b;override和overwrite的翻译&#xff0c;我在参考了cppreference中…

文物藏品库房管理:守护珍贵文化遗产的宝库

一、引言 文物是人类文化遗产的珍贵财富&#xff0c;为了保护和传承科学有效的文物藏品库房管理是必不可少的。本文将介绍文物藏品库房管理的重要性&#xff0c;以及一些常用的管理方法和技术&#xff0c;提高文物保护工作的效果和水平以确保文物的安全与完整性。 二、文物藏品…

语音网关有哪些?

语音网关是一种网络设备&#xff0c;它使得通过传统的电话网络&#xff08;如公共交换电话网络&#xff0c;PSTN&#xff09;和现代的数据网络&#xff08;如互联网或私有数据网络&#xff09;进行的语音通信成为可能。语音网关的主要作用是在模拟或数字电话信号与数据网络的数…

C++ | Leetcode C++题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; class Solution { public:string addBinary(string a, string b) {string ans;reverse(a.begin(), a.end());reverse(b.begin(), b.end());int n max(a.size(), b.size()), carry 0;for (size_t i 0; i < n; i) {carry i < a.siz…

出海企业哪种组网方案更省事?

对于出海企业而言&#xff0c;建立跨地区的数据传输和协同工作至关重要&#xff0c;以提升运营效率。因此&#xff0c;网络构建变得迫在眉睫。通过构建企业组网&#xff0c;企业能够加强与海外分支、客户和合作伙伴之间的联系&#xff0c;加速海外业务的发展。 然而&#xff0c…

机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)预测葡萄酒质量

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

mac内存不足怎么清理?有哪些免费的软件工具?

当你的mac电脑使用一段时间之后&#xff0c;你可能就会发现&#xff0c;原本非常流畅的运行开始出现卡顿的现象&#xff0c;此时正是mac内存不足的外在表现。可mac内存不足怎么清理呢&#xff0c;别急&#xff0c;清理内存的方式方法有很多&#xff0c;小编将结合实际情况给大家…

字节跳动测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在&#xff0c;招聘黄金时间已经过了&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后在八月初拿到了字节跳动测试岗的 offer&…

sql-labs(11-20)

1.less-11 1.判断类型 根据测试在使用 " 不会报错&#xff0c; 会报错&#xff0c;所以他是字符型的并且被单引号闭合&#xff0c;而且只有用户 登陆成功才会显示数据。所以先尝试报错注入 2.爆数据库 and updatexml(2,concat(0x7e,(select database()),0x7e),2)-- 3.爆数…

谷歌上架攻略:个人号20人连续14天封闭测试的详细流程及相关注意事项

众所周知&#xff0c;近年来&#xff0c;Google play为了确保应用质量和用户体验&#xff0c;对开发者提出不少新要求。其中&#xff0c;对于个人开发者的一项要求是&#xff0c;自2023年11月13日起&#xff0c;新注册的个人开发者账号在上架正式版应用前&#xff0c;必须经过2…

面试题:数组指针的创建和访问,取地址符号的使用//定义一个指向含有10个整型的数组的指针,如何通过这个指针访问数组?

下面哪个代码是错误的&#xff1f;&#xff08;&#xff09; #include <stdio.h> int main() {int* p NULL;int arr[10] { 0 };return 0; }A. p arr; B. int(*ptr)[10] &arr; C. p &arr[0]; D. p &arr; 上题答案选D&#xff0c;通过如下代…

Spring框架学习-详细

文章目录 1. Spring简介1.1 面向接口编程1.2 Spring简介1.3 Spring体系结构 2 Spring IoC - 基于XML2.1 Sping框架部署&#xff08;IoC&#xff09;2.2 Spring IoC使用2.3 IoC和DI2.4 DI依赖注入Spring容器通过反射方法实现属性注入有三种方式1. set方法注入2. 构造器注入 2.5 …

系统设计 —— 随用户扩展

单服务器设置&#xff1a; 在单服务器设置中&#xff0c;所有内容都运行在一台服务器上。这包括网页应用程序、数据库、缓存等。 1*HQXZgCc5Vh8KooJHwKfzjw.png 图1.1 请求流程 1.最终用户通过域名&#xff08;myurl.com&#xff09;访问网站。请求发送到 DNS&#xff0c;将域名…

Laravel框架使用图片处理简单教程

PHP图片处理扩展包使用 文中使用的是Laravel框架&#xff0c;更多框架扩展包请点击传送门-》更多框架集成 Intervention Image 是一个开源的 PHP 图像处理和操作 库。它提供了一个更简单也更优雅的方式来创建/编辑/组合图像,并且支持最常见的两个图像处理库 GD Library 和 Im…

solidworks的进阶操作

目录 1 可以找别人的图 2 渲染 2.1 基本流程 2.2 相机和光源 3 装配图缩放 3.1 将装配图转换为零件 3.2 删除一些细节(可选) 3.3 缩放 4 3dmax文件转换为STL并对STL上色 5 文件是未来版本 1 可以找别人的图 有时需要出一些示意图&#xff0c;像是电脑桌子…