去中心化全栈瓜

devgua

MyShell 進階 - 入門 Pro Config

前言#

myshell

首先先来推荐一下 Robot 社区中脚哥的一篇對於 MyShell 入門教程「MyShell 工具類 bot 創作指導」。

教哥的這篇入門教程提供了一份關於如何在 MyShell 平台上創作工具類 bot 的指南。MyShell 是一個去中心化的生成式 AI 創作者平台,提供多種 AI 大模型供用戶免費使用。作者分享了自己從 ChatGPT 轉向 MyShell 的經驗,強調了 MyShell 的優勢,包括免費使用多種 AI 大模型、避免封號風險、獲取積分獎勵、社區支持以及節省成本。文章還介紹了如何編寫有效的提示詞(prompt)定義角色規則和工作流,以及如何選擇模型和強化 prompt

此外,腳哥分享了自己創作的一些工具類 bot,提供了有關如何測試、宣傳和展望未來的建議。最後,文章介紹了 Claude3 模型的提示詞編寫技巧,包括使用 XML 標籤和標記輸入變量。

在我們使用 MyShell 來創造角色 Bot 的時候,掌握以上內容已經可以大體上來實現我們的角色。但美中不足的是,AI 在很多流程上是不可控的,我們在構建一個 Bot 的時候同樣地也需要一些程序邏輯,以便於我們控制 Bot 在和用戶交互時的流程。

如此,正式本文將要講述的 Pro Config 模式。這個模式將會平衡編程邏輯與 AI 提示邏輯交互的靈活方法

Hello World#

第一个例子#

由於 Pro Config 模式與編程邏輯很像,所以也希望你有一定的代碼基礎,這樣你會對 Pro Config 的描述 JSON 快速上手,並實現開發。

我們以一個 Coder 的習慣,快速進行一個 Hello World 實踐。

{
  "type": "automata",
  "id": "hello_demo",
  "initial": "home_page_state",
  "inputs": {},
  "outputs": {},
  "transitions": {},
  "states": {
    "home_page_state": {
      "inputs": {},
      "tasks": [],
      "outputs": {},
      "render": {
        "text": "Hello World! Welcome to this demo. Click 'Start' to chat!",
        "buttons": [
          {
            "content": "Start",
            "description": "Click to Start.",
            "on_click": "start_demo"
          }
        ]
      },
      "transitions": {
        "start_demo": "home_page_state"
      }
    }
  }
}

我們按照以上配置輸入進我們 Bot 的開發者模式,會得到以下效果:

image

下面來解釋一下上述 JSON 的含義是什麼:

  • 首先,我們定義這一段 JSON 就是一個自動機(Automata),在 Pro Config 中每個自動機都可以使用 JSON 來定義;
  • 在這個自動機中,我們定義了 Bot 需要輸出什麼樣的文案,即 text 字段;定義了一個 Button,在 on_click 自動中,定義了點擊後將轉移到什麼狀態;

至此,我們完成了對於 Pro Config 模式的 Hello World 事例的編寫。

原子態(AtomicState)與自動機(Automata)#

在上文的 Hello World 事例中,我們已經大概了解了什麼是自動機。概括一下,它就是用來控制 Bot 進入不同狀態的一個抽象。

下面我們來介紹一下原子態(AtomicState)的概念。用最簡單的話來描述它和自動機的關係,就是一個自動機可以包含不同的原子態。如果說自動機是用來描述不同狀態之間的切換關係,那麼原子態就是用來描述某個複雜狀態的抽象。

這裡先簡單了解下具有這樣的概念,後文用到的時候將詳細介紹。

當然如果你想了解更多,可以直接看 MyShell 的官方文檔

定義輸入 / 輸出#

在上面的 Hello World 事例中,我們定義的原子態處了我們使用的 text 字段和 Button 字段,我們看到還有其他的字段。

image

下面我們來介紹一下 inputsoutputs 字段的作用。

Talk is cheap,我們直接來看以下代碼:

{
  "type": "automata",
  "id": "hello_demo",
  "initial": "home_page_state",
  "inputs": {},
  "outputs": {},
  "transitions": {},
  "states": {
    "home_page_state": {
      "inputs": {
        "intro_message": {
          "type": "text",
          "user_input": true,
          "default_value": "Hi, this is your Pro Config Tutorial Bot"
        },
        "tts_widget_url": {
          "type": "text",
          "user_input": true,
          "default_value": "https://app.myshell.ai/widget/mEjUNr"
        }
      },
      "tasks": [],
      "outputs": {
        "intro_message": "{{intro_message}}",
        "voice_id": "{{tts_widget_url}}"
      },
      "render": {
        "text": "Hello Word! Welcome to this demo. Click 'Start' to chat!",
        "buttons": [
          {
            "content": "Start",
            "description": "Click to Start.",
            "on_click": "start_demo"
          }
        ]
      },
      "transitions": {
        "start_demo": "home_page_state"
      }
    }
  }
}

將代碼直接覆蓋掉之前 Hello World 的代碼,我們會發現在用戶點擊 Start Button 後,會彈出一個交互表單:

image

這個表單就是我們通過上面的代碼實現的效果。我們來解讀下部分關鍵性代碼的含義:

  • inputs:這裡我們設置了 intro_messagetts_widget_url 兩個字段,其實就是 Input 兩個文本框的 Title,其中有 type 字段是 text 代表這是一個文本框,user_input 表示是否要用戶輸入,default_value 是預設值。

