Un esempio di una piccola applicazione che puoi creare utilizzando LangChain su Vertex AI è quella che restituisce il tasso di cambio tra due valute in una data specificata.
Puoi definire la tua classe Python (consulta
Personalizzare un modello di applicazione),
oppure puoi utilizzare la classe LangchainAgent
nell'SDK Vertex AI per Python per il tuo agente. I passaggi che seguono mostrano come creare questa applicazione utilizzando il
LangchainAgent
modello predefinito:
- Definire e configurare un modello
- Definire e utilizzare uno strumento
- (Facoltativo) Memorizza la cronologia chat
- (Facoltativo) Personalizza il modello di prompt
- (Facoltativo) Personalizza l'orchestrazione
Prima di iniziare
Prima di eseguire questo tutorial, assicurati che l'ambiente sia configurato seguendo i passaggi descritti in Configurare l'ambiente.
Passaggio 1: Definire e configurare un modello
Per definire e configurare il modello, svolgi i seguenti passaggi:
Devi definire la versione del modello da utilizzare.
model = "gemini-1.5-flash-001"
(Facoltativo) Puoi configurare le impostazioni di sicurezza del modello. Per scoprire di più sulle opzioni disponibili per le impostazioni di sicurezza in Gemini, consulta Configurare gli attributi di sicurezza.
Di seguito è riportato un esempio di come configurare le impostazioni di sicurezza:
from langchain_google_vertexai import HarmBlockThreshold, HarmCategory safety_settings = { HarmCategory.HARM_CATEGORY_UNSPECIFIED: HarmBlockThreshold.BLOCK_NONE, HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE, HarmCategory.HARM_CATEGORY_HATE_SPEECH: HarmBlockThreshold.BLOCK_ONLY_HIGH, HarmCategory.HARM_CATEGORY_HARASSMENT: HarmBlockThreshold.BLOCK_LOW_AND_ABOVE, HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: HarmBlockThreshold.BLOCK_NONE, }
(Facoltativo) Puoi specificare i parametri del modello nel seguente modo:
model_kwargs = { # temperature (float): The sampling temperature controls the degree of # randomness in token selection. "temperature": 0.28, # max_output_tokens (int): The token limit determines the maximum amount of # text output from one prompt. "max_output_tokens": 1000, # top_p (float): Tokens are selected from most probable to least until # the sum of their probabilities equals the top-p value. "top_p": 0.95, # top_k (int): The next token is selected from among the top-k most # probable tokens. This is not supported by all model versions. See # https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/image-understanding#valid_parameter_values # for details. "top_k": None, # safety_settings (Dict[HarmCategory, HarmBlockThreshold]): The safety # settings to use for generating content. # (you must create your safety settings using the previous step first). "safety_settings": safety_settings, }
Ora puoi creare e eseguire query su un LangchainAgent
utilizzando le configurazioni del modello:
agent = reasoning_engines.LangchainAgent(
model=model, # Required.
model_kwargs=model_kwargs, # Optional.
)
response = agent.query(input="What is the exchange rate from US dollars to Swedish currency?")
La risposta è un dizionario Python simile al seguente esempio:
{"input": "What is the exchange rate from US dollars to Swedish currency?",
"output": """I cannot provide the live exchange rate from US dollars to Swedish currency (Swedish krona, SEK).
**Here's why:**
* **Exchange rates constantly fluctuate.** Factors like global economics, interest rates, and political events cause
these changes throughout the day.
* **Providing inaccurate information would be misleading.**
**How to find the current exchange rate:**
1. **Use a reliable online converter:** Many websites specialize in live exchange rates. Some popular options include:
* Google Finance (google.com/finance)
* XE.com
* Bank websites (like Bank of America, Chase, etc.)
2. **Contact your bank or financial institution:** They can give you the exact exchange rate they are using.
Remember to factor in any fees or commissions when exchanging currency.
"""}
(Facoltativo) Personalizzazione avanzata
Il modello LangchainAgent
utilizza ChatVertexAI
per impostazione predefinita, in quanto fornisce accesso a tutti
i modelli di base disponibili in Google Cloud. Per utilizzare un modello non disponibile tramite ChatVertexAI
, puoi specificare l'argomento model_builder=
con una funzione Python della seguente firma:
from typing import Optional
def model_builder(
*,
model_name: str, # Required. The name of the model
model_kwargs: Optional[dict] = None, # Optional. The model keyword arguments.
**kwargs, # Optional. The remaining keyword arguments to be ignored.
):
Per un elenco dei modelli di chat supportati in LangChain e delle relative funzionalità, consulta
Modelli di chat.
L'insieme di valori supportati per model=
e model_kwargs=
è specifico per ciascun modello di chat, pertanto devi fare riferimento alla documentazione corrispondente per i dettagli.
ChatVertexAI
Installato per impostazione predefinita.
Viene utilizzato nel modello LangchainAgent
quando ometti l'argomento model_builder
, ad esempio
agent = reasoning_engines.LangchainAgent(
model=model, # Required.
model_kwargs=model_kwargs, # Optional.
)
ChatAnthropic
Innanzitutto, segui la documentazione per configurare un account e installare il pacchetto.
Poi, definisci un model_builder
che restituisce ChatAnthropic
:
def model_builder(*, model_name: str, model_kwargs = None, **kwargs):
from langchain_anthropic import ChatAnthropic
return ChatAnthropic(model_name=model_name, **model_kwargs)
Infine, utilizzalo nel modello LangchainAgent
con il seguente codice:
agent = reasoning_engines.LangchainAgent(
model="claude-3-opus-20240229", # Required.
model_builder=model_builder, # Required.
model_kwargs={
"api_key": "ANTHROPIC_API_KEY", # Required.
"temperature": 0.28, # Optional.
"max_tokens": 1000, # Optional.
},
)
ChatOpenAI
Puoi utilizzare ChatOpenAI
in combinazione con l'API ChatCompletions di Gemini.
Innanzitutto, segui la documentazione per installare il pacchetto.
Poi, definisci un model_builder
che restituisce ChatOpenAI
:
def model_builder(
*,
model_name: str,
model_kwargs = None,
project: str, # Specified via vertexai.init
location: str, # Specified via vertexai.init
**kwargs,
):
import google.auth
from langchain_openai import ChatOpenAI
# Note: the credential lives for 1 hour by default.
# After expiration, it must be refreshed.
creds, _ = google.auth.default(scopes=["https://www.googleapis.com/auth/cloud-platform"])
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
if model_kwargs is None:
model_kwargs = {}
endpoint = f"https://{location}-aiplatform.googleapis.com"
base_url = f'{endpoint}/v1beta1/projects/{project}/locations/{location}/endpoints/openapi'
return ChatOpenAI(
model=model_name,
base_url=base_url,
api_key=creds.token,
**model_kwargs,
)
Infine, utilizzalo nel modello LangchainAgent
con il seguente codice:
agent = reasoning_engines.LangchainAgent(
model="google/gemini-1.5-pro-001", # Or "meta/llama3-405b-instruct-maas"
model_builder=model_builder, # Required.
model_kwargs={
"temperature": 0, # Optional.
"max_retries": 2, # Optional.
},
)
Passaggio 2: Definisci e utilizza uno strumento
Una volta definito il modello, il passaggio successivo consiste nel definire gli strumenti utilizzati dal modello per il ragionamento. Uno strumento può essere un strumento LangChain o una funzione in Python. Puoi anche convertire una funzione Python definita in uno strumento LangChain. Questa applicazione utilizza una definizione di funzione.
Quando definisci la funzione, è importante includere commenti che descrivano in modo completo e chiaro i parametri della funzione, cosa fa e cosa restituisce. Queste informazioni vengono utilizzate dal modello per determinare quale funzione utilizzare. Devi anche testare la funzione localmente per verificare che funzioni.
Utilizza il seguente codice per definire una funzione che restituisce un tasso di cambio:
def get_exchange_rate(
currency_from: str = "USD",
currency_to: str = "EUR",
currency_date: str = "latest",
):
"""Retrieves the exchange rate between two currencies on a specified date.
Uses the Frankfurter API (https://api.frankfurter.app/) to obtain
exchange rate data.
Args:
currency_from: The base currency (3-letter currency code).
Defaults to "USD" (US Dollar).
currency_to: The target currency (3-letter currency code).
Defaults to "EUR" (Euro).
currency_date: The date for which to retrieve the exchange rate.
Defaults to "latest" for the most recent exchange rate data.
Can be specified in YYYY-MM-DD format for historical rates.
Returns:
dict: A dictionary containing the exchange rate information.
Example: {"amount": 1.0, "base": "USD", "date": "2023-11-24",
"rates": {"EUR": 0.95534}}
"""
import requests
response = requests.get(
f"https://api.frankfurter.app/{currency_date}",
params={"from": currency_from, "to": currency_to},
)
return response.json()
Per testare la funzione prima di utilizzarla nella tua applicazione, esegui quanto segue:
get_exchange_rate(currency_from="USD", currency_to="SEK")
La risposta dovrebbe essere simile alla seguente:
{'amount': 1.0, 'base': 'USD', 'date': '2024-02-22', 'rates': {'SEK': 10.3043}}
Per utilizzare lo strumento all'interno del modello LangchainAgent
, devi aggiungerlo all'elenco degli strumenti nell'argomento tools=
:
agent = reasoning_engines.LangchainAgent(
model=model, # Required.
tools=[get_exchange_rate], # Optional.
model_kwargs=model_kwargs, # Optional.
)
Puoi testare l'applicazione eseguendo query di test. Esegui questo comando per testare l'applicazione utilizzando dollari statunitensi e corone svedesi:
response = agent.query(
input="What is the exchange rate from US dollars to Swedish currency?"
)
La risposta è un dizionario simile al seguente:
{"input": "What is the exchange rate from US dollars to Swedish currency?",
"output": "For 1 US dollar you will get 10.7345 Swedish Krona."}
(Facoltativo) Più strumenti
Gli strumenti per LangchainAgent
possono essere definiti e istanziati in altri modi.
Strumento di messa a terra
Innanzitutto, importa il pacchetto generate_models
e crea lo strumento
from vertexai.generative_models import grounding, Tool
grounded_search_tool = Tool.from_google_search_retrieval(
grounding.GoogleSearchRetrieval()
)
Poi utilizza lo strumento all'interno del modello LangchainAgent
:
agent = reasoning_engines.LangchainAgent(
model=model,
tools=[grounded_search_tool],
)
agent.query(input="When is the next total solar eclipse in US?")
La risposta è un dizionario simile al seguente:
{"input": "When is the next total solar eclipse in US?",
"output": """The next total solar eclipse in the U.S. will be on August 23, 2044.
This eclipse will be visible from three states: Montana, North Dakota, and
South Dakota. The path of totality will begin in Greenland, travel through
Canada, and end around sunset in the United States."""}
Per maggiori dettagli, visita la pagina Collegamento a terra.
Strumento LangChain
Innanzitutto, installa il pacchetto che definisce lo strumento.
pip install langchain-google-community
Poi importa il pacchetto e crea lo strumento.
from langchain_google_community import VertexAISearchRetriever
from langchain.tools.retriever import create_retriever_tool
retriever = VertexAISearchRetriever(
project_id="PROJECT_ID",
data_store_id="DATA_STORE_ID",
location_id="DATA_STORE_LOCATION_ID",
engine_data_type=1,
max_documents=10,
)
movie_search_tool = create_retriever_tool(
retriever=retriever,
name="search_movies",
description="Searches information about movies.",
)
Infine, utilizza lo strumento all'interno del modello LangchainAgent
:
agent = reasoning_engines.LangchainAgent(
model=model,
tools=[movie_search_tool],
)
response = agent.query(
input="List some sci-fi movies from the 1990s",
)
Dovrebbe restituire una risposta come
{"input": "List some sci-fi movies from the 1990s",
"output": """Here are some sci-fi movies from the 1990s:
* The Matrix (1999): A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.
* Star Wars: Episode I - The Phantom Menace (1999): Two Jedi Knights escape a hostile blockade to find a queen and her protector, and come across a young boy [...]
* Men in Black (1997): A police officer joins a secret organization that monitors extraterrestrial interactions on Earth.
[...]
"""}
Per visualizzare l'esempio completo, visita il notebook.
Per altri esempi di strumenti disponibili in LangChain, visita la pagina Strumenti Google.
Estensione Vertex AI
Innanzitutto, importa il pacchetto di estensioni e crea lo strumento
from typing import Optional
def generate_and_execute_code(
query: str,
files: Optional[list[str]] = None,
file_gcs_uris: Optional[list[str]] = None,
) -> str:
"""Get the results of a natural language query by generating and executing
a code snippet.
Example queries: "Find the max in [1, 2, 5]" or "Plot average sales by
year (from data.csv)". Only one of `file_gcs_uris` and `files` field
should be provided.
Args:
query:
The natural language query to generate and execute.
file_gcs_uris:
Optional. URIs of input files to use when executing the code
snippet. For example, ["gs://input-bucket/data.csv"].
files:
Optional. Input files to use when executing the generated code.
If specified, the file contents are expected be base64-encoded.
For example: [{"name": "data.csv", "contents": "aXRlbTEsaXRlbTI="}].
Returns:
The results of the query.
"""
operation_params = {"query": query}
if files:
operation_params["files"] = files
if file_gcs_uris:
operation_params["file_gcs_uris"] = file_gcs_uris
from vertexai.preview import extensions
# If you have an existing extension instance, you can get it here
# i.e. code_interpreter = extensions.Extension(resource_name).
code_interpreter = extensions.Extension.from_hub("code_interpreter")
return extensions.Extension.from_hub("code_interpreter").execute(
operation_id="generate_and_execute",
operation_params=operation_params,
)
Poi utilizza lo strumento all'interno del modello LangchainAgent
:
agent = reasoning_engines.LangchainAgent(
model=model,
tools=[generate_and_execute_code],
)
agent.query(
input="""Using the data below, construct a bar chart that includes only the height values with different colors for the bars:
tree_heights_prices = {
\"Pine\": {\"height\": 100, \"price\": 100},
\"Oak\": {\"height\": 65, \"price\": 135},
\"Birch\": {\"height\": 45, \"price\": 80},
\"Redwood\": {\"height\": 200, \"price\": 200},
\"Fir\": {\"height\": 180, \"price\": 162},
}
"""
)
Dovrebbe restituire una risposta come
{"input": """Using the data below, construct a bar chart that includes only the height values with different colors for the bars:
tree_heights_prices = {
\"Pine\": {\"height\": 100, \"price\": 100},
\"Oak\": {\"height\": 65, \"price\": 135},
\"Birch\": {\"height\": 45, \"price\": 80},
\"Redwood\": {\"height\": 200, \"price\": 200},
\"Fir\": {\"height\": 180, \"price\": 162},
}
""",
"output": """Here's the generated bar chart:
```python
import matplotlib.pyplot as plt
tree_heights_prices = {
"Pine": {"height": 100, "price": 100},
"Oak": {"height": 65, "price": 135},
"Birch": {"height": 45, "price": 80},
"Redwood": {"height": 200, "price": 200},
"Fir": {"height": 180, "price": 162},
}
heights = [tree["height"] for tree in tree_heights_prices.values()]
names = list(tree_heights_prices.keys())
plt.bar(names, heights, color=['red', 'green', 'blue', 'purple', 'orange'])
plt.xlabel('Tree Species')
plt.ylabel('Height')
plt.title('Tree Heights')
plt.show()
```
"""}
Per maggiori dettagli, visita la pagina Estensioni Vertex AI.
Puoi utilizzare tutti (o un sottoinsieme) degli strumenti che hai creato in LangchainAgent
:
agent = reasoning_engines.LangchainAgent(
model=model,
tools=[
get_exchange_rate, # Optional (Python function)
grounded_search_tool, # Optional (Grounding Tool)
movie_search_tool, # Optional (Langchain Tool)
generate_and_execute_code, # Optional (Vertex Extension)
],
)
agent.query(input="When is the next total solar eclipse in US?")
(Facoltativo) Configurazione dello strumento
Con Gemini, puoi applicare vincoli all'utilizzo dello strumento. Ad esempio, instead of allowing the model to generate natural language responses, you can force it to only generate function calls ("forced function calling").
from vertexai.preview.generative_models import ToolConfig
agent = reasoning_engines.LangchainAgent(
model="gemini-1.5-pro",
tools=[search_arxiv, get_exchange_rate],
model_tool_kwargs={
"tool_config": { # Specify the tool configuration here.
"function_calling_config": {
"mode": ToolConfig.FunctionCallingConfig.Mode.ANY,
"allowed_function_names": ["search_arxiv", "get_exchange_rate"],
},
},
},
)
agent.query(
input="Explain the Schrodinger equation in a few sentences",
)
Per maggiori dettagli, visita la pagina Configurazione dello strumento.
Passaggio 3: Memorizzare la cronologia chat
Per monitorare i messaggi di chat e aggiungerli a un database, definisci una funzione get_session_history
e passala quando crei l'agente. Questa
funzione deve accettare un session_id
e restituire un oggetto BaseChatMessageHistory
.
session_id
è un identificatore della sessione a cui appartengono questi messaggi di input. In questo modo puoi gestire più conversazioni contemporaneamente.BaseChatMessageHistory
è l'interfaccia per le classi che possono caricare e salvare gli oggetti messaggio.
Configurare un database
Per un elenco dei fornitori di ChatMessageHistory
di Google supportati in LangChain, consulta Memoria.
Firestore (nativo)
Innanzitutto, segui la documentazione di LangChain per configurare un database e installare il pacchetto.
Poi, definisci una funzione get_session_history
come segue:
def get_session_history(session_id: str):
from langchain_google_firestore import FirestoreChatMessageHistory
from google.cloud import firestore
client = firestore.Client(project="PROJECT_ID")
return FirestoreChatMessageHistory(
client=client,
session_id=session_id,
collection="TABLE_NAME",
encode_message=False,
)
Crea l'agente e passalo come chat_history
:
agent = reasoning_engines.LangchainAgent(
model=model,
chat_history=get_session_history, # <- new
)
Bigtable
Innanzitutto, segui la documentazione di LangChain per configurare un database e installare il pacchetto.
Poi, definisci una funzione get_session_history
come segue:
def get_session_history(session_id: str):
from langchain_google_bigtable import BigtableChatMessageHistory
return BigtableChatMessageHistory(
instance_id="INSTANCE_ID",
table_id="TABLE_NAME",
session_id=session_id,
)
Crea l'agente e passalo come chat_history
:
agent = reasoning_engines.LangchainAgent(
model=model,
chat_history=get_session_history, # <- new
)
Spanner
Innanzitutto, segui la documentazione di LangChain per configurare un database e installare il pacchetto.
Poi, definisci una funzione get_session_history
come segue:
def get_session_history(session_id: str):
from langchain_google_spanner import SpannerChatMessageHistory
return SpannerChatMessageHistory(
instance_id="INSTANCE_ID",
database_id="DATABASE_ID",
table_name="TABLE_NAME",
session_id=session_id,
)
Crea l'agente e passalo come chat_history
:
agent = reasoning_engines.LangchainAgent(
model=model,
chat_history=get_session_history, # <- new
)
Quando esegui una query sull'agente, assicurati di passare session_id
in modo che l'agente abbia la "memoria" delle domande e delle risposte precedenti:
agent.query(
input="What is the exchange rate from US dollars to Swedish currency?",
config={"configurable": {"session_id": "SESSION_ID"}},
)
Passaggio 4: Personalizzare il modello di prompt
I modelli di prompt aiutano a tradurre l'input utente dell'utente in istruzioni per un modello e vengono utilizzati per guidare la risposta di un modello, aiutandolo a comprendere il contesto e a generare output basati sul linguaggio pertinenti e coerenti. Per maggiori dettagli, visita ChatPromptTemplates.
Il modello di prompt predefinito è organizzato in sezioni in sequenza.
Sezione | Descrizione |
---|---|
(Facoltativo) Istruzione di sistema | Istruzioni per l'agente da applicare a tutte le query. |
(Facoltativo) Cronologia chat | Messaggi corrispondenti alla cronologia chat di una sessione precedente. |
Input utente | La query dell'utente a cui l'agente deve rispondere. |
Blocco appunti dell'agente | Messaggi creati dall'agente (ad es. con chiamate di funzione) mentre svolge le sue operazioni, utilizza i suoi strumenti ed esegue deduzioni per formulare una risposta all'utente. |
Il modello di prompt predefinito viene generato se crei l'agente senza specificare il tuo modello di prompt e avrà il seguente aspetto completo:
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents.format_scratchpad.tools import format_to_tool_messages
prompt_template = {
"user_input": lambda x: x["input"],
"history": lambda x: x["history"],
"agent_scratchpad": lambda x: format_to_tool_messages(x["intermediate_steps"]),
} | ChatPromptTemplate.from_messages([
("system", "{system_instruction}"),
("placeholder", "{history}"),
("user", "{user_input}"),
("placeholder", "{agent_scratchpad}"),
])
Puoi sostituire il modello di prompt predefinito con il tuo e usarlo durante la costruzione dell'agente, ad esempio:
custom_prompt_template = {
"user_input": lambda x: x["input"],
"history": lambda x: x["history"],
"agent_scratchpad": lambda x: format_to_tool_messages(x["intermediate_steps"]),
} | ChatPromptTemplate.from_messages([
("placeholder", "{history}"),
("user", "{user_input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = reasoning_engines.LangchainAgent(
model=model,
prompt=custom_prompt_template,
chat_history=get_session_history,
tools=[get_exchange_rate],
)
agent.query(
input="What is the exchange rate from US dollars to Swedish currency?",
config={"configurable": {"session_id": "SESSION_ID"}},
)
Passaggio 5: Personalizzare l'orchestrazione
Tutti i componenti di LangChain implementano l'interfaccia Runnable, che fornisce schemi di input e output per l'orchestrazione. LangchainAgent
richiede la creazione di un file eseguibile per rispondere alle query. Per impostazione predefinita,
LangchainAgent
creerà un file eseguibile di questo tipo legando il modello agli strumenti
e utilizzerà un AgentExecutor
incapsulato in un RunnableWithMessageHistory
se la cronologia chat è attivata.
Ti consigliamo di personalizzare l'orchestrazione se intendi (i) implementare un agente che esegue un insieme deterministico di passaggi (anziché eseguire ragionamenti aperti) o (ii) chiedere all'agente, in modo simile a ReAct, di annotare ogni passaggio con i motivi per cui lo ha eseguito. Per farlo, devi eseguire l'override dell'eseguibile predefinito quando crei LangchainAgent
specificando l'argomento runnable_builder=
con una funzione Python della seguente firma:
from typing import Optional
from langchain_core.language_models import BaseLanguageModel
def runnable_builder(
model: BaseLanguageModel,
*,
system_instruction: Optional[str] = None,
prompt: Optional["RunnableSerializable"] = None,
tools: Optional[Sequence["_ToolLike"]] = None,
chat_history: Optional["GetSessionHistoryCallable"] = None,
model_tool_kwargs: Optional[Mapping[str, Any]] = None,
agent_executor_kwargs: Optional[Mapping[str, Any]] = None,
runnable_kwargs: Optional[Mapping[str, Any]] = None,
**kwargs,
):
dove
model
corrisponde al modello di chat restituito damodel_builder
(vedi Definire e configurare un modello),tools
emodel_tool_kwargs
corrispondono agli strumenti e alle configurazioni da utilizzare (vedi Definire e utilizzare uno strumento).chat_history
corrisponde al database per l'archiviazione dei messaggi di chat (vedi Archiviare la cronologia chat),system_instruction
eprompt
corrispondono alla configurazione della richiesta (consulta Personalizzare il modello di richiesta),agent_executor_kwargs
erunnable_kwargs
sono gli argomenti delle parole chiave che puoi utilizzare per personalizzare il file eseguibile da compilare.
Ciò offre diverse opzioni per personalizzare la logica di orchestrazione.
ChatModel
Nel caso più semplice, per creare un agente senza orchestrazione, puoi eseguire l'override di runnable_builder
per LangchainAgent
per restituire direttamente model
.
from langchain_core.language_models import BaseLanguageModel
def llm_builder(model: BaseLanguageModel, **kwargs):
return model
agent = reasoning_engines.LangchainAgent(
model=model,
runnable_builder=llm_builder,
)
ReAct
Per sostituire il comportamento di chiamata dello strumento predefinito con il tuo agente ReAct in base al tuo prompt
(vedi Personalizzare il modello di prompt), devi sostituire runnable_builder
con LangchainAgent
.
from typing import Sequence
from langchain_core.language_models import BaseLanguageModel
from langchain_core.prompts import BasePromptTemplate
from langchain_core.tools import BaseTool
from langchain import hub
def react_builder(
model: BaseLanguageModel,
*,
tools: Sequence[BaseTool],
prompt: BasePromptTemplate,
agent_executor_kwargs = None,
**kwargs,
):
from langchain.agents.react.agent import create_react_agent
from langchain.agents import AgentExecutor
agent = create_react_agent(model, tools, prompt)
return AgentExecutor(agent=agent, tools=tools, **agent_executor_kwargs)
agent = reasoning_engines.LangchainAgent(
model=model,
tools=[get_exchange_rate],
prompt=hub.pull("hwchase17/react"),
agent_executor_kwargs={"verbose": True}, # Optional. For illustration.
runnable_builder=react_builder,
)
Sintassi LCEL
Per costruire il seguente grafico utilizzando LangChain Expression Language (LCEL),
Input
/ \
Pros Cons
\ /
Summary
devi eseguire l'override di runnable_builder
per LangchainAgent
:
def lcel_builder(*, model, **kwargs):
from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
output_parser = StrOutputParser()
planner = ChatPromptTemplate.from_template(
"Generate an argument about: {input}"
) | model | output_parser | {"argument": RunnablePassthrough()}
pros = ChatPromptTemplate.from_template(
"List the positive aspects of {argument}"
) | model | output_parser
cons = ChatPromptTemplate.from_template(
"List the negative aspects of {argument}"
) | model | output_parser
final_responder = ChatPromptTemplate.from_template(
"Argument:{argument}\nPros:\n{pros}\n\nCons:\n{cons}\n"
"Generate a final response given the critique",
) | model | output_parser
return planner | {
"pros": pros,
"cons": cons,
"argument": itemgetter("argument"),
} | final_responder
agent = reasoning_engines.LangchainAgent(
model=model,
runnable_builder=lcel_builder,
)
LangGraph
Per costruire il seguente grafico utilizzando LangGraph:
Input
/ \
Pros Cons
\ /
Summary
devi eseguire l'override di runnable_builder
per LangchainAgent
:
def langgraph_builder(*, model, **kwargs):
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langgraph.graph import END, MessageGraph
output_parser = StrOutputParser()
planner = ChatPromptTemplate.from_template(
"Generate an argument about: {input}"
) | model | output_parser
pros = ChatPromptTemplate.from_template(
"List the positive aspects of {input}"
) | model | output_parser
cons = ChatPromptTemplate.from_template(
"List the negative aspects of {input}"
) | model | output_parser
summary = ChatPromptTemplate.from_template(
"Input:{input}\nGenerate a final response given the critique",
) | model | output_parser
builder = MessageGraph()
builder.add_node("planner", planner)
builder.add_node("pros", pros)
builder.add_node("cons", cons)
builder.add_node("summary", summary)
builder.add_edge("planner", "pros")
builder.add_edge("planner", "cons")
builder.add_edge("pros", "summary")
builder.add_edge("cons", "summary")
builder.add_edge("summary", END)
builder.set_entry_point("planner")
return builder.compile()
agent = reasoning_engines.LangchainAgent(
model=model,
runnable_builder=langgraph_builder,
)
# Example query
agent.query(input={"role": "user", "content": "scrum methodology"})