Sviluppare un'applicazione

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:

  1. Definire e configurare un modello
  2. Definire e utilizzare uno strumento
  3. (Facoltativo) Memorizza la cronologia chat
  4. (Facoltativo) Personalizza il modello di prompt
  5. (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:

  1. Devi definire la versione del modello da utilizzare.

    model = "gemini-1.5-flash-001"
    
  2. (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,
    }
    
  3. (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

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"})

Passaggi successivi