Ai-agentverktyg för ostrukturerad hämtning
Viktig
Den här funktionen finns i offentlig förhandsversion.
Den här artikeln visar hur du skapar AI-agentverktyg för ostrukturerad datahämtning med hjälp av Mosaic AI Agent Framework. Ostrukturerade sökmotorer gör det möjligt för agenter att fråga ostrukturerade datakällor, till exempel en dokumentkorpus, genom att använda vektorsökningsindex.
Mer information om agentverktyg finns i AI-agentverktyg.
Utveckla verktyg för vektorsökning lokalt med AI Bridge
Det enklaste sättet att börja utveckla ett Databricks Vector Search retriever-verktyg är lokalt. Använd Databricks AI Bridge-paket som databricks-langchain
och databricks-openai
för att snabbt lägga till hämtningsfunktioner i en agent och experimentera med frågeparametrar. Den här metoden möjliggör snabb iteration under den inledande utvecklingen.
När det lokala verktyget är klart kan du direkt produktionsanpassa det som en del av din agentkod eller migrera det till en Unity Catalog-funktion, vilket ger bättre identifiering och styrning men har vissa begränsningar. Se verktyget Vector Search retriever medUnity Catalog-funktioner.
LangChain/LangGraph
Följande kod konstruerar en prototyp av ett hämtningsverktyg och binder det lokalt till en LLM så att du kan interagera med agenten för att testa hur det använder verktyget.
Installera den senaste versionen av databricks-langchain
som innehåller Databricks AI Bridge.
%pip install --upgrade databricks-langchain
Not
När du initierar VectorSearchRetrieverTool
krävs argumenten text_column
och embedding
för Delta Sync-index med självhanterade inbäddningar och Direktvektoråtkomstindex. Se alternativ för att tillhandahålla inbäddningar.
from databricks_langchain import VectorSearchRetrieverTool, ChatDatabricks
# Initialize the retriever tool
vs_tool = VectorSearchRetrieverTool(index_name="catalog.schema.my_index_name")
# Run a query against the vector search index locally for testing
vs_tool.invoke("Databricks Agent Framework?")
# Bind the retriever tool to your Langchain LLM of choice
llm = ChatDatabricks(endpoint="databricks-meta-llama-3-1-70b-instruct")
llm_with_tools = llm.bind_tools([vs_tool])
# Chat with your LLM to test the tool calling functionality
llm_with_tools.invoke("Based on the Databricks documentation, what is Databricks Agent Framework?")
Om du vill anpassa verktygsanrop skickar du ytterligare argument till VectorSearchRetrieverTool
:
from databricks_langchain import VectorSearchRetrieverTool
vs_tool = VectorSearchRetrieverTool(
index_name, # Index name in the format 'catalog.schema.index'
num_results, # Max number of documents to return
columns, # List of columns to include in the search
filters, # Filters to apply to the query
query_type, # Query type ("ANN" or "HYBRID").
tool_name, # Used by the LLM to understand the purpose of the tool
tool_description, # Used by the LLM to understand the purpose of the tool
text_column, # Specify text column for embeddings. Required for direct-access index or delta-sync index with self-managed embeddings.
embedding # The embedding model. Required for direct-access index or delta-sync index with self-managed embeddings.
)
OpenAI
Följande kod prototyper ett vektorsökverktyg och integrerar det med OpenAI:s GPT-modeller.
Mer information om OpenAI-rekommendationer för verktyg finns i dokumentation om OpenAI-funktionsanrop.
Installera den senaste versionen av databricks-openai
som innehåller Databricks AI Bridge.
%pip install --upgrade databricks-openai
Not
När du initierar VectorSearchRetrieverTool
krävs argumenten text_column
och embedding
för Delta Sync-index med självadministrerade inbäddningar och direkta vektoråtkomstindex. Se alternativ för att tillhandahålla inbäddningar.
from databricks_openai import VectorSearchRetrieverTool
from openai import OpenAI
import json
# Initialize OpenAI client
client = OpenAI(api_key=<your_API_key>)
# Call model with VectorSearchRetrieverTool defined
dbvs_tool = VectorSearchRetrieverTool(index_name="catalog.schema.my_index_name")
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{
"role": "user",
"content": "Using the Databricks documentation, answer what is Spark?"
}
]
first_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=[dbvs_tool.tool]
)
# Execute function code and parse the model's response and handle function calls.
tool_call = first_response.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
result = dbvs_tool.execute(query=args["query"]) # For self-managed embeddings, optionally pass in openai_client=client
# Supply model with results – so it can incorporate them into its final response.
messages.append(first_response.choices[0].message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
})
second_response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=[dbvs_tool.tool]
)
Om du vill anpassa verktygsanrop skickar du ytterligare argument till VectorSearchRetrieverTool
:
from databricks_openai import VectorSearchRetrieverTool
vs_tool = VectorSearchRetrieverTool(
index_name, # Index name in the format 'catalog.schema.index'
num_results, # Max number of documents to return
columns, # List of columns to include in the search
filters, # Filters to apply to the query
query_type, # Query type ("ANN" or "HYBRID").
tool_name, # Used by the LLM to understand the purpose of the tool
tool_description, # Used by the LLM to understand the purpose of the tool
text_column, # Specify text column for embeddings. Required for direct-access index or delta-sync index with self-managed embeddings.
embedding_model_name # The embedding model. Required for direct-access index or delta-sync index with self-managed embeddings.
)
Retriever-verktyget för vektorsökning med Unity Catalog-funktioner
I följande exempel skapas verktyget retriever med hjälp av en Unity Catalog-funktion för att fråga efter data från ett Mosaic AI Vector Search-index.
Funktionen Unity Catalog databricks_docs_vector_search
frågar ett hypotetiskt Vector Search-index som innehåller Dokumentation om Databricks. Den här funktionen omsluter Databricks SQL-funktionen vector_search() och justerar dess utmatning med MLflow retrieverschema. med hjälp av aliasen page_content
och metadata
.
Not
Om du vill följa MLflow Retriever-schemat måste eventuella ytterligare metadatakolumner läggas till i kolumnen metadata
med hjälp av SQL-kartfunktioni stället för som utdatanycklar på den översta nivån.
Kör följande kod i en notebook- eller SQL-redigerare för att skapa funktionen:
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
)
Om du vill använda det här hämtningsverktyget i AI-agenten omsluter du det med UCFunctionToolkit
. Detta möjliggör automatisk spårning via MLflow.
MLflow Tracing samlar in detaljerad körningsinformation för gen AI-program. Den loggar indata, utdata och metadata för varje steg, vilket hjälper dig att felsöka problem och analysera prestanda.
När du använder UCFunctionToolkit
genererar hämtningsverktygen automatiskt RETRIEVER
intervalltyper i MLflow-loggarna om deras utdata matchar MLflow retriever-schemat. Se MLflow Tracing Schema.
För mer information om UCFunctionToolkit
, se dokumentationen för Unity Catalog .
from unitycatalog.ai.langchain.toolkit import UCFunctionToolkit
toolkit = UCFunctionToolkit(
function_names=[
"main.default.databricks_docs_vector_search"
]
)
tools = toolkit.tools
Det här verktyget för hämtning har följande varningar:
- SQL-klienter kan begränsa det maximala antalet rader eller byte som returneras. För att förhindra datatrunkering bör du trunkera kolumnvärden som returneras av UDF. Du kan till exempel använda
substring(chunked_text, 0, 8192)
för att minska storleken på stora innehållskolumner och undvika att rader trunkeras under utförandet. - Eftersom det här verktyget är en omslutning för funktionen
vector_search()
omfattas det av samma begränsningar som funktionenvector_search()
. Se begränsningar.
Om det här exemplet är olämpligt för ditt användningsfall skapar du ett verktyg för vektorsökningshämtning med hjälp av anpassad agentkod i stället.
Vektorsökningshämtare med agentkod (PyFunc)
I följande exempel skapas en vektorsökhämtare för en PyFunc-anpassad agent i agentkoden.
I det här exemplet används databricks-vectorsearch för att skapa en grundläggande retriever som utför en likhetssökning i Vector Search med filter. Den använder MLflow-dekoratörer för att aktivera agentspårning.
Not
För att följa MLflow retriever-schemat bör funktionen retriever returnera en dokumenttyp och använda fältet metadata
i dokumentklassen för att lägga till ytterligare attribut i det returnerade dokumentet, till exempel like doc_uri
och similarity_score.
Använd följande kod i agentmodulen eller agentanteckningsboken.
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
Kör följande Python-kod för att köra hämtaren. Du kan också inkludera filter för vektorsökning i begäran om att filtrera resultat.
retriever = VectorSearchRetriever()
query = "What is Databricks?"
filters={"text_column LIKE": "Databricks"},
results = retriever(query, filters=filters, score_threshold=0.1)
Ange retriever-schema
För att säkerställa att hämtningarna spåras korrekt och återges korrekt i underordnade program anropar du mlflow.models.set_retriever_schema när du definierar din agent. Använd set_retriever_schema
för att mappa kolumnnamnen i den returnerade tabellen till MLflows förväntade fält, till exempel primary_key
, text_column
och 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"],
)
Du kan också ange ytterligare kolumner i hämtarens schema genom att ange en lista med kolumnnamn med fältet other_columns
.
Om du har flera retrievers kan du definiera flera scheman med hjälp av unika namn för varje retrieverschema.
Datahämtningsschemauppsättningen när agenten skapas påverkar underordnade program och arbetsflöden, till exempel granskningsappen och utvärderingsuppsättningarna. Mer specifikt fungerar kolumnen doc_uri
som primär identifierare för dokument som returneras av hämtaren.
-
granskningsappen visar
doc_uri
för att hjälpa granskare att utvärdera svar och spåra dokument ursprung. Se Granska appgränssnittet. -
Utvärderingsuppsättningar används
doc_uri
för att jämföra resultaten från sökmotorn med fördefinierade utvärderingsdatauppsättningar för att fastställa sökmotorns träffsäkerhet och precision. Se Utvärderingsuppsättningar.
Spåra hämtningen
MLflow-spårning lägger till observerbarhet genom att samla in detaljerad information om agentens körning. Det ger ett sätt att registrera indata, utdata och metadata som är associerade med varje mellanliggande steg i en begäran, så att du snabbt kan hitta källan till buggar och oväntade beteenden.
I det här exemplet används @mlflow.trace-dekoratören för att skapa en spårning för sökare och parser. Andra alternativ för att konfigurera spårningsmetoder finns i MLflow Tracing för agenter.
Dekoratören skapar ett span som startar när funktionen anropas och slutar när den returneras. MLflow registrerar automatiskt funktionens indata och utdata och eventuella undantag som genereras.
Not
Användare av LangChain-, LlamaIndex- och OpenAI-bibliotek kan använda automatisk MLflow-loggning i stället för att manuellt definiera spårningar med dekoratören. Se Använd automatisk loggning för att lägga till spårningar till dina agenter.
...
@mlflow.trace(span_type="RETRIEVER", name="vector_search")
def __call__(self, query: str) -> List[Document]:
...
Säkerställ att dekoratören uppfyller följande krav för att säkerställa att nedströmsapplikationer som Agent Evaluation och AI Playground återger upphämtarens spårning korrekt.
- Använd
span_type="RETRIEVER"
och se till att funktionen returnerarList[Document]
objekt. Se Retriever sträcker sig över. - Spårningsnamnet och retriever_schema namn måste matcha för att kunna konfigurera spårningen korrekt.
Sökresultat för filtervektor
Du kan begränsa sökomfånget till en delmängd data med hjälp av ett vektorsökningsfilter.
Parametern filters
i VectorSearchRetriever
definierar filtervillkoren med filterspecifikationen Databricks Vector Search.
filters = {"text_column LIKE": "Databricks"}
I metoden __call__
skickas filterordlistan direkt till funktionen similarity_search
:
results = self.vector_search_index.similarity_search(
query_text=query,
columns=self.columns,
filters=filters,
num_results=5,
query_type="ann"
)
Efter inledande filtrering ger parametern score_threshold
ytterligare filtrering genom att ange en minsta likhetspoäng.
if score >= score_threshold:
metadata["similarity_score"] = score
Slutresultatet innehåller dokument som uppfyller villkoren för filters
och score_threshold
.
Nästa steg
När du har skapat ett funktionsagentverktyg för Unity Catalog lägger du till verktyget i en AI-agent. Se Lägg till verktyg för Unity Catalog i agenter.