前言#
首先先来推荐一下 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 的開發者模式,會得到以下效果:
下面來解釋一下上述 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
字段,我們看到還有其他的字段。
下面我們來介紹一下 inputs
和 outputs
字段的作用。
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 後,會彈出一個交互表單:
這個表單就是我們通過上面的代碼實現的效果。我們來解讀下部分關鍵性代碼的含義:
- inputs:這裡我們設置了
intro_message
和tts_widget_url
兩個字段,其實就是 Input 兩個文本框的 Title,其中有type
字段是text
代表這是一個文本框,user_input
表示是否要用戶輸入,default_value
是預設值。
當我們如此設置後,用戶填寫完表達點擊 save 之後,就會將輸入值保存成 intro_message
和 tts_widget_url
兩個變量,我們在其他的表達式可以使用變量表達式 {{<variable>}}
進行引用。
- outputs:這個變量就是用戶填寫完表達後,按照我們的文本模版向 Bot 發起的會話內容。就像這樣:
由於我們上文已經說到了,可以使用 {{<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 角色。
工作流解析#
我們逐一來解釋一下每一個模塊的含義:
"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_type
和 module_config
。name
是 Optional 的選項,不是必填字段。
為了演示,在第一個 task 中,我們給了一個預置的 prompt - "You are a teacher teaching Pro Config."
,將這個 prompt 給到我們的 Bot,從而指定它的角色。
在第二個 task 中,我們想去發一個回覆的語音。這時候我們可以用到 MyShell 的 TSS Widget,就可以設置一個語音回覆。如果你有更喜歡的 TSS 音色想使用,可以在 MyShell 的 workshop 中去尋找,通過它的 widget_id
引入即可完成使用。
這裡我簡單介紹了兩種用於回覆的 module,如果你對處理事件的 module 感興趣,可以訪問官方文檔來研究 module 模塊。
在兩個 task 執行完成後,則會根據我們的定義,產生兩個變量 reply
和 reply_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 活動等你來參與。