go llm
1.0.0
將大型語言模型 (LLM) 的強大功能整合到您的 Go 應用程式中。
該專案旨在抽像出大部分管道(自由文字到結構化資料、上下文記憶體、工具包裝、重試邏輯等),以便您可以專注於代理的業務邏輯。
圖LR
子圖輸入
A[結構化輸入] --> B[編譯任務]
結尾
基於LLM的子圖代理
C[任務範本] --> B[編譯任務]
B --> D((代理))
D --「推理」--> D
D --「動作」--> E[環境]
E --「觀察」--> D
D --“答案”--> G[輸出驗證器]
G-->D
結尾
子圖輸出
G --「答案」--> F[結構化輸出]
結尾
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/natexcvi/go-llm/agents"
"github.com/natexcvi/go-llm/engines"
"github.com/natexcvi/go-llm/memory"
"github.com/natexcvi/go-llm/tools"
)
type CodeBaseRefactorRequest struct {
Dir string
Goal string
}
func ( req CodeBaseRefactorRequest ) Encode () string {
return fmt . Sprintf ( `{"dir": "%s", "goal": "%s"}` , req . Dir , req . Goal )
}
func ( req CodeBaseRefactorRequest ) Schema () string {
return `{"dir": "path to code base", "goal": "refactoring goal"}`
}
type CodeBaseRefactorResponse struct {
RefactoredFiles map [ string ] string `json:"refactored_files"`
}
func ( resp CodeBaseRefactorResponse ) Encode () string {
marshalled , err := json . Marshal ( resp . RefactoredFiles )
if err != nil {
panic ( err )
}
return string ( marshalled )
}
func ( resp CodeBaseRefactorResponse ) Schema () string {
return `{"refactored_files": {"path": "description of changes"}}`
}
func main () {
task := & agents. Task [ CodeBaseRefactorRequest , CodeBaseRefactorResponse ]{
Description : "You will be given access to a code base, and instructions for refactoring." +
"your task is to refactor the code base to meet the given goal." ,
Examples : []agents. Example [ CodeBaseRefactorRequest , CodeBaseRefactorResponse ]{
{
Input : CodeBaseRefactorRequest {
Dir : "/Users/nate/code/base" ,
Goal : "Handle errors gracefully" ,
},
Answer : CodeBaseRefactorResponse {
RefactoredFiles : map [ string ] string {
"/Users/nate/code/base/main.py" : "added try/except block" ,
},
},
IntermediarySteps : [] * engines. ChatMessage {
( & agents. ChainAgentThought {
Content : "I should scan the code base for functions that might error." ,
}). Encode ( engine ),
( & agents. ChainAgentAction {
Tool : tools . NewBashTerminal (),
Args : json . RawMessage ( `{"command": "ls /Users/nate/code/base"}` ),
}). Encode ( engine ),
( & agents. ChainAgentObservation {
Content : "main.py" ,
ToolName : tools . NewBashTerminal (). Name (),
}). Encode ( engine ),
( & agents. ChainAgentThought {
Content : "Now I should read the code file." ,
}). Encode ( engine ),
( & agents. ChainAgentAction {
Tool : tools . NewBashTerminal (),
Args : json . RawMessage ( `{"command": "cat /Users/nate/code/base/main.py"}` ),
}). Encode ( engine ),
( & agents. ChainAgentObservation {
Content : "def main(): n t func_that_might_error()" ,
ToolName : tools . NewBashTerminal (). Name (),
}). Encode ( engine ),
( & agents. ChainAgentThought {
Content : "I should refactor the code to handle errors gracefully." ,
}). Encode ( engine ),
( & agents. ChainAgentAction {
Tool : tools . NewBashTerminal (),
Args : json . RawMessage ( `{"command": "echo 'def main():nttry:nttfunc_that_might_error()ntexcept Exception as e:nttprint("Error: %s", e)' > /Users/nate/code/base/main.py"}` ),
}). Encode ( engine ),
},
},
},
AnswerParser : func ( msg string ) ( CodeBaseRefactorResponse , error ) {
var res CodeBaseRefactorResponse
if err := json . Unmarshal ([] byte ( msg ), & res ); err != nil {
return CodeBaseRefactorResponse {}, err
}
return res , nil
},
}
agent := agents . NewChainAgent ( engines . NewGPTEngine ( os . Getenv ( "OPENAI_TOKEN" ), "gpt-3.5-turbo-0613" ), task , memory . NewBufferedMemory ( 0 )). WithMaxSolutionAttempts ( 12 ). WithTools ( tools . NewPythonREPL (), tools . NewBashTerminal ())
res , err := agent . Run ( CodeBaseRefactorRequest {
Dir : "/Users/nate/Git/go-llm/tools" ,
Goal : "Write unit tests for the bash.go file, following the example of python_repl_test.go." ,
})
...
}
筆記
有趣的事實:
tools/bash_test.go
檔案就是由這個代理人編寫的,並且幫助發現了一個錯誤!
LLM 引擎的連接器。目前僅支援 OpenAI 的 GPT 聊天完成 API。
可以為代理人提供執行與外界互動的操作的能力的工具。目前可用的工具有:
PythonREPL
- 一種允許代理程式在 REPL 中執行 Python 程式碼的工具。IsolatedPythonREPL
- 一個允許代理程式在 REPL 中但在 Docker 容器中執行 Python 程式碼的工具。BashTerminal
- 一種允許代理程式在終端機中執行 bash 指令的工具。GoogleSearch
- 允許代理程式搜尋 Google 的工具。WebpageSummary
- 一種基於 LLM 的工具,允許代理程式取得網頁摘要。WolframAlpha
- 一個允許代理程式查詢 WolframAlpha 的簡答 API 的工具。KeyValueStore
- 用於儲存和檢索資訊的工具。代理可以使用此工具透過引用重新使用長訊息,消除重複,從而減少上下文大小。AskUser
- 一種互動工具,可讓代理在需要時向操作員詢問澄清情況。JSONAutoFixer
- 預設啟用的元工具。當任何工具的參數以無效 JSON 的形式提供時,工具會嘗試使用單獨的 LLM 鏈修復有效負載。GenericAgentTool
- 讓一個代理程式使用預先確定的工具運行另一個代理,動態地為其提供任務和輸入並收集其最終答案。警告
BashTerminal
和常規PythonREPL
工具允許代理程式在您的電腦上執行任意命令,使用風險由您自行承擔。使用對操作確認回呼的內建支援可能是個好主意(請參閱ChainAgent
類型上的WithActionConfirmation
方法)。
go-llm
工具透明地支援新的 OpenAI 函數呼叫接口,適用於具有此功能的模型變體。
允許代理程式儲存和檢索資訊的儲存系統。目前可用的記憶體系統有:
BufferMemory
- 為代理程式的每個步驟提供對話歷史記錄中的最新訊息的固定緩衝區。SummarisedMemory
- 它為代理的每一步提供對話歷史記錄的摘要,由法學碩士提供支援。代理是圖書館的主要組成部分。代理可以執行涉及與外界迭代交互的複雜任務。
一系列現成的代理,可以輕鬆地與您的應用程式整合。
代理和引擎的評估工具集合。
package main
import (
"fmt"
"os"
"github.com/natexcvi/go-llm/engines"
"github.com/natexcvi/go-llm/evaluation"
)
func goodness ( _ * engines. ChatPrompt , _ * engines. ChatMessage , err error ) float64 {
if err != nil {
return 0
}
return 1
}
func main () {
engine := engines . NewGPTEngine ( os . Getenv ( "OPENAI_TOKEN" ), "gpt-3.5-turbo-0613" )
engineRunner := evaluation . NewLLMRunner ( engine )
evaluator := evaluation . NewEvaluator ( engineRunner , & evaluation. Options [ * engines. ChatPrompt , * engines. ChatMessage ]{
GoodnessFunction : goodness ,
Repetitions : 5 ,
})
testPack := [] * engines. ChatPrompt {
{
History : [] * engines. ChatMessage {
{
Text : "Hello, how are you?" ,
},
{
Text : "I'm trying to understand how this works." ,
},
},
},
{
History : [] * engines. ChatMessage {
{
Text : "Could you please explain it to me?" ,
},
},
},
}
results := evaluator . Evaluate ( testPack )
fmt . Println ( "Goodness level of the first prompt:" , results [ 0 ])
fmt . Println ( "Goodness level of the second prompt:" , results [ 1 ])
}