Comment LangChain met en œuvre l’auto-interrogation
LangChain est une bibliothèque open source très populaire pour l’orchestration des LLM. Récemment, ils ont ajouté le récupérateur “Self Query”. Le récupérateur “Self Query” vous permet d’utiliser LangChain pour interroger une base de données vectorielle comme Milvus. Voyons comment ce récupérateur self-query est implémenté. Nous couvrons les lignes 189 à 233 du fichier base.py dans le dossier self-query. Cet article couvre également from_llm, la seule méthode de classe.
Dans cet article, nous aborderons :
- La définition de la méthode de classe Self Query
- L’analyse des paramètres Self-Query
- La création de la chaîne LLM
- Le renvoi d’un récupérateur Self Query
Définition de la méthode de classe self query
La seule méthode de classe pour la classe de base self query est from_llm. Il y a huit paramètres spécifiés et un pour nous permettre de passer des arguments nommés (kwargs). Vous remarquerez peut-être que le premier “paramètre” de la classe est cls. Si vous n’avez pas de formation formelle en Python, la différence entre cls et self est simplement une question de style et d’usage, selon PEP8.
Il y a quatre paramètres requis pour créer une classe self query : llm, vectorstore, document_contents et metadata_field_info.
llmsert à transmettre un modèle de langage.vectorstoreest utilisé pour transmettre un magasin vectoriel comme Milvus.- Le nom du paramètre
document_contentsest un peu trompeur. Il ne fait pas référence au contenu réel des documents stockés, mais plutôt à une brève description de ceux-ci. metadata_field_infoest une séquence d’objetsAttributeInfo, des dictionnaires contenant des informations sur les données dans la base de données vectorielle.
Après les paramètres requis viennent les paramètres facultatifs. Ils sont également au nombre de quatre : structured_query_translator, chain_kwargs, enable_limit et use_original_query. Les deux premiers valent par défaut None, et le second False.
Le paramètre structured_query_translator nous permet de transmettre un traducteur. Les traducteurs convertissent les expressions en instructions de filtre pour chaque base de données vectorielle. Ces instructions de filtre sont transmises à chain_kwargs sous forme de “allowed_comparators” ou “allowed_operators,” selon leur utilisation. Chaque magasin vectoriel possède des comparateurs et opérateurs uniques. Par exemple, voici les expressions booléennes autorisées pour Milvus.
À l’aide du paramètre enable_limit, nous pouvons décider d’activer ou non l’opérateur limit. Cet opérateur est une fonctionnalité native de LangChain qui limite le nombre de documents à récupérer. Le dernier paramètre est use_original_query, qui détermine si nous voulons utiliser notre requête originale ou celle générée par le LLM.
@classmethod
def from_llm(
cls,
llm: BaseLanguageModel,
vectorstore: VectorStore,
document_contents: str,
metadata_field_info: Sequence[Union[AttributeInfo, dict]],
structured_query_translator: Optional[Visitor] = None,
chain_kwargs: Optional[Dict] = None,
enable_limit: bool = False,
use_original_query: bool = False,
**kwargs: Any,
) -> "SelfQueryRetriever":
Analyse des paramètres self query
Laissez-moi vous expliquer comment nous gérons les paramètres. En fonction des paramètres transmis, nous utilisons une série d’instructions if pour déterminer quoi faire.
Tout d’abord, nous vérifions s’il existe un traducteur de requêtes structurées déjà défini. Si ce n’est pas le cas, nous utilisons le traducteur intégré pour le magasin vectoriel défini.
Ensuite, nous vérifions les arguments nommés de la chaîne. Nous pouvons les définir sur les valeurs transmises ou les laisser dans un dictionnaire vide. Nous continuons à vérifier ces arguments pour les deux instructions if suivantes. Les deux clés que nous recherchons sont les comparateurs et les opérateurs autorisés. Ces clés déterminent comment nous pouvons écrire les expressions de filtre.
if structured_query_translator is None:
structured_query_translator = _get_builtin_translator(vectorstore)
chain_kwargs = chain_kwargs or {}
if (
"allowed_comparators" not in chain_kwargs
and structured_query_translator.allowed_comparators is not None
):
chain_kwargs[
"allowed_comparators"
] = structured_query_translator.allowed_comparators
if (
"allowed_operators" not in chain_kwargs
and structured_query_translator.allowed_operators is not None
):
chain_kwargs[
"allowed_operators"
] = structured_query_translator.allowed_operators
Création de la chaîne LLM
Une fois tout défini, nous pouvons maintenant créer notre constructeur de requêtes. Dans cette étape, nous faisons appel à la fonction load_query_constructor_runnable des constructeurs de requêtes. Nous approfondirons cette étape dans un autre article.
Nous devons transmettre le LLM, la description du contenu du document, les champs de métadonnées, le fait que nous voulions ou non activer la limite, ainsi que les arguments nommés à transmettre à la chaîne. Après avoir défini tous ces éléments, la fonction renvoie un objet Runnable, qui nous permet d’exécuter un script spécifié.
query_constructor = load_query_constructor_runnable(
llm,
document_contents,
metadata_field_info,
enable_limit=enable_limit,
**chain_kwargs,
)
Retourner un récupérateur de requête autonome
À la fin de cette méthode de classe, nous devons retourner le récupérateur de requête autonome. Cette méthode renvoie une instance de la classe de requête autonome. Nous transmettons le constructeur de requêtes que nous venons de définir, ainsi que le magasin vectoriel transmis, le fait d’utiliser ou non la requête d’origine, le traducteur et une liste d’arguments nommés.
return cls(
query_constructor=query_constructor,
vectorstore=vectorstore,
use_original_query=use_original_query,
structured_query_translator=structured_query_translator,
**kwargs,
)
Résumé de la manière dont LangChain implémente l’auto-interrogation
Dans cet article, nous avons expliqué comment LangChain implémente un concept qu’ils appellent « auto-interrogation ». C’est une manière de construire une application simple de génération augmentée par récupération (RAG). Elle utilise tous les mêmes composants : un LLM, une base de données vectorielle et quelques prompts pour interagir avec le LLM.
L’auto-interrogation représente un bloc de code assez volumineux dans LangChain, mais cet article couvre spécifiquement la méthode de classe from_llm. Cette méthode nous permet de créer une application RAG en ne transmettant que quatre champs obligatoires. Le LLM, la base de données vectorielle, une description des documents et les informations de métadonnées. Vous voulez en savoir plus sur les LLM et les bases de données vectorielles ? Venez discuter avec nous sur Discord.
Continuer à lire

Why Teams Are Migrating from Weaviate to Zilliz Cloud — and How to Do It Seamlessly
Explore how Milvus scales for large datasets and complex queries with advanced features, and discover how to migrate from Weaviate to Zilliz Cloud.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.

What is the K-Nearest Neighbors (KNN) Algorithm in Machine Learning?
KNN is a supervised machine learning technique and algorithm for classification and regression. This post is the ultimate guide to KNN.



