適用於Gensokyo以及Onebotv11的大模型一鍵端
初階-簡單接取機器人:簡單將機器人接上QQ等6大平台
中級-對接one-api教程:可視化管理大模型api
中級-大模型api配置範例-國產大模型
中級-大模式api配置範例-國際篇
上手即用-在Telegram快速部署
上手即用-在Discord快速部署
上手即用-在Kook快速部署
簡單-對接酒館(SillyTavern)-混元
簡單-對接酒館(SillyTavern)-豆包
支援所有Onebotv11標準框架.支援http-api和反向ws,支援串流發送,多設定檔(多提示詞)
超小體積,內建sqlite維護上下文,支援proxy,
可一鍵對接Gensokyo框架僅需配置反向http位址用於接收訊息,正向http位址用於呼叫發送api
基於sqlite資料庫自動維繫上下文,對話模式中,使用重置指令即可重置
可設定system,角色卡,上下文長度,
同時對外提供帶有自動上下文的openai原始風味api(經典3參數,id,parent id,messgae)
可作為api運行,也可一鍵接入QQ頻道機器人QQ機器人開放平台
可轉換gpt的sse類型,遞增還是只發新增的sse
並發環境下的sse記憶體安全,支援維持多用戶同時雙向sse傳輸
騰訊混元
騰訊元器
百度文心
阿里通義
清華智譜
位元組火山(豆包)
OpenAI
groQ
Rwkv runner
One-API
將這些平台的api轉換為統一的api結構,並提供了上下文,支持sse方式返回
透過在yml設定對應平台的token,設定AllApi=true,可以同時切換呼叫.
Gensokyo框架-QQ開放平台
Gensokyo框架-Discord
Gensokyo框架-Kook
Gensokyo框架-微信訂閱號公眾號
Gensokyo框架-Telegram
所有Onebotv11實現
多重完備安全措施,盡可能保證開發者與llm應用安全.
可設定多輪模擬QA強化角色提示詞,可自訂重置回复,安全詞回复,第一重安全措施
支援多gsk-llm互聯,形成ai-agent類應用,如一個llm為另一個llm整理提示詞,審核提示詞,第二重安全措施
向量安全詞列表,基於向量相似度的敏感攔截詞列表,先於文字替換進行,第三重安全措施
AhoCorasick演算法實現的超高效文字IN-Out替換規則,可大量替換n個關鍵字到各自對應的新關鍵字,第四重安全措施
結果可再次通過百度-騰訊,文字審核介面,第五重安全措施
日誌全面記錄,命令列參數-test 從test.txt快速運行安全自測腳本,
命令列-mlog 將目前儲存的所有日誌進行QA格式化,每日審查,從實際場景提煉新安全規則,不斷增加安全性,第六重安全措施
語言過濾,允許llm只接受所指定的語言,自動將繁體轉換為簡體應用安全規則,在自己擅長的領域進行防守,第七重安全措施
提示詞長度限制,用最原始的方式控制安全,阻止惡意使用者構造長提示詞,第八重安全措施
透過這些方法,打造盡可能安全llm對話機器人。
文字IN-OUT雙層替換,可自行實現內部提示詞動態替換,修改,更安全強大
基於sqlite設計的向量資料表結構,可使用快取來省錢.自訂快取命中率,精準度.
針對高效能高效能高QPS場景優化的專門場景應用,沒有冗餘功能和指令,全面圍繞數位人設計.
使用命令列運行gensokyo-llm可執行程式
設定config.yml 啟動,後監聽port 連接埠提供/conversation api
支援中介軟體開發,在gensokyo框架層到gensokyo-llm的http請求之間,可開發中間件實現向量拓展,資料庫拓展,動態修改使用者問題.
支援反向ws連線,支援同時連接多個onebotv11的http-api
本文檔提供了關於API介面的呼叫方法和設定檔的格式說明,幫助使用者正確使用和設定。
本系統的conversation
和gensokyo
端點支援透過查詢參數?prompt=xxx
來指定特定的配置。
prompt
參數允許使用者指定位於執行檔(exe)的prompts
資料夾下的設定YAML檔案。使用該參數可以動態地調整API行為和傳回內容。
prompts資料夾需要有一個預設的keyboard.yml用於產生氣泡.其係統提示詞需要遵循json氣泡產生器的prompts規則.
設定檔應遵循以下YAML格式。這裡提供了一個範例配置文件,展示如何定義不同角色的對話內容:
Prompt :
- role : " system "
content : " Welcome to the system. How can I assist you today? "
- role : " user "
content : " I need help with my account. "
- role : " assistant "
content : " I can help you with that. What seems to be the problem? "
- role : " user "
content : " aaaaaaaaaa! "
- role : " assistant "
content : " ooooooooo? "
settings :
# 以下是通用配置项 和config.yml相同
useSse : true
port : 46233
/gensokyo
端點當向/gensokyo
端點發起請求時,系統支援附加prompt
參數和api
參數。 api
參數允許指定如/conversation_ernie
這類的完整端點。啟用此功能需在設定中開啟allapi
選項。
範例請求:
GET /gensokyo?prompt=example&api=conversation_ernie
支援端點列表:(需配置:allApi : true)
http . HandleFunc ( "/conversation_gpt" , app . ChatHandlerChatgpt )
http . HandleFunc ( "/conversation_hunyuan" , app . ChatHandlerHunyuan )
http . HandleFunc ( "/conversation_ernie" , app . ChatHandlerErnie )
http . HandleFunc ( "/conversation_rwkv" , app . ChatHandlerRwkv )
http . HandleFunc ( "/conversation_tyqw" , app . ChatHandlerTyqw )
http . HandleFunc ( "/conversation_glm" , app . ChatHandlerGlm )
/conversation
端點與/gensokyo
類似, /conversation
端點支援附加prompt
參數。
範例請求:
GET /conversation?prompt=example
prompt
參數解析提供的prompt
參數將引用可執行檔目錄下的/prompts
資料夾中對應的YAML 檔案(例如xxxx.yml
,其中xxxx
是prompt
參數的值)。
透過編寫大量的prompts的yml文件,你可以實現角色卡切換,在同一角色下,你可以實現故事情節和不同場景切換。
YAML 檔案的設定格式請參考YAML設定檔格式部分。以下列出的設定項支援在請求中動態覆寫:
每一種參數都實現了配置覆蓋
如果有疏漏,需要支援配置覆蓋,請提交issue。
所有的bool值在設定檔覆蓋的yml中必須指定,否則將會被認為是false.
動態配置覆蓋是一個我自己構思的特性,利用這個特性,可以實現配置文件之間的遞歸,舉例,你可以在自己的中間件傳遞prompt=a,在a.yml中指定Lotus為調用自身,併在lotus位址中指定下一個prompt參數為b,b指定c,c指定d,以此類推.
本項目實現了一種提示詞控制流,一種可控上下文構造方式,基於本項目實現的多配置文件,可實現配置文件之間按條件跳轉、切換,
實現了讓用戶在多個提示詞中,按照一些條件,有順序,可選擇的,在多套提示詞中進行流轉,實現文字戀愛遊戲、探險遊戲、非連續性多支線的故事劇情、類工作流提示詞系統。
- [x] promptMarks :
- BranchName : "去逛街路上"
Keywords : ["坐车", "走路", "触发"]
- BranchName : "在家准备"
Keywords : ["等一下", "慢慢", "准备"]
- [x] enhancedQA : true
- [x] promptChoicesQ :
- Round : 1
ReplaceText : "回家吧"
Keywords : ["我累了", "不想去了"]
- Round : 2
ReplaceText : "我们打车去"
Keywords : ["快点去", "想去", "早点"]
- Round : 3
ReplaceText : "我们走着去"
Keywords : ["不着急", "等下"]
- Round : 1
ReplaceText : "放松一下"
Keywords : [] # 相当于 enhancedChoices = false
- [x] promptChoicesA : 同上。
- [x] promptCoverQ : 只有Q没有A,格式同上,Choices是附加,cover是覆盖。
- [x] promptCoverA : # 同上
- [x] switchOnQ :
- round : 1
switch : ["故事退出分支", "下一个分支"]
keywords : ["不想", "累了", "想", "不累"]
- [x] switchOnA :
- round : 1
switch : ["晚上分支"]
keywords : ["时间不早了"]
- [x] exitOnQ :
- round : 1
keywords : ["退出", "忘了吧", "重置", "无聊"]
- [x] exitOnA :
- round : 1
keywords : ["退出", "我是一个AI", "我是一个人工", "我是一个基于"]
- [x] envType : 0 # 0=不使用场景描述, 1=在本轮llm回复前发送场景描述, 2=在本轮llm回复后发送场景描述, 场景描述支持[image:xxx][pic:xxx][图片:xxx][背景:xxx]标签, xxx为相对或绝对路径, 需在exe运行目录下
- [x] envPics : [] # 现阶段ai速度太慢,人工指定,数组代表多个,每个数组成员以1: 2: 开始代表对应第几轮.
- [x] envContents : [] # 如果要跳过某个轮次,直接指定文字是2: 图片也是2: 代表本轮文图是空的.
- [x] promptChanceQ :
- probability : 50
text : "让我们休息一下"
- probability : 30
text : "继续前进"
- probability : 70
text : "停下来看看周围"
- probability : 10
text : "尝试一些新东西"
以上參數皆位於多重設定檔的settings部分,你可以決定每個場景的提示字長度,每個場景的長度promptMarksLength,來控制劇情的顆粒度。
故事模式觸發方式一,中間件控制,自行呼叫/gensokyo埠附加不同的prompt參數,手動切斷
在gsk-llm設定ob11機器人框架的http api位址,ob11插件應用端不負責發送訊息,只是根據訊息內容進行條件判斷,作為控制中間件,給開發者自己控制條件的開發自由度。
故事模式觸發方式二,透過設定預設設定檔config.yml的switchOnQ和switchOnA,可以根據關鍵字自動切換分支,
結合prompt參數中設定檔的自己推進故事走向的能力,可以實現基礎的,以提示詞為主的ai故事情節,此外還需要為每一個prompt.yml設計對應的-keyboard.yml,生成氣泡。
promptMarks的keywords為[]代表按promptMarksLength來切換提示詞文件,promptMarksLength代表本提示詞文件維持的上下文長度,
當promptMarksLength小於0時,會從promptMarks中讀取之後的分支,並從中隨機一個切換,當promptMarkType=1時,
1=按條件觸發,promptMarksLength達到時也觸發.
配置詳見流程控制-promptmarks.md
辨識到使用者和模型說出標記就會觸發這個支線(需要自行寫好提示詞,讓llm能根據條件說出.)
你可以使用目前故事片段的,系統提示詞,QA,來引導AI輸出與你約定的切換詞,從而實現為每個目標分支設計多個觸發詞,讓大模型自行決定故事的發展方向。
當enhancedQA為false時,會將檔案中的預先定義的QA加入使用者QA的頂部,存在於llm的記憶當中(不影響整體對話走向)形成弱影響
當enhancedQA為true時,我嘗試將設定檔中預先定義QA的位置從頂部下移到使用者目前對話的前方,但效果不理想,
目前是會與目前使用者的歷史QA進行混合融合,實現對使用者輸入進行一定程度的引導,從而左右故事進程的走向。
引入了「配置控制流」參數,這是一種相比ai-agent靈活性更低,但劇情可控性更高,生成速度和成本更低的方式。
promptChoicesQ & promptChoicesA 文件: 流程控制-promptchoicesQ 流程控制-promptCoverQ 流程控制-promptChanceQ
switchOnQ代表在Q中尋找到匹配文字時切換當前分支,switchOnA同理,其配置方式和promptChoices一致.
流程控制-switchonQA
exitOnQ則是代表偵測到指定關鍵字會退出目前的分支。 流程控制-exitonQA
promptMarks和switchOnQ、switchOnA在功能上是相同的,都是根據關鍵字跳轉分支,promptMarks先執行,不分輪次不分QA,switchOnQ和switchOnA更具體,區分Q和A,區分輪次,實現細節跳轉。
如果有固定且不需要切換的分支,請設定該yml的promptMarksLength為99999
promptMarksLength : 99999
以避免錯誤的切換到不存在的分支,導致會話報錯.
配置控制流程簡單直觀,透過設定檔來管理對話邏輯,設定檔易於維護,非技術人員,如劇情編寫者,可以直接學習設定檔規則,修改設定檔來更新對話邏輯,不需要程式設計知識。
劇情確定性高:給定相同的輸入和配置,劇情走向是大致一致的,這對於確保對話劇情的連貫性和可預測性非常重要。
成本低,對上下文進行巧妙組合和替換,而不是多個ai同時處理,與普通對話消耗幾乎等量的token,省錢。
速度快,像產生普通對話QA一樣產生結果,像寫遊戲腳本一樣寫劇情。
適用於個體開發者和小型開發團隊的低成本ai故事、小說方案,低成本,高速度,高可控,效果隨模型和提示詞效果提升而直接提升。
對於對話劇情聊天場景,如果劇情較為固定,對話路徑預設,且更新頻率不高,使用配置控制流程更適合,因為它提供了高度的可控性和易於理解的管理方式。
如果對話系統需要高度的互動性和個人化,或者劇情變化複雜,需要根據使用者的特定回饋和行為動態調整,那麼使用基於AI的agent方案可能更合適,它需要更高的技術投入和維護成本。
本節介紹了與API通訊的具體終結點資訊。
屬性 | 詳情 |
---|---|
URL | http://localhost:46230/conversation |
方法 | POST |
用戶端應傳送給伺服器的請求體必須為JSON格式,以下表格詳細列出了每個欄位的資料類型及其描述。
欄位名 | 類型 | 描述 |
---|---|---|
message | String | 用戶發送的訊息內容 |
conversationId | String | 目前對話會話的唯一識別符 |
parentMessageId | String | 與此訊息關聯的上一則訊息的標識符 |
下面的JSON物件展示了向該API終結點傳送請求時,請求體的結構:
{
"message" : "我第一句话说的什么" ,
"conversationId" : " 07710821-ad06-408c-ba60-1a69bf3ca92a " ,
"parentMessageId" : " 73b144d2-a41f-4aeb-b3bb-8624f0e54ba6 "
}
此範例展示如何建構一個包含訊息內容、目前對話會話的唯一識別碼以及上一則訊息的識別碼的請求體。這種格式確保了請求的資料不僅符合伺服器的處理規則,同時也便於維護對話上下文的連貫性。
成功回應將傳回狀態碼200
和一個JSON對象,包含以下欄位:
欄位名 | 類型 | 描述 |
---|---|---|
response | String | 介面的回應訊息內容 |
conversationId | String | 當前對話的唯一識別符 |
messageId | String | 當前訊息的唯一識別符 |
details | Object | 包含額外的使用詳情 |
usage | Object (在details ) | 使用詳情,如代幣計數 |
{
"response" : "回答内容" ,
"conversationId" : " c9b8746d-aa8c-44b3-804a-bb5ad27f5b84 " ,
"messageId" : " 36cc9422-da58-47ec-a25e-e8b8eceb47f5 " ,
"details" : {
"usage" : {
"prompt_tokens" : 88 ,
"completion_tokens" : 2
}
}
}
可在各種架構運行(原生android暫不支持,sqlitev3需要cgo) 由於cgo編譯比較複雜,arm平台,或者其他架構,可試圖在對應系統架構下,自行本地編譯
API方式呼叫QQ頻道直接接入
審核員請求參數
當需要將請求發給另一個GSK LLM 作為審核員時,應該傳回的JSON 格式如下:
{ "result" : %s }
這裡的%s
代表一個將被替換為具體浮點數值的佔位符。
氣泡生成請求結果
當請求另一個GSK LLM 產生氣泡時,應該傳回的JSON 格式如下:
[ " " , " " , " " ]
這表示氣泡產生的結果是一個包含三個字串的陣列。這個格式用於在回傳結果時指明三個不同的氣泡,也可以少於或等於3個.
現已不再需要開多個gsk-llm實現類agent功能,基於新的多配置覆蓋,prompt參數和lotus特性,可以自己請求自己實現氣泡生成,故事推進等複雜特性.
GetAIPromptkeyboardPath可以是自身位址,可以帶有prompt參數
當使用中間件指定prompt參數時,配置位於prompts資料夾,其格式xxx-keyboard.yml,若未使用中間件,請在path中指定prompts參數,並將對應的xxx.yml放在prompts資料夾下)
設定係統提示詞的gsk-llm聯合工作的/conversation位址,約定係統提示詞需回傳文字json陣列(3個).
本專案參考了以下知名專案的想法,實現了一個簡化的AI文字控制流程配置格式.
Rasa
Twine
Inklewriter