當我們如此設置後,用戶填寫完表達點擊 save 之後,就會將輸入值保存成 intro_messagetts_widget_url 兩個變量,我們在其他的表達式可以使用變量表達式 {{<variable>}} 進行引用。

  • outputs:這個變量就是用戶填寫完表達後,按照我們的文本模版向 Bot 發起的會話內容。就像這樣:

image

由於我們上文已經說到了,可以使用 {{<variable>}} 的方式將我們構建的變量引用進來,其他也沒有什麼難度,相信你一看便知。

MyShell 官方使用雙大括號 {{expression}} 來包裹表達式,以將輸出變量的值賦給它。這個表達式應該使用 JavaScript 語言編寫,遵循 ECMAScript 5.1 標準,因為 MyShell 目前只支持這個版本。

構建工作流(Workflow)#

製作一個 Chatbot#

在 Pro Config 中,工作流(Workflow)可以將多個模塊連接,從而完成我們需要處理的事件。下文我們將用一個 Chatbot 例子來解釋工作流的使用方法。

{
  "type": "automata",
  "id": "chat_demo",
  "initial": "chat_page_state",
  "inputs": {},
  "outputs": {},
  "transitions": {},
  "states": {
    "chat_page_state": {
      "inputs": {
        "user_message": {
          "type": "IM",
          "user_input": true
        }
      },
      "tasks": [
        {
          "name": "generate_reply",
          "module_type": "AnyWidgetModule",
          "module_config": {
            "widget_id": "1744214024104448000",
            "system_prompt": "You are a teacher teaching Pro Config.",
            "user_prompt": "{{user_message}}",
            "output_name": "reply"
          }
        },
        {
          "name": "generate_voice",
          "module_type": "AnyWidgetModule",
          "module_config": {
            "content": "{{reply}}",
            "widget_id": "1743159010695057408",
            "output_name": "reply_voice"
          }
        }
      ],
      "render": {
        "text": "{{reply}}",
        "audio": "{{reply_voice}}"
      },
      "transitions": {
        "CHAT": "chat_page_state"
      }
    }
  }
}

這個代碼會實現一個 Pro Config Teacher 角色。

image

工作流解析#

我們逐一來解釋一下每一個模塊的含義:

"inputs": {
  "user_message": {
    "type": "IM",
    "user_input": true
  }
}

inputs 模塊中,type我們定義為 IM ,即即時消息類型。這個類型說明 Bot 能夠接受以發送給 Bot 的消息形式的輸入

"transitions": {
  "CHAT": "chat_page_state"
}

接下來我們立即來看這個狀態轉換的定義 transitions。在這裡,我們將事件 CHAT 直接設置成上文定義的 chat_page_state。這個意思就是當用戶在聊天中發送消息時,狀態會重新價值,發送的消息將作為 input 傳入給這個狀態。然後將 user_message 將傳遞到 task 中。

"tasks": [
  {
    "name": "generate_reply",
    "module_type": "AnyWidgetModule",
    "module_config": {
      "widget_id": "1744214024104448000",
      "system_prompt": "You are a teacher teaching Pro Config.",
      "user_prompt": "{{user_message}}",
      "output_name": "reply"
    }
  },
  {
    "name": "generate_voice",
    "module_type": "AnyWidgetModule",
    "module_config": {
      "content": "{{reply}}",
      "widget_id": "1743159010695057408",
      "output_name": "reply_voice"
    }
  }
]

接下來我們來看 tasks 部分。這個部分包含了多個待執行 module,對於每個 module,我們都需要指定 module_typemodule_configname 是 Optional 的選項,不是必填字段。

為了演示,在第一個 task 中,我們給了一個預置的 prompt - "You are a teacher teaching Pro Config.",將這個 prompt 給到我們的 Bot,從而指定它的角色。

在第二個 task 中,我們想去發一個回覆的語音。這時候我們可以用到 MyShell 的 TSS Widget,就可以設置一個語音回覆。如果你有更喜歡的 TSS 音色想使用,可以在 MyShell 的 workshop 中去尋找,通過它的 widget_id 引入即可完成使用。

image

這裡我簡單介紹了兩種用於回覆的 module,如果你對處理事件的 module 感興趣,可以訪問官方文檔來研究 module 模塊。

在兩個 task 執行完成後,則會根據我們的定義,產生兩個變量 replyreply_voice,並準備好後,通過以下定義呈現給用戶:

"render": {
  "text": "{{reply}}",
  "audio": "{{reply_voice}}"
}

在整個流程中,我們注意到其實 Bot 還默認的處理了一個 “黑盒” 事件 - CHAT 特殊事件。正因為執行了這個特殊事件,才能按照我們的規則進行轉移到 chat_page_state 並執行對應的 task。

相信通過這個例子,你已經可以理解了使用 Pro Config 的 Bot 大致的全部工作流,當你學會這個之後就已經可以開始編寫自己的 Bot,並實現一個大致的處理框架。

總結#

通過本文的介紹,我們了解了 MyShell 平台上 Pro Config 模式的基本概念和應用方法。通過一個 Hello World 實例和一個 Chatbot 實例,展示了如何使用 Pro Config 模式中的自動機(Automata)和原子態(AtomicState)來控制 Bot 進入不同狀態,並處理用戶輸入和輸出。通過這些例子,我們不僅能夠快速上手 Pro Config 模式,還能夠深入理解其工作原理。

在下一篇,我們將繼續討論一些細節字段,例如如何具體定義 transitions 、表達式和變量的具體使用方式、如何集成其他的 Widget 等等。共勉。

Reference#


另外,希望更多的開發者來參加 MyShell 的 Bot 市場共建,邀請的連接點擊這裡。後續將會有更多的 Airdrop 活動等你來參與。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。