Een AI-agent en de bijbehorende hulpprogramma's maken
Belangrijk
Deze functie is beschikbaar als openbare preview.
In dit artikel leest u hoe u AI-agents en -hulpprogramma's maakt met behulp van het Mozaïek AI Agent Framework.
Meer informatie over het gebruik van AI Playground om snel agents voor het aanroepen van hulpprogramma's te prototypen en deze te exporteren naar Mosaic AI Agent Framework.
Vereisten
- Krijg inzicht in de concepten van AI-agents en -hulpprogramma's, zoals beschreven in Wat zijn samengestelde AI-systeem- en AI-agents?
- Databricks raadt aan de nieuwste versie van de MLflow Python-client te installeren bij het ontwikkelen van agents. Zie Verificatie voor afhankelijke resources voor informatie over
mlflow
versievereisten.
Ai-agenthulpprogramma's maken
AI-agents gebruiken hulpprogramma's om acties uit te voeren naast het genereren van talen, bijvoorbeeld om gestructureerde of ongestructureerde gegevens op te halen, code uit te voeren of te communiceren met externe services (bijvoorbeeld een e-mail of Slack-bericht verzenden).
Als u hulpprogramma's wilt bieden aan een agent met Mosaic AI Agent Framework, kunt u elke combinatie van de volgende methoden gebruiken:
- Maak of gebruik bestaande Unity Catalog-functies als hulpprogramma's. Unity Catalog-functies bieden eenvoudige detectie, governance en delen en werken goed voor het toepassen van transformaties en aggregaties op grote gegevenssets.
- Definieer hulpprogramma's lokaal als Python-functies in agentcode. Deze aanpak is handig in situaties waarin u aanroepen naar REST API's moet doen, willekeurige code of bibliotheken moet gebruiken of hulpprogramma's met een zeer lage latentie moet uitvoeren. Deze benadering ontbreekt aan de ingebouwde detectie en governance van Unity Catalog-functies. Databricks raadt aan deze afweging af te wegen bij het bouwen van uw agent om te bepalen welke benadering het beste is.
Beide benaderingen werken voor agents die zijn geschreven in aangepaste Python-code of met behulp van een bibliotheek voor het ontwerpen van agents, zoals LangGraph.
Bij het definiëren van hulpprogramma's moet u ervoor zorgen dat het hulpprogramma, de bijbehorende parameters en de retourwaarde worden gedocumenteerd, zodat de agent LLM begrijpt wanneer en hoe u het hulpprogramma gebruikt.
Agenthulpprogramma's maken met Unity Catalog-functies
In deze voorbeelden worden AI-agenthulpprogramma's gemaakt met behulp van Unity Catalog-functies die zijn geschreven in een notebookomgeving of een SQL-editor.
Voer de volgende code uit in een notebookcel. Het maakt gebruik van de %sql
magic notebook om een Unity Catalog-functie te maken die wordt aangeroepen python_exec
.
Een LLM kan dit hulpprogramma gebruiken om Python-code uit te voeren die door een gebruiker wordt verstrekt.
%sql
CREATE OR REPLACE FUNCTION
main.default.python_exec (
code STRING COMMENT 'Python code to execute. Remember to print the final result to stdout.'
)
RETURNS STRING
LANGUAGE PYTHON
DETERMINISTIC
COMMENT 'Executes Python code in the sandboxed environment and returns its stdout. The runtime is stateless and you can not read output of the previous tool executions. i.e. No such variables "rows", "observation" defined. Calling another tool inside a Python code is NOT allowed. Use standard python libraries only.'
AS $$
import sys
from io import StringIO
sys_stdout = sys.stdout
redirected_output = StringIO()
sys.stdout = redirected_output
exec(code)
sys.stdout = sys_stdout
return redirected_output.getvalue()
$$
Voer de volgende code uit in een SQL-editor.
Er wordt een Unity Catalog-functie gemaakt die wordt aangeroepen lookup_customer_info
dat een LLM kan gebruiken om gestructureerde gegevens op te halen uit een hypothetische customer_data
tabel:
CREATE OR REPLACE FUNCTION main.default.lookup_customer_info(
customer_name STRING COMMENT 'Name of the customer whose info to look up'
)
RETURNS STRING
COMMENT 'Returns metadata about a particular customer given the customer name, including the customer email and ID. The
customer ID can be used for other queries.'
RETURN SELECT CONCAT(
'Customer ID: ', customer_id, ', ',
'Customer Email: ', customer_email
)
FROM main.default.customer_data
WHERE customer_name = customer_name
LIMIT 1;
Prototype-agents voor het aanroepen van hulpprogramma's in AI Playground
Nadat u de Unity Catalog-functies hebt gemaakt, kunt u de AI Playground gebruiken om ze aan een LLM te geven en de agent te testen. De AI Playground biedt een sandbox voor het prototype van agents voor het aanroepen van hulpprogramma's.
Zodra u tevreden bent met de AI-agent, kunt u deze exporteren om deze verder te ontwikkelen in Python of implementeren als een eindpunt voor modelverdiening.
Notitie
Unity Catalog en serverloze berekeningen, Mozaïek AI Agent Framework, en basismodellen met betalen per token of externe modellen moeten beschikbaar zijn in de huidige werkruimte om prototypeagents in AI Playground te maken.
Een prototype maken van een eindpunt voor het aanroepen van hulpprogramma's.
Selecteer in Playground een model met het label Functie aanroepen .
Selecteer Hulpprogramma's en geef de namen van uw Unity Catalog-functie op in de vervolgkeuzelijst:
Chat om de huidige combinatie van LLM, hulpprogramma's en systeemprompt te testen en variaties uit te proberen.
AI Playground-agents exporteren en implementeren
Nadat u hulpprogramma's hebt toegevoegd en de agent hebt getest, exporteert u de Playground-agent naar Python-notebooks:
Klik op Agentcode exporteren om Notebooks notebooks voor Python te genereren waarmee u de AI-agent kunt ontwikkelen en implementeren.
Nadat u de agentcode hebt geëxporteerd, ziet u drie bestanden die zijn opgeslagen in uw werkruimte:
agent
notebook: Bevat Python-code die uw agent definieert met Behulp van LangChain.driver
notebook: Bevat Python-code voor het registreren, traceren, registreren en implementeren van de AI-agent met behulp van Mosaic AI Agent Framework.config.yml
: bevat configuratie-informatie over uw agent, inclusief hulpprogrammadefinities.
Open het
agent
notebook om de LangChain-code te zien die uw agent definieert, gebruik dit notebook om de agent programmatisch te testen en te herhalen, zoals het definiëren van meer hulpprogramma's of het aanpassen van de parameters van de agent.Notitie
De geëxporteerde code kan afwijken van uw AI-speeltuinsessie. Databricks raadt u aan om de geëxporteerde notebooks uit te voeren om verder te herhalen en fouten op te sporen, de kwaliteit van de agent te evalueren en vervolgens de agent te implementeren om met anderen te delen.
Zodra u tevreden bent met de uitvoer van de agent, kunt u het notebook uitvoeren om uw
driver
agent te registreren en te implementeren in een eindpunt voor modelverdiening.
Een agent definiëren in code
Naast het genereren van agentcode van AI Playground kunt u ook zelf een agent definiëren in code, met behulp van frameworks zoals LangChain of Python-code. Als u een agent wilt implementeren met Agent Framework, moet de invoer ervan voldoen aan een van de ondersteunde indelingen voor invoer en uitvoer.
Parameters gebruiken om de agent te configureren
In het Agent Framework kunt u parameters gebruiken om te bepalen hoe agents worden uitgevoerd. Hierdoor kunt u snel herhalen door verschillende kenmerken van uw agent zonder de code te wijzigen. Parameters zijn sleutel-waardeparen die u definieert in een Python-woordenlijst of een .yaml
bestand.
Als u de code wilt configureren, maakt u een ModelConfig
set sleutel-waardeparameters. ModelConfig
is een Python-woordenlijst of een .yaml
bestand. U kunt bijvoorbeeld een woordenlijst gebruiken tijdens de ontwikkeling en deze vervolgens converteren naar een .yaml
bestand voor productie-implementatie en CI/CD. Zie de MLflow-documentatie voor meer informatie overModelConfig
.
Hieronder ziet u een voorbeeld ModelConfig
.
llm_parameters:
max_tokens: 500
temperature: 0.01
model_serving_endpoint: databricks-dbrx-instruct
vector_search_index: ml.docs.databricks_docs_index
prompt_template: 'You are a hello world bot. Respond with a reply to the user''s
question that indicates your prompt template came from a YAML file. Your response
must use the word "YAML" somewhere. User''s question: {question}'
prompt_template_input_vars:
- question
Gebruik een van de volgende manieren om de configuratie vanuit uw code aan te roepen:
# Example for loading from a .yml file
config_file = "configs/hello_world_config.yml"
model_config = mlflow.models.ModelConfig(development_config=config_file)
# Example of using a dictionary
config_dict = {
"prompt_template": "You are a hello world bot. Respond with a reply to the user's question that is fun and interesting to the user. User's question: {question}",
"prompt_template_input_vars": ["question"],
"model_serving_endpoint": "databricks-dbrx-instruct",
"llm_parameters": {"temperature": 0.01, "max_tokens": 500},
}
model_config = mlflow.models.ModelConfig(development_config=config_dict)
# Use model_config.get() to retrieve a parameter value
value = model_config.get('sample_param')
Ondersteunde invoerindelingen
Hieronder worden invoerindelingen voor uw agent ondersteund.
(Aanbevolen) Query's met behulp van het openAI-voltooiingsschema voor chats. Deze moet een matrix met objecten hebben als parameter
messages
. Deze indeling is het beste voor RAG-toepassingen.question = { "messages": [ { "role": "user", "content": "What is Retrieval-Augmented Generation?", }, { "role": "assistant", "content": "RAG, or Retrieval Augmented Generation, is a generative AI design pattern that combines a large language model (LLM) with external knowledge retrieval. This approach allows for real-time data connection to generative AI applications, improving their accuracy and quality by providing context from your data to the LLM during inference. Databricks offers integrated tools that support various RAG scenarios, such as unstructured data, structured data, tools & function calling, and agents.", }, { "role": "user", "content": "How to build RAG for unstructured data", }, ] }
SplitChatMessagesRequest
. Aanbevolen voor chattoepassingen met meerdere bochten, met name wanneer u de huidige query en geschiedenis afzonderlijk wilt beheren.question = { "query": "What is MLflow", "history": [ { "role": "user", "content": "What is Retrieval-augmented Generation?" }, { "role": "assistant", "content": "RAG is" } ] }
Voor LangChain raadt Databricks aan om uw keten te schrijven in de Taal van de LangChain-expressie. In uw ketendefinitiecode kunt u een itemgetter
code gebruiken om de berichten of query
history
objecten op te halen, afhankelijk van de invoerindeling die u gebruikt.
Ondersteunde uitvoerindelingen
Uw agent moet een van de volgende ondersteunde uitvoerindelingen hebben:
- (Aanbevolen) ChatCompletionResponse. Deze indeling wordt aanbevolen voor klanten met interoperabiliteit van de OpenAI-antwoordindeling.
- StringObjectResponse. Deze indeling is de eenvoudigste en eenvoudigste te interpreteren indeling.
Gebruik of ChatCompletionsOutputParser()
van MLflow als laatste ketenstap voor LangChainStringResponseOutputParser()
. Als u dit doet, wordt het LANGChain AI-bericht opgemaakt in een indeling die compatibel is met een agent.
from mlflow.langchain.output_parsers import StringResponseOutputParser, ChatCompletionsOutputParser
chain = (
{
"user_query": itemgetter("messages")
| RunnableLambda(extract_user_query_string),
"chat_history": itemgetter("messages") | RunnableLambda(extract_chat_history),
}
| RunnableLambda(fake_model)
| StringResponseOutputParser() # use this for StringObjectResponse
# ChatCompletionsOutputParser() # or use this for ChatCompletionResponse
)
Als u PyFunc gebruikt, raadt Databricks aan om typehints te gebruiken om aantekeningen te maken op de predict()
functie met invoer- en uitvoergegevensklassen die subklassen zijn van klassen die zijn gedefinieerd in mlflow.models.rag_signatures
.
U kunt een uitvoerobject maken van de gegevensklasse binnen predict()
om ervoor te zorgen dat de indeling wordt gevolgd. Het geretourneerde object moet worden getransformeerd in een woordenlijstweergave om ervoor te zorgen dat het kan worden geserialiseerd.
from mlflow.models.rag_signatures import ChatCompletionRequest, ChatCompletionResponse, ChainCompletionChoice, Message
class RAGModel(PythonModel):
...
def predict(self, context, model_input: ChatCompletionRequest) -> ChatCompletionResponse:
...
return asdict(ChatCompletionResponse(
choices=[ChainCompletionChoice(message=Message(content=text))]
))
Voorbeeldnotitieblokken
Deze notebooks maken een eenvoudige 'Hallo wereld'-keten om te laten zien hoe u een ketentoepassing maakt in Databricks. In het eerste voorbeeld wordt een eenvoudige keten gemaakt. In het tweede voorbeeldnotebook ziet u hoe u parameters gebruikt om codewijzigingen tijdens de ontwikkeling te minimaliseren.