Integrasikan kekuatan model bahasa besar (LLM) ke dalam aplikasi Go Anda.
Proyek ini bertujuan untuk mengabstraksi sebagian besar proses (teks bebas ke data terstruktur, memori kontekstual, pembungkusan alat, logika percobaan ulang, dll.) sehingga Anda dapat fokus pada logika bisnis agen Anda.
grafik LR
subgraf Masukan
A[Input Terstruktur] --> B[Tugas Terkompilasi]
akhir
subgraf Agen Berbasis LLM
C[Template Tugas] --> B[Tugas yang Dikompilasi]
B --> D((Agen))
D --"Penalaran"--> D
D --"Aksi"--> E[Lingkungan]
E --"Pengamatan"--> D
D --"Jawab"--> G[Validator Keluaran]
G --> D
akhir
subgraf Keluaran
G --"Jawaban"--> F[Output Terstruktur]
akhir
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." ,
})
...
}
Catatan
Fakta menarik: file
tools/bash_test.go
ditulis oleh agen ini, dan membantu menemukan bug!
Konektor ke mesin LLM. Saat ini hanya API penyelesaian obrolan GPT OpenAI yang didukung.
Alat yang dapat memberikan agen kemampuan untuk melakukan tindakan berinteraksi dengan dunia luar. Alat yang tersedia saat ini adalah:
PythonREPL
- alat yang memungkinkan agen mengeksekusi kode Python dalam REPL.IsolatedPythonREPL
- alat yang memungkinkan agen mengeksekusi kode Python di REPL, tetapi dalam container Docker.BashTerminal
- alat yang memungkinkan agen menjalankan perintah bash di terminal.GoogleSearch
- alat yang memungkinkan agen mencari di Google.WebpageSummary
- alat berbasis LLM yang memungkinkan agen mendapatkan ringkasan halaman web.WolframAlpha
- alat yang memungkinkan agen menanyakan API jawaban singkat WolframAlpha.KeyValueStore
- alat untuk menyimpan dan mengambil informasi. Agen dapat menggunakan alat ini untuk menggunakan kembali informasi yang panjang sebagai referensi, menghilangkan duplikasi dan karenanya mengurangi ukuran konteks.AskUser
- alat interaktivitas yang memungkinkan agen meminta klarifikasi kepada operator manusia bila diperlukan.JSONAutoFixer
- alat meta yang diaktifkan secara default. Ketika argumen untuk alat apa pun diberikan dalam bentuk JSON yang tidak valid, alat ini mencoba memperbaiki payload menggunakan rantai LLM terpisah.GenericAgentTool
- memungkinkan agen menjalankan agen lain, dengan alat yang telah ditentukan sebelumnya, secara dinamis memberikan tugas dan masukan serta mengumpulkan jawaban akhirnya.Peringatan
Alat
BashTerminal
danPythonREPL
reguler memungkinkan agen menjalankan perintah sewenang-wenang di mesin Anda, gunakan dengan risiko Anda sendiri. Mungkin ada baiknya menggunakan dukungan bawaan untuk callback konfirmasi tindakan (lihat metodeWithActionConfirmation
pada tipeChainAgent
).
alat go-llm
mendukung antarmuka panggilan fungsi OpenAI baru secara transparan, untuk varian model yang memiliki fitur ini.
Sistem memori yang memungkinkan agen untuk menyimpan dan mengambil informasi. Sistem memori yang tersedia saat ini adalah:
BufferMemory
- yang menyediakan buffer tetap untuk pesan terbaru dari riwayat percakapan pada setiap langkah agen.SummarisedMemory
- yang memberikan setiap langkah agen ringkasan riwayat percakapan, didukung oleh LLM.Agen adalah komponen utama perpustakaan. Agen dapat melakukan tugas kompleks yang melibatkan interaksi berulang dengan dunia luar.
Kumpulan agen siap pakai yang dapat diintegrasikan dengan mudah dengan aplikasi Anda.
Kumpulan alat evaluasi untuk agen dan mesin.
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 ])
}