Наблюдаемость с открытым исходным кодом для вашего приложения LLM
OpenllMetry - это набор расширений, построенных на вершине OpenteLemetry, который дает вам полную наблюдению за вашим применением LLM. Поскольку он использует OpenElemetry под капотом, он может быть подключен к вашим существующим решениям для наблюдения - Datadog, Honeycomb и другие.
Он построен и поддерживается Traceloop по лицензии Apache 2.0.
Repo содержит стандартные инструменты Opentelemetry для поставщиков LLM и Vector DBS, а также SDK TraceLoop, который позволяет легко начать работу с OpenLlMetry, при этом выводя стандартные данные OpenEleMetry, которые могут быть подключены к вашему стеку наблюдений. Если у вас уже есть инструмент Opentelemetry, вы можете просто добавить любой из наших инструментов напрямую.
Самый простой способ начать это использовать наш SDK. Для полного руководства, перейдите в наши документы.
Установите SDK:
go get github.com/traceloop/go-openllmetry/traceloop-sdkЗатем инициализируйте SDK в вашем коде:
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 ) }()
}Вот и все. Теперь вы отслеживаете свой код с OpenllMetry!
Теперь вам нужно решить, куда экспортировать следы.
Смотрите наши документы для инструкций по подключению к каждому.
OpenllMetry находится на ранней альфа-исследовательской стадии, и мы все еще выясняем, что делать. В отличие от других языков, это не так много официальных библиотек LLM (пока?), Так что сейчас вам придется вручную журналировать подсказки:
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 ,
})
}Будь то большой или маленький, мы любим вклад ❤ Посмотрите наше руководство, чтобы увидеть, как начать.
Не уверены, с чего начать? Ты можешь:
@Patrickdebois, который предложил отличное имя, которое мы сейчас используем для этого репо!