溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

適合面向ChatGPT編程的架構(gòu)源碼分析

發(fā)布時間:2023-03-21 15:31:27 來源:億速云 閱讀:105 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“適合面向ChatGPT編程的架構(gòu)源碼分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    新的需求

    我們前面爬蟲的需求呢,有些平臺說因為引起爭議,所以不讓發(fā),好吧,那我們換個需求,本來那個例子也不好擴展了。最近AI畫圖也是比較火的,那么我們來試試做個程序幫我們生成AI畫圖的prompt。

    首先講一下AI話題的prompt的關(guān)鍵要素,大部分的AI畫圖都是有一個個由逗號分割的關(guān)鍵字,也叫subject,類似下面這樣:

    a cute cat, smile, running,  look_at_viewer, full_body, side_view,

    然后還有negative prompt,就是你不想出現(xiàn)的關(guān)鍵字,跟上面的寫法一樣,只是寫下來表示不希望它畫出來的,比如我們想畫一堆貓的圖片,不想出現(xiàn)狗,不想出現(xiàn)人,我們可以這么寫:

    dog,  human,

    這樣大概率就不會出現(xiàn)狗和人了(當(dāng)然也不一定,懂得都懂)。

    領(lǐng)域知識

    那么說干就干,開始之前要了解一下領(lǐng)域知識。

    首先是關(guān)鍵字,在這個需求里只是基礎(chǔ)知識,沒有什么難的,大概有下面幾條規(guī)則:

    • 內(nèi)容,這些關(guān)鍵字呢,說是關(guān)鍵字,其實你寫一句話也沒人管你。簡化處理,我們這里就只用詞和短語。另外,空格可以用下劃線代替,這樣可能會避免被分詞,具體我也不確定,沒有深入研究。但是這個不重要,可以完全看成兩種關(guān)鍵字去排列組合好了。

    • 關(guān)鍵字是可以有權(quán)重的,通常的表達(dá)方式是:

    (a cute cat:1.5)

    這個很重要,通常我們想嘗試好的方式,需要給每個關(guān)鍵字設(shè)置權(quán)重。

    LoRA,英文全稱Low-Rank Adaptation of Large Language Models,直譯為大語言模型的低階適應(yīng),這是微軟的研究人員為了解決大語言模型微調(diào)而開發(fā)的一項技術(shù),在我們這個場景下就是我們多了一種關(guān)鍵字,這種關(guān)鍵字大概是這么寫:

    <lora:wanostyle_2_offset:1>,  monkey d luffy,
    • 它多了一些尖括號,也有權(quán)重,同時他會被其他關(guān)鍵字觸發(fā),比如上面這個就可以畫個海賊王風(fēng)格的路飛出來。

    • 但總的來說,對關(guān)鍵字本身的建模影響不大

    接著我們來了解一下排列組合的邏輯,這個將是我們的關(guān)鍵難點。

    • 在這個領(lǐng)域,影響生成的因素主要有幾個:

      • 模型

      • sample

      • step

      • 寬高

      • seed

      • negative prompt

      • prompt

    • 在prompt中我們的關(guān)鍵字還可以根據(jù)使用目的分類,比如于生成畫面風(fēng)格的、用于生成背景的、用于生成人物的、用于成表情的等等

    • 在prompt中,關(guān)鍵字的擺放順序有時候還會造成點不同。

    • 還有更復(fù)雜的Control Net,這個例子里我們先不考慮。

    • 生成的時候,某些關(guān)鍵字要獲得最好的效果,可能自己對模型、sample以及其他關(guān)鍵字的存在和權(quán)重都有自己的要求,比某關(guān)鍵字在某模型下權(quán)重為0.3,而在另一個模型下權(quán)重需要0.7。比如路飛會帶草帽,那么這個人物出現(xiàn)的時候,必須配上帽的關(guān)鍵字才對味,而其他的人物就不要跟草帽組合了,又浪時間又沒有意義。所以組合上要考慮各種因素之間的互斥和強依賴等場景。

    架構(gòu)設(shè)計

    好,這大概是一個比較復(fù)雜的需求了?;氐缴掀恼逻z留的問題,聊聊當(dāng)我們面對一個比較復(fù)雜的需求,而且我們接下來要用ChatGPT把它實現(xiàn)的時候,我們應(yīng)該怎么設(shè)計架構(gòu)。

    管道架構(gòu)

    在這個需求里,我們首先要知道,這類AI都是有REST API的,比如說stable diffusion WebUI,就有一個自己的API,他們的API接受一個固定格式的JSON,其結(jié)構(gòu)大概是這個樣子:

    {
    "prompt": "",
    "negative_prompt": "",
    "controlnet_input_image": [],
    "controlnet_mask": [],
    "controlnet_module": "",
    "controlnet_model": "",
    "controlnet_weight": 1,
    "controlnet_resize_mode": "Scale to Fit (Inner Fit)",
    "controlnet_lowvram": true,
    "controlnet_processor_res": 512,
    "controlnet_threshold_a": 64,
    "controlnet_threshold_b": 64,
    "controlnet_guidance": 1,
    "controlnet_guessmode": true,
    "enable_hr": false,
    "denoising_strength": 0.5,
    "hr_scale": 1.5,
    "hr_upscale": "Latent",
    "seed": -1,
    "subseed": -1,
    "subseed_strength": -1,
    "sampler_index": "",
    "batch_size": 1,
    "n_iter": 1,
    "steps": 20,
    "cfg_scale": 7,
    "width": 512,
    "height": 512,
    "restore_faces": true,
    "override_settings": {},
    "override_settings_restore_afterwards": true
    }

    那么這就是類似他們的意圖描述,可以把它看成一種DSL。

    而在我們這個領(lǐng)域里,我們要做的是排列組合,那么對于排列組合,我們要設(shè)計我們排列組合的意圖描述,這可以看成另一種DSL,這種DSL只作簡單排列組合,不做復(fù)雜的互斥和強依賴邏輯的計算,其結(jié)構(gòu)可能是這個樣子:

    - base_share_composite_intentions:
        base:
        steps: 10
        batch_size: 1
        width: 512
        height: 512
        cfg_scale: 7
        sampler: "Euler a"
        seed: -1
        restore_faces: true
        output_folder: output/txt2img
        file_full_name_strategy: date_seed_name_strategy
        sd_host: http://localhost:7860
        negative_prompt: a dog  
        poly:
        - template_prompt:
            template: >
                a cat,
                ${ view_angle }
                ${ portrait }
                ${ facial_expressions }
                ${ pose }
            meta:
                - view_angle: 
                    - side_view,
                    - front_view,
                  portrait: 
                    - full body,
                  facial_expressions:
                    - (smile:1.5),  
                    - (smile:1.2),  
                    - smile,  
                  pose: ""
                - view_angle: 
                    - front_view,
                  portrait: 
                    - ""
                  facial_expressions:
                    - smile,      
                  pose:
                    - run,
                    - jump,
                    - rolling,  
            steps: 20

    然后在這個DSL之上,我們可以再做一個DSL,這個DSL用于處理復(fù)雜的互斥和強依賴邏輯的計算,前面說了那么多,真正這個地方到底有多復(fù)雜我也想不清楚。那干脆,搞個模板引擎來吧,這就什么都能干了,慢慢搞明白了再封裝。最終其結(jié)構(gòu)可能是這個樣子:

    <% 
    const randomNum = Math.floor(Math.random() * 900000000) + 100000000;
    var intention = {
        is_override_settings: true,
        seed: randomNum,
    }
    %>
    
    <% var status = {
    charas:{
        values_of_chara_$ref: [
        "cats.yml#Abyssinian",
        "cats.yml#cats_in_boots",
        ],
        current_chara_index: 0,
        next_chara(){
        this.current_chara_index++;
        }
    },
    themes:{
        values_of_theme: [
        {
            $ref: "outdoor"
        },
        ],
        current_theme_index: 0,
        next_theme(){
        this.current_theme_index++;
        },
        reset_theme(){
        this.current_theme_index = 0;
        }
    }
    }
    %>
    
    <%
    common_theme_file = "common/chara_based_themes.yml"
    %>
    
    <% while (status.charas.current_chara_index < status.charas.values_of_chara_$ref.length) { %>
    - base_share_composite_intentions:
        common:
        theme: 
        base:
        steps: 20
        batch_size: 1
        width: 512
        height: 512
        cfg_scale: 7
        sampler: "DPM++ 2M Karras"
        seed: <%- intention.seed %>
        restore_faces: false
        output_folder: output/txt2img
        file_full_name_strategy: date_seed_name_strategy
        sd_host: http://localhost:7860
        <% if(intention.is_override_settings){ %>
        override_settings: 
            CLIP_stop_at_last_layers: 2
            eta_noise_seed_delta: 31337
        <%}%>
        negative_prompt: >
            dog,  human, bad anatomy, EasyNegative,paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality,
        poly:
        <% while (status.themes.current_theme_index < status.themes.values_of_theme.length) { %>
        - $p_ref: 
            $ref: "<%-common_theme_file%>#<%- status.themes.values_of_theme[status.themes.current_theme_index].$ref%>"
            params:
                base_prompt_features: 
                $p_ref: 
                    $ref: <%- status.charas.values_of_chara_$ref[status.charas.current_chara_index] %>
                    params:
                    is_full_chara: true 
                    chara_weight: 0.2
                pose:
                    sit
                facial_expressions:
                    (smile:1.1),(open mouth),
        - $p_ref: 
            $ref: "<%-common_theme_file%>#<%- status.themes.values_of_theme[status.themes.current_theme_index].$ref%>"
            params:
                base_prompt_features: 
                $p_ref: 
                    $ref: <%- status.charas.values_of_chara_$ref[status.charas.current_chara_index] %>
                    params:
                    is_full_chara: true 
                    chara_weight: 0.6
                pose:
                    run
                facial_expressions:
                    (smile:1.2),(closed mouth),
        <% status.themes.next_theme(); %>
        <% } %>
    <% status.themes.reset_theme(); %>
    <% status.charas.next_chara(); %>
    <% } %>

    于是我們有了三個DSL,他們層層轉(zhuǎn)換,最終驅(qū)動AI畫圖。那么我們的程序可能就會是下面這個樣子:

    適合面向ChatGPT編程的架構(gòu)源碼分析

    可以看出,這樣我們就得到了大名鼎鼎的管道架構(gòu),經(jīng)常使用Linux/Unix命令行的人,可能已經(jīng)體會過管道架構(gòu)恐怖的擴展能力,這次我們只能說,是Linux/Unix哲學(xué)再一次展現(xiàn)出威力。

    我們之前講了,ChatGPT可以快速寫出一些小程序,但是長一點的總是會出錯,那么其實除了從規(guī)模上進行分解將任務(wù)復(fù)雜度降低之外,通過抽象建立分層的DSL也是一種降低復(fù)雜度的方案。

    分層架構(gòu)

    說到分層,其實從另一個角度看,我們這個架構(gòu)也是一個分層架構(gòu)。

    適合面向ChatGPT編程的架構(gòu)源碼分析

    可以看到,我們可以輕易地替換調(diào)用不同REST API的代碼以做到對于不同AI的適配,實現(xiàn)了隔離。

    同理,不但意圖執(zhí)行可以切換,意圖描述也可以跟著切換:

    適合面向ChatGPT編程的架構(gòu)源碼分析

    既可以有技術(shù)維度上的擴展,也可以有業(yè)務(wù)維度上的擴展:

    適合面向ChatGPT編程的架構(gòu)源碼分析

    所以從這個角度來說,每一個管段,都是可以看作是一層。

    類分層神經(jīng)網(wǎng)絡(luò)的架構(gòu)

    而到這還不算完,具體在執(zhí)行的時候,可能受環(huán)境的影響,可能受上層意圖影響等等,總之是需要進行每一層的路徑選擇的。這種選擇,可能是由另一個引擎來完成的。那么最終我們的架構(gòu)的完整形態(tài)他可能是這個樣子的:

    適合面向ChatGPT編程的架構(gòu)源碼分析

    當(dāng)然其運行視圖可能是這樣的:

    適合面向ChatGPT編程的架構(gòu)源碼分析

    到此,我們得到了我們架構(gòu)比較完整的形態(tài),他是一個集成了管道架構(gòu)和分層架構(gòu),在一個派發(fā)引擎的支撐下的一個類分層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。

    “適合面向ChatGPT編程的架構(gòu)源碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI