Passer au contenu principal
Ce guide vous montre comment instrumenter votre application afin que son exécution apparaisse sous forme de traces détaillées dans W&B Weave. Les traces vous aident à déboguer, évaluer et surveiller le code basé sur des LLM en capturant les entrées, les sorties et la structure de chaque opération sous forme d’Appel. Pour voir votre code en cours d’exécution sous forme de traces détaillées dans Weave, créez des Appels. Les sections suivantes décrivent les trois principales façons de procéder, de la plus automatisée à la plus manuelle :
  • Suivi automatique des appels de bibliothèques LLM.
  • Suivi des fonctions personnalisées avec weave.op.
  • Suivi manuel des Appels directement à l’aide de l’API.
Choisissez l’approche qui correspond au niveau de contrôle dont vous avez besoin sur les éléments à tracer.

Suivi automatique des Appels aux bibliothèques LLM

Weave s’intègre automatiquement à de nombreuses bibliothèques et frameworks courants, tels que openai, anthropic, cohere, mistral et LangChain. Importez la bibliothèque LLM ou le framework, puis initialisez votre projet Weave. Weave trace ensuite automatiquement tous les Appels adressés au LLM ou à la plateforme dans votre projet, sans nécessiter de modification de code supplémentaire. Pour obtenir la liste complète des intégrations de bibliothèques prises en charge, voir Aperçu des intégrations.
import weave

from openai import OpenAI
client = OpenAI()

# Initialiser Weave Tracing
weave.init('intro-example')

response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {
            "role": "user",
            "content": "How are you?"
        }
    ],
    temperature=0.8,
    max_tokens=64,
    top_p=1,
)
Si vous souhaitez mieux contrôler le comportement automatique, voir Configurer le suivi automatique des Appels LLM.

Suivi des fonctions personnalisées

Les applications LLM comportent souvent une logique supplémentaire (comme le prétraitement/post-traitement, les prompts, etc.) que vous souhaitez suivre. Utilisez cette approche lorsque vous souhaitez que Weave capture vos propres fonctions en plus des Appels LLM qu’il trace automatiquement.
Weave vous permet de suivre manuellement ces Appels à l’aide du décorateur @weave.op. Par exemple :
import weave

# initialiser Weave Tracing
weave.init('intro-example')

# Décorez votre fonction
@weave.op
def my_function(name: str):
    return f"Hello, {name}!"

# Appelez votre fonction -- Weave suivra automatiquement les entrées et les sorties
print(my_function("World"))
Vous pouvez également suivre les méthodes de classe.

Suivre les méthodes de classe et d’instance

En plus des fonctions autonomes, vous pouvez également suivre les méthodes de classe et d’instance. Vous pouvez suivre n’importe quelle méthode d’une classe en la décorant avec weave.op.
import weave

# initialiser Weave Tracing
weave.init("intro-example")

class MyClass:
    # Décorez votre méthode
    @weave.op
    def my_method(self, name: str):
        return f"Hello, {name}!"

instance = MyClass()

# Appelez votre méthode -- Weave suivra automatiquement les entrées et les sorties
print(instance.my_method("World"))

Tracer des appels de fonction parallèles (multithread)

Par défaut, les appels parallèles apparaissent tous dans Weave comme des appels racine distincts, ce qui rend la hiérarchie de trace difficile à suivre. Pour obtenir un imbriquement correct sous le même op parent, utilisez un ThreadPoolExecutor.
L’exemple de code suivant montre comment utiliser ThreadPoolExecutor. La première fonction, func, est un op simple qui prend x et renvoie x+1. La deuxième fonction, outer, est un autre op qui accepte une liste d’entrées. Dans outer, l’utilisation de ThreadPoolExecutor et de exc.map(func, inputs) signifie que chaque appel à func conserve le même contexte de trace parent.
import weave

@weave.op
def func(x):
    return x+1

@weave.op
def outer(inputs):
    with weave.ThreadPoolExecutor() as exc:
        exc.map(func, inputs)

# Mettez à jour le nom de votre projet Weave
client = weave.init('my-weave-project')
outer([1,2,3,4,5])
Dans la Weave UI, cela produit un seul appel parent avec cinq appels enfants imbriqués. Vous obtenez une trace entièrement hiérarchisée, même si les opérations d’incrémentation s’exécutent en parallèle. La Trace UI, montrant un seul appel parent pour outer, avec cinq appels enfants imbriqués.

Suivi manuel des appels

Si ni l’intégration automatique ni le décorateur weave.op ne conviennent à votre flux de travail, vous pouvez créer manuellement des appels directement via l’API. Cette approche vous donne un contrôle complet sur le moment où un appel commence et se termine, au prix de davantage de code standard.
import weave

# Initialiser Weave Tracing
client = weave.init('intro-example')

def my_function(name: str):
    # Démarrer un appel
    call = client.create_call(op="my_function", inputs={"name": name})

    # ... le code de votre fonction ...

    # Terminer un appel
    client.finish_call(call, output="Hello, World!")

    # Appeler votre fonction
    print(my_function("World"))