Observabilitas Sumber Terbuka untuk Aplikasi LLM Anda
Openllmetry adalah satu set ekstensi yang dibangun di atas OpenTelemetry yang memberi Anda kemampuan observasi lengkap atas aplikasi LLM Anda. Karena menggunakan OpenTelemetry di bawah kap, dapat dihubungkan ke solusi observabilitas Anda yang ada - Datadog, Honeycomb, dan lainnya.
Ini dibangun dan dikelola oleh Traceloop di bawah lisensi Apache 2.0.
REPO berisi instrumentasi opentelemetry standar untuk penyedia LLM dan DB vektor, serta SDK traceloop yang membuatnya mudah untuk memulai dengan openllmetry, sambil tetap menghasilkan data openTelemetri standar yang dapat dihubungkan ke tumpukan pengamatan Anda. Jika Anda sudah memiliki OpenTelemetry Instrumented, Anda bisa menambahkan instrumentasi kami secara langsung.
Cara termudah untuk memulai adalah dengan menggunakan SDK kami. Untuk panduan lengkap, buka dokumen kami.
Instal SDK:
go get github.com/traceloop/go-openllmetry/traceloop-sdkKemudian, inisialisasi SDK dalam kode Anda:
package main
import (
"context"
sdk "github.com/traceloop/go-openllmetry/traceloop-sdk"
)
func main () {
ctx := context . Background ()
traceloop := sdk . NewClient ( ctx , sdk. Config {
APIKey : os . Getenv ( "TRACELOOP_API_KEY" ),
})
defer func () { traceloop . Shutdown ( ctx ) }()
}Itu saja. Anda sekarang menelusuri kode Anda dengan OpenLlMetry!
Sekarang, Anda perlu memutuskan ke mana harus mengekspor jejak.
Lihat dokumen kami untuk instruksi tentang menghubungkan ke masing -masing.
Openllmetry sedang dalam tahap eksplorasi alpha awal, dan kami masih mencari tahu apa yang harus dilakukan oleh instrumen. Berbeda dengan bahasa lain, tidak ada banyak perpustakaan LLM resmi (belum?), Jadi untuk saat ini Anda harus mencatat petunjuk secara manual:
package main
import (
"context"
"fmt"
"os"
"github.com/sashabaranov/go-openai"
sdk "github.com/traceloop/go-openllmetry/traceloop-sdk"
)
func main () {
ctx := context . Background ()
// Initialize Traceloop
traceloop := sdk . NewClient ( ctx , config. Config {
APIKey : os . Getenv ( "TRACELOOP_API_KEY" ),
})
defer func () { traceloop . Shutdown ( ctx ) }()
// Call OpenAI like you normally would
resp , err := client . CreateChatCompletion (
context . Background (),
openai. ChatCompletionRequest {
Model : openai . GPT3Dot5Turbo ,
Messages : []openai. ChatCompletionMessage {
{
Role : openai . ChatMessageRoleUser ,
Content : "Tell me a joke about OpenTelemetry!" ,
},
},
},
)
var promptMsgs []sdk. Message
for i , message := range request . Messages {
promptMsgs = append ( promptMsgs , sdk. Message {
Index : i ,
Content : message . Content ,
Role : message . Role ,
})
}
// Log the request
llmSpan , err := traceloop . LogPrompt (
ctx ,
sdk. Prompt {
Vendor : "openai" ,
Mode : "chat" ,
Model : request . Model ,
Messages : promptMsgs ,
},
sdk. TraceloopAttributes {
WorkflowName : "example-workflow" ,
EntityName : "example-entity" ,
},
)
if err != nil {
fmt . Printf ( "LogPrompt error: %v n " , err )
return
}
client := openai . NewClient ( os . Getenv ( "OPENAI_API_KEY" ))
resp , err := client . CreateChatCompletion (
context . Background (),
* request ,
)
if err != nil {
fmt . Printf ( "ChatCompletion error: %v n " , err )
return
}
var completionMsgs []sdk. Message
for _ , choice := range resp . Choices {
completionMsgs = append ( completionMsgs , sdk. Message {
Index : choice . Index ,
Content : choice . Message . Content ,
Role : choice . Message . Role ,
})
}
// Log the response
llmSpan . LogCompletion ( ctx , sdk. Completion {
Model : resp . Model ,
Messages : completionMsgs ,
}, sdk. Usage {
TotalTokens : resp . Usage . TotalTokens ,
CompletionTokens : resp . Usage . CompletionTokens ,
PromptTokens : resp . Usage . PromptTokens ,
})
}Entah itu besar atau kecil, kami menyukai kontribusi ❤️ Periksa panduan kami untuk melihat cara memulai.
Tidak yakin harus mulai dari mana? Anda bisa:
Untuk @PatrickDebois, yang menyarankan nama besar yang sekarang kita gunakan untuk repo ini!