Observabilité open source pour votre application LLM
OpenLlMetry est un ensemble d'extensions construites au-dessus de l'OpenTelemetry qui vous donne une observabilité complète sur votre application LLM. Parce qu'il utilise l'OpenTelemétrie sous le capot, il peut être connecté à vos solutions d'observabilité existantes - Datadog, Honeycomb et autres.
Il est construit et entretenu par Traceloop sous la licence Apache 2.0.
Le repo contient des instrumentations d'openteLemétrie standard pour les fournisseurs LLM et les DB vectoriels, ainsi qu'un SDK Traceloop qui facilite le démarrage avec OpenLllmétrie, tout en émettant des données d'openteLemétrie standard qui peuvent être connectées à votre pile d'observabilité. Si vous avez déjà des instruments OpenTelemetry, vous pouvez simplement ajouter l'une de nos instrumentations directement.
La façon la plus simple de commencer est d'utiliser notre SDK. Pour un guide complet, rendez-vous sur nos documents.
Installez le SDK:
go get github.com/traceloop/go-openllmetry/traceloop-sdkEnsuite, initialisez le SDK dans votre code:
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 ) }()
}C'est ça. Vous tracez maintenant votre code avec OpenLlmetry!
Maintenant, vous devez décider où exporter les traces vers.
Voir nos documents pour des instructions sur la connexion à chacun.
OpenLllmétrie est en phase exploratoire en début de alpha, et nous déterminons toujours quoi instrument. Contrairement à d'autres langues, il n'y a pas encore beaucoup de bibliothèques LLM officielles (encore?), Donc pour l'instant vous devrez enregistrer manuellement les invites:
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 ,
})
}Que ce soit grand ou petit, nous aimons les contributions ❤️ Consultez notre guide pour voir comment commencer.
Vous ne savez pas par où commencer? Tu peux:
À @patrickdebois, qui a suggéré le grand nom que nous utilisons maintenant pour ce dépôt!