View Source LangChain.Tools.Calculator (LangChain v0.3.0-rc.0)
Defines a Calculator tool for performing basic math calculations.
This is an example of a pre-built LangChain.Function
that is designed and
configured for a specific purpose.
This defines a function to expose to an LLM and provides an implementation for
the execute/2
function for evaluating when an LLM executes the function.
When using the Calculator
tool, you will either need to:
- make repeated calls to run the chain as the tool is called and the results are then made available to the LLM before it returns the final result.
- OR run the chain using the
mode: :until_success
option like this:LangChain.LLMChain.run(chain, mode: :until_success)
Example
The following is an example that uses a prompt where math is needed. What follows is the verbose log output.
{:ok, updated_chain, %Message{} = message} =
%{llm: ChatOpenAI.new!(%{temperature: 0}), verbose: true}
|> LLMChain.new!()
|> LLMChain.add_message(
Message.new_user!("Answer the following math question: What is 100 + 300 - 200?")
)
|> LLMChain.add_functions(Calculator.new!())
|> LLMChain.run(mode: :until_success)
Verbose log output:
LLM: %LangChain.ChatModels.ChatOpenAI{
endpoint: "https://api.openai.com/v1/chat/completions",
model: "gpt-3.5-turbo",
api_key: nil,
temperature: 0.0,
frequency_penalty: 0.0,
receive_timeout: 60000,
seed: 0,
n: 1,
json_response: false,
stream: false,
max_tokens: nil,
user: nil
}
MESSAGES: [
%LangChain.Message{
content: "Answer the following math question: What is 100 + 300 - 200?",
index: nil,
status: :complete,
role: :user,
name: nil,
tool_calls: [],
tool_results: nil
}
]
TOOLS: [
%LangChain.Function{
name: "calculator",
description: "Perform basic math calculations or expressions",
display_text: nil,
function: #Function<0.75045395/2 in LangChain.Tools.Calculator.execute>,
async: true,
parameters_schema: %{
type: "object",
required: ["expression"],
properties: %{
expression: %{
type: "string",
description: "A simple mathematical expression"
}
}
},
parameters: []
}
]
SINGLE MESSAGE RESPONSE: %LangChain.Message{
content: nil,
index: 0,
status: :complete,
role: :assistant,
name: nil,
tool_calls: [
%LangChain.Message.ToolCall{
status: :complete,
type: :function,
call_id: "call_NlHbo4R5NXTA6lHyjLdGQN9p",
name: "calculator",
arguments: %{"expression" => "100 + 300 - 200"},
index: nil
}
],
tool_results: nil
}
EXECUTING FUNCTION: "calculator"
FUNCTION RESULT: "200"
TOOL RESULTS: %LangChain.Message{
content: nil,
index: nil,
status: :complete,
role: :tool,
name: nil,
tool_calls: [],
tool_results: [
%LangChain.Message.ToolResult{
type: :function,
tool_call_id: "call_NlHbo4R5NXTA6lHyjLdGQN9p",
name: "calculator",
content: "200",
display_text: nil,
is_error: false
}
]
}
SINGLE MESSAGE RESPONSE: %LangChain.Message{
content: "The result of the math question "100 + 300 - 200" is 200.",
index: 0,
status: :complete,
role: :assistant,
name: nil,
tool_calls: [],
tool_results: nil
}
Summary
Functions
Performs the calculation specified in the expression and returns the response to be used by the the LLM.
Define the "calculator" function. Returns a success/failure response.
Define the "calculator" function. Raises an exception if function creation fails.
Functions
@spec execute(args :: %{required(String.t()) => any()}, context :: map()) :: {:ok, String.t()} | {:error, String.t()}
Performs the calculation specified in the expression and returns the response to be used by the the LLM.
@spec new() :: {:ok, LangChain.Function.t()} | {:error, Ecto.Changeset.t()}
Define the "calculator" function. Returns a success/failure response.
@spec new!() :: LangChain.Function.t() | no_return()
Define the "calculator" function. Raises an exception if function creation fails.