Narzędzia AI agenta do nieustrukturyzowanego wyszukiwania
Ważny
Ta funkcja jest dostępna w publicznej wersji zapoznawczej.
W tym artykule pokazano, jak utworzyć narzędzia dla agenta sztucznej inteligencji do wyszukiwania danych nieustrukturyzowanych przy użyciu Frameworku Mosaic AI Agent. Nieustrukturyzowane metody pobierania umożliwiają agentom wykonywanie zapytań dotyczących źródeł danych bez struktury, takich jak corpus dokumentu, przy użyciu indeksów wyszukiwania wektorowego.
Aby dowiedzieć się więcej o narzędziach agentów, zobacz Stwórz narzędzia agenta AI.
Narzędzie do wyszukiwania wektorowego z funkcjami Catalog Unity
Poniższy przykład tworzy funkcję Catalog w silniku Unity dla narzędzia pobierania, które może zapytać o dane z indeksu Mosaic AI Vector Search.
Funkcja Catalog Unity databricks_docs_vector_search
przeszukuje hipotetyczny indeks wyszukiwania wektorowego zawierający dokumentację Databricks. Opakowuje funkcję SQL Databricks vector_search() i używa aliasów page_content
i metadata
, aby dopasować jej wynik do retrieve'ra MLflow schema.
Notatka
Aby zapewnić zgodność z procesem pobierania schemaMLflow, wszystkie dodatkowe metadane columns należy dodać do metadata
column za pomocą funkcji mapowania SQL, a nie jako klucze wyjściowe najwyższego poziomu.
Uruchom następujący kod w notesie lub edytorze SQL.
CREATE OR REPLACE FUNCTION main.default.databricks_docs_vector_search (
-- The agent uses this comment to determine how to generate the query string parameter.
query STRING
COMMENT 'The query string for searching Databricks documentation.'
) RETURNS TABLE
-- The agent uses this comment to determine when to call this tool. It describes the types of documents and information contained within the index.
COMMENT 'Executes a search on Databricks documentation to retrieve text documents most relevant to the input query.' RETURN
SELECT
chunked_text as page_content,
map('doc_uri', url, 'chunk_id', chunk_id) as metadata
FROM
vector_search(
-- Specify your Vector Search index name here
index => 'catalog.schema.databricks_docs_index',
query => query,
num_results => 5
)
To narzędzie pobierania ma następujące zastrzeżenia:
- Narzędzie MLflow śledzi tę funkcję Unity Catalog jako zakres typu
TOOL
, a nie jako zakres typuRETRIEVER
. W związku z tym aplikacje używające infrastruktury agentów, takie jak aplikacja do przeglądu agentów i AI Playground, nie będą wyświetlać szczegółów specyficznych dla retrievera, takich jak linki do fragmentów. Aby uzyskać więcej informacji na temat typów span, zobacz śledzenie MLflow Schema. - Klienci SQL mogą limit maksymalną liczbę zwracanych wierszy lub bajtów. Aby zapobiec obcięciu danych, należy skrócić columnvalues zwracane przez funkcję UDF. Na przykład można użyć
substring(chunked_text, 0, 8192)
, aby zmniejszyć rozmiar dużej zawartości columns i uniknąć obcinania wierszy podczas wykonywania. - Ponieważ to narzędzie jest nakładką funkcji
vector_search()
, podlega tym samym ograniczeniom, co funkcjavector_search()
. Zobacz Ograniczenia.
Jeśli ten przykład jest nieodpowiedni dla twojego przypadku użycia, zamiast tego utwórz narzędzie do wyszukiwania i pobierania wektorów przy użyciu niestandardowego kodu agenta.
Funkcja pobierania wyszukiwania wektorowego z kodem agenta (PyFunc)
Poniższy przykład tworzy wyszukiwanie wektorowe dla agenta w stylu PyFunc w kodzie agenta.
Ten przykład używa databricks-vectorsearch do utworzenia podstawowego modułu wyszukiwania, który wykonuje wyszukiwanie podobieństwa wektorowego z filtrami. Używa dekoratorów MLflow do włączenia śledzenia agentów.
Notatka
Aby zachować zgodność z pobieraczem MLflow schema, funkcja pobieracza powinna zwrócić typ dokumentu Document i użyć pola metadata
w klasie Document, aby dodać dodatkowe atrybuty do zwróconego dokumentu, takie jak like doc_uri
i similarity_score.
.
Użyj następującego kodu w module agenta lub notesie agenta.
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
Aby uruchomić program retriever, uruchom następujący kod w języku Python. Możesz opcjonalnie uwzględnić filtry wyszukiwania wektorowego w żądaniu, w celu filtrowania wyników.
retriever = VectorSearchRetriever()
query = "What is Databricks?"
filters={"text_column LIKE": "Databricks"},
results = retriever(query, filters=filters, score_threshold=0.1)
Set wykrywacz schema
Aby upewnić się, że retrievery są prawidłowo śledzone i poprawnie renderowane w aplikacjach podrzędnych, wywołaj mlflow.models.set_retriever_schema podczas definiowania agenta. Użyj set_retriever_schema
, aby przypisać nazwy column w wynikach table do oczekiwanych pól w MLflow, takich jak primary_key
, text_column
i 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"],
)
Możesz również określić dodatkowe columns w schema modułu pobierania, podając list nazw column z polem other_columns
.
Jeśli masz wiele modułów pobierania, możesz zdefiniować wiele schematów przy użyciu unikatowych nazw dla każdego modułu pobierania schema.
Retriever schemaset podczas tworzenia agenta wpływa na aplikacje podrzędne i przepływy pracy, takie jak aplikacji przeglądu i zestawy oceny. W szczególności doc_uri
column służy jako podstawowy identifier dla dokumentów zwracanych przez moduł retriever.
- Aplikacja recenzji wyświetla
doc_uri
, aby pomóc recenzentom ocenić odpowiedzi i śledzić pochodzenie dokumentów. Zobacz Przegląd interfejsu użytkownika aplikacji. -
Zestawy ewaluacyjne używane są
doc_uri
do porównywania wyników retrievera z wcześniej zdefiniowanymi zestawami danych ewaluacyjnych w celu określenia kompletności i dokładności retrievera. Zobacz zestawy oceny .
Śledź retrievera
Śledzenie MLflow zwiększa obserwowalność, przechwytując szczegółowe informacje na temat wykonywania agenta. Zapewnia ona sposób rejestrowania danych wejściowych, wyjściowych i metadanych skojarzonych z każdym pośrednim krokiem żądania, umożliwiając szybkie wskazanie źródła usterek i nieoczekiwanych zachowań.
W tym przykładzie użyto decoratora
Dekorator tworzy zakres , który zaczyna się, gdy funkcja jest wywoływana, a kończy przy zwróceniu wyniku funkcji. Narzędzie MLflow automatycznie rejestruje dane wejściowe i wyjściowe funkcji oraz wszelkie zgłoszone wyjątki.
Notatka
Użytkownicy biblioteki LangChain, LlamaIndex i OpenAI mogą używać automatycznego rejestrowania MLflow zamiast ręcznie definiować ślady za pomocą dekoratora. Zobacz Użyj autologowania, aby dodać ślady do swoich agentów.
...
@mlflow.trace(span_type="RETRIEVER", name="vector_search")
def __call__(self, query: str) -> List[Document]:
...
Aby upewnić się, że aplikacje końcowe, takie jak Ocena Agenta i Plac Zabaw AI, renderują ślad pobieracza prawidłowo, upewnij się, że dekorator spełnia następujące wymagania:
- Użyj
span_type="RETRIEVER"
i upewnij się, że funkcja zwraca obiektList[Document]
. Zobacz Retriever obejmuje. - Nazwa śledzenia i nazwa retriever_schema muszą być zgodne, aby poprawnie skonfigurować śledzenie.
Filtrowanie wyników wyszukiwania wektorowego
Zakres wyszukiwania można limit do podzbioru danych przy użyciu filtru wyszukiwania wektorowego.
Parametr filters
w VectorSearchRetriever
definiuje warunki filtrowania przy użyciu specyfikacji filtru Databricks Vector Search.
filters = {"text_column LIKE": "Databricks"}
Wewnątrz metody __call__
słownik filtrów jest przekazywany bezpośrednio do funkcji similarity_search
:
results = self.vector_search_index.similarity_search(
query_text=query,
columns=self.columns,
filters=filters,
num_results=5,
query_type="ann"
)
Po początkowym filtrowaniu parametr score_threshold
zapewnia dodatkowe filtrowanie, ustawiając minimalny wynik podobieństwa.
if score >= score_threshold:
metadata["similarity_score"] = score
Końcowy wynik zawiera dokumenty spełniające warunki filters
i score_threshold
.
Następne kroki
Po utworzeniu narzędzia funkcji Unity Catalog dodaj narzędzie do agenta AI. Zobacz Dodaj narzędzia Catalog Unity do agentów.