Een hulpprogramma voor het ophalen van vectorzoekopdrachten maken
Belangrijk
Deze functie is beschikbaar als openbare preview.
Meer informatie over het gebruik van Mosaic AI Agent Framework om retrievers te maken. Een retriever is een type agenthulpprogramma waarmee relevante documenten worden gevonden en geretourneerd met behulp van een Vector Search-index. Retrievers zijn een kernonderdeel van RAG-toepassingen (Retrieval Augmented Generation).
Vereisten
- MLflow is alleen beschikbaar op MLflow
Document
versie 2.14.0 en hoger. - Een bestaande Vector Search-index.
Voorbeeld van PyFunc-retriever
In het volgende voorbeeld wordt databricks-vectorsearch gebruikt om een eenvoudige retriever te maken waarmee een vectorzoekactie met filters wordt uitgevoerd. Er worden MLflow-decorators gebruikt om agenttracering in te schakelen.
De functie retriever moet een documenttype retourneren. Gebruik het metadata
veld in de documentklasse om extra kenmerken toe te voegen aan het geretourneerde document, zoals like doc_uri
en similarity_score
.
Gebruik de volgende code in de agentmodule of agentnotebook.
import mlflow
import json
from mlflow.entities import Document
from typing import List, Dict, Any
from dataclasses import asdict
from databricks.vector_search.client import VectorSearchClient
class VectorSearchRetriever:
"""
Class using Databricks Vector Search to retrieve relevant documents.
"""
def __init__(self):
self.vector_search_client = VectorSearchClient(disable_notice=True)
# TODO: Replace this with the list of column names to return in the result when querying Vector Search
self.columns = ["chunk_id", "text_column", "doc_uri"]
self.vector_search_index = self.vector_search_client.get_index(
index_name="catalog.schema.chunked_docs_index"
)
mlflow.models.set_retriever_schema(
name="vector_search",
primary_key="chunk_id",
text_column="text_column",
doc_uri="doc_uri"
)
@mlflow.trace(span_type="RETRIEVER", name="vector_search")
def __call__(
self,
query: str,
filters: Dict[Any, Any] = None,
score_threshold = None
) -> List[Document]:
"""
Performs vector search to retrieve relevant chunks.
Args:
query: Search query.
filters: Optional filters to apply to the search. Filters must follow the Databricks Vector Search filter spec
score_threshold: Score threshold to use for the query.
Returns:
List of retrieved Documents.
"""
results = self.vector_search_index.similarity_search(
query_text=query,
columns=self.columns,
filters=filters,
num_results=5,
query_type="ann"
)
documents = self.convert_vector_search_to_documents(
results, score_threshold
)
return [asdict(doc) for doc in documents]
@mlflow.trace(span_type="PARSER")
def convert_vector_search_to_documents(
self, vs_results, score_threshold
) -> List[Document]:
docs = []
column_names = [column["name"] for column in vs_results.get("manifest", {}).get("columns", [])]
result_row_count = vs_results.get("result", {}).get("row_count", 0)
if result_row_count > 0:
for item in vs_results["result"]["data_array"]:
metadata = {}
score = item[-1]
if score >= score_threshold:
metadata["similarity_score"] = score
for i, field in enumerate(item[:-1]):
metadata[column_names[i]] = field
page_content = metadata.pop("text_column", None)
if page_content:
doc = Document(
page_content=page_content,
metadata=metadata
)
docs.append(doc)
return docs
Voer de volgende Python-code uit om de retriever uit te voeren. U kunt eventueel Vector Search-filters opnemen in de aanvraag om resultaten te filteren.
retriever = VectorSearchRetriever()
query = "What is Databricks?"
filters={"text_column LIKE": "Databricks"},
results = retriever(query, filters=filters, score_threshold=0.1)
Schema voor ophalen instellen
Als u ervoor wilt zorgen dat retrievers correct worden getraceerd, roept u mlflow.models.set_retriever_schema aan wanneer u uw agent in code definieert. Gebruik set_retriever_schema
deze functie om de kolomnamen in de geretourneerde tabel toe te wijzen aan de verwachte velden van MLflow, zoals primary_key
, text_column
en doc_uri
.
# Define the retriever's schema by providing your column names
mlflow.models.set_retriever_schema(
name="vector_search",
primary_key="chunk_id",
text_column="text_column",
doc_uri="doc_uri"
# other_columns=["column1", "column2"],
)
Notitie
De doc_uri
kolom is vooral belangrijk bij het evalueren van de prestaties van de retriever. doc_uri
is de belangrijkste id voor documenten die door de retriever worden geretourneerd, zodat u deze kunt vergelijken met basis-waarheidsevaluatiesets. Zie Evaluatiesets.
U kunt ook extra kolommen opgeven in het schema van de retriever door een lijst met kolomnamen met het other_columns
veld op te geven.
Als u meerdere retrievers hebt, kunt u meerdere schema's definiëren met behulp van unieke namen voor elk retriever-schema.
De retriever traceren
MLflow-tracering voegt waarneembaarheid toe door gedetailleerde informatie over de uitvoering van uw agent vast te leggen. Het biedt een manier om de invoer, uitvoer en metagegevens vast te leggen die zijn gekoppeld aan elke tussenliggende stap van een aanvraag, zodat u eenvoudig de bron van bugs en onverwacht gedrag kunt aanwijzen.
In dit voorbeeld wordt de @mlflow.trace decorator gebruikt om een tracering te maken voor de retriever en parser. Zie MLflow Tracing voor agents voor andere opties voor het instellen van traceringsmethoden.
De decorator maakt een periode die begint wanneer de functie wordt aangeroepen en eindigt wanneer deze wordt geretourneerd. MLflow registreert automatisch de invoer en uitvoer van de functie en eventuele uitzonderingen die daaruit zijn gegenereerd.
Notitie
Gebruikers van de LangChain-, LlamaIndex- en OpenAI-bibliotheek kunnen automatische aanmelding van MLflow gebruiken in plaats van traceringen handmatig te definiëren met de decorator. Zie Autologging gebruiken om traceringen toe te voegen aan uw agents.
...
@mlflow.trace(span_type="RETRIEVER", name="vector_search")
def __call__(self, query: str) -> List[Document]:
...
Om ervoor te zorgen dat downstreamtoepassingen, zoals agentevaluatie en AI Playground, de tracering van de retriever correct weergeven, moet u ervoor zorgen dat de decorator voldoet aan de volgende vereisten:
- Gebruik
span_type="RETRIEVER"
en zorg ervoor dat de functie object retourneertList[Document]
. Zie Retriever spans. - De traceringsnaam en de retriever_schema naam moeten overeenkomen om de tracering correct te configureren.
Zoekresultaten filtervector
U kunt het zoekbereik beperken tot een subset van gegevens met behulp van een Vector Search-filter.
De filters
parameter in VectorSearchRetriever
definieert de filtervoorwaarden met behulp van de Databricks Vector Search-filterspecificatie.
filters = {"text_column LIKE": "Databricks"}
In de __call__
methode wordt de filterswoordenlijst rechtstreeks doorgegeven aan de similarity_search
functie:
results = self.vector_search_index.similarity_search(
query_text=query,
columns=self.columns,
filters=filters,
num_results=5,
query_type="ann"
)
Na het initiële filteren biedt de score_threshold
parameter extra filters door een minimale gelijkenisscore in te stellen.
if score >= score_threshold:
metadata["similarity_score"] = score
Het uiteindelijke resultaat bevat documenten die voldoen aan de filters
en score_threshold
voorwaarden.
Voorbeeldtoepassingen ophalen
Zie de GitHub-opslagplaats voor genai-cookbook voor voorbeelden van AI-agents die gebruikmaken van retrievers:
- Voorbeeld van LangChain retriever: Demo: Mosaic AI Agent Framework and Agent Evaluation
- Voorbeeld pyFunc retriever: voorbeeldcode van agent-app