mirror of
https://github.com/hwchase17/langchain.git
synced 2025-08-07 12:06:43 +00:00
community[patch], experimental[patch]: support tool-calling sql and p… (#20639)
d agents
This commit is contained in:
parent
d0cee65cdc
commit
1c7b3c75a7
@ -44,7 +44,9 @@ if TYPE_CHECKING:
|
|||||||
def create_sql_agent(
|
def create_sql_agent(
|
||||||
llm: BaseLanguageModel,
|
llm: BaseLanguageModel,
|
||||||
toolkit: Optional[SQLDatabaseToolkit] = None,
|
toolkit: Optional[SQLDatabaseToolkit] = None,
|
||||||
agent_type: Optional[Union[AgentType, Literal["openai-tools"]]] = None,
|
agent_type: Optional[
|
||||||
|
Union[AgentType, Literal["openai-tools", "tool-calling"]]
|
||||||
|
] = None,
|
||||||
callback_manager: Optional[BaseCallbackManager] = None,
|
callback_manager: Optional[BaseCallbackManager] = None,
|
||||||
prefix: Optional[str] = None,
|
prefix: Optional[str] = None,
|
||||||
suffix: Optional[str] = None,
|
suffix: Optional[str] = None,
|
||||||
@ -65,13 +67,15 @@ def create_sql_agent(
|
|||||||
"""Construct a SQL agent from an LLM and toolkit or database.
|
"""Construct a SQL agent from an LLM and toolkit or database.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
llm: Language model to use for the agent.
|
llm: Language model to use for the agent. If agent_type is "tool-calling" then
|
||||||
|
llm is expected to support tool calling.
|
||||||
toolkit: SQLDatabaseToolkit for the agent to use. Must provide exactly one of
|
toolkit: SQLDatabaseToolkit for the agent to use. Must provide exactly one of
|
||||||
'toolkit' or 'db'. Specify 'toolkit' if you want to use a different model
|
'toolkit' or 'db'. Specify 'toolkit' if you want to use a different model
|
||||||
for the agent and the toolkit.
|
for the agent and the toolkit.
|
||||||
agent_type: One of "openai-tools", "openai-functions", or
|
agent_type: One of "tool-calling", "openai-tools", "openai-functions", or
|
||||||
"zero-shot-react-description". Defaults to "zero-shot-react-description".
|
"zero-shot-react-description". Defaults to "zero-shot-react-description".
|
||||||
"openai-tools" is recommended over "openai-functions".
|
"tool-calling" is recommended over the legacy "openai-tools" and
|
||||||
|
"openai-functions" types.
|
||||||
callback_manager: DEPRECATED. Pass "callbacks" key into 'agent_executor_kwargs'
|
callback_manager: DEPRECATED. Pass "callbacks" key into 'agent_executor_kwargs'
|
||||||
instead to pass constructor callbacks to AgentExecutor.
|
instead to pass constructor callbacks to AgentExecutor.
|
||||||
prefix: Prompt prefix string. Must contain variables "top_k" and "dialect".
|
prefix: Prompt prefix string. Must contain variables "top_k" and "dialect".
|
||||||
@ -107,13 +111,14 @@ def create_sql_agent(
|
|||||||
|
|
||||||
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
|
db = SQLDatabase.from_uri("sqlite:///Chinook.db")
|
||||||
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
||||||
agent_executor = create_sql_agent(llm, db=db, agent_type="openai-tools", verbose=True)
|
agent_executor = create_sql_agent(llm, db=db, agent_type="tool-calling", verbose=True)
|
||||||
|
|
||||||
""" # noqa: E501
|
""" # noqa: E501
|
||||||
from langchain.agents import (
|
from langchain.agents import (
|
||||||
create_openai_functions_agent,
|
create_openai_functions_agent,
|
||||||
create_openai_tools_agent,
|
create_openai_tools_agent,
|
||||||
create_react_agent,
|
create_react_agent,
|
||||||
|
create_tool_calling_agent,
|
||||||
)
|
)
|
||||||
from langchain.agents.agent import (
|
from langchain.agents.agent import (
|
||||||
AgentExecutor,
|
AgentExecutor,
|
||||||
@ -193,7 +198,7 @@ def create_sql_agent(
|
|||||||
return_keys_arg=["output"],
|
return_keys_arg=["output"],
|
||||||
**kwargs,
|
**kwargs,
|
||||||
)
|
)
|
||||||
elif agent_type == "openai-tools":
|
elif agent_type in ("openai-tools", "tool-calling"):
|
||||||
if prompt is None:
|
if prompt is None:
|
||||||
messages = [
|
messages = [
|
||||||
SystemMessage(content=cast(str, prefix)),
|
SystemMessage(content=cast(str, prefix)),
|
||||||
@ -202,8 +207,12 @@ def create_sql_agent(
|
|||||||
MessagesPlaceholder(variable_name="agent_scratchpad"),
|
MessagesPlaceholder(variable_name="agent_scratchpad"),
|
||||||
]
|
]
|
||||||
prompt = ChatPromptTemplate.from_messages(messages)
|
prompt = ChatPromptTemplate.from_messages(messages)
|
||||||
|
if agent_type == "openai-tools":
|
||||||
|
runnable = create_openai_tools_agent(llm, tools, prompt)
|
||||||
|
else:
|
||||||
|
runnable = create_tool_calling_agent(llm, tools, prompt)
|
||||||
agent = RunnableMultiActionAgent(
|
agent = RunnableMultiActionAgent(
|
||||||
runnable=create_openai_tools_agent(llm, tools, prompt),
|
runnable=runnable,
|
||||||
input_keys_arg=["input"],
|
input_keys_arg=["input"],
|
||||||
return_keys_arg=["output"],
|
return_keys_arg=["output"],
|
||||||
**kwargs,
|
**kwargs,
|
||||||
@ -212,7 +221,8 @@ def create_sql_agent(
|
|||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Agent type {agent_type} not supported at the moment. Must be one of "
|
f"Agent type {agent_type} not supported at the moment. Must be one of "
|
||||||
"'openai-tools', 'openai-functions', or 'zero-shot-react-description'."
|
"'tool-calling', 'openai-tools', 'openai-functions', or "
|
||||||
|
"'zero-shot-react-description'."
|
||||||
)
|
)
|
||||||
|
|
||||||
return AgentExecutor(
|
return AgentExecutor(
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
"""Agent for working with pandas objects."""
|
"""Agent for working with pandas objects."""
|
||||||
import warnings
|
import warnings
|
||||||
from typing import Any, Dict, List, Literal, Optional, Sequence, Union
|
from typing import Any, Dict, List, Literal, Optional, Sequence, Union, cast
|
||||||
|
|
||||||
from langchain.agents import AgentType, create_openai_tools_agent, create_react_agent
|
from langchain.agents import (
|
||||||
|
AgentType,
|
||||||
|
create_openai_tools_agent,
|
||||||
|
create_react_agent,
|
||||||
|
create_tool_calling_agent,
|
||||||
|
)
|
||||||
from langchain.agents.agent import (
|
from langchain.agents.agent import (
|
||||||
AgentExecutor,
|
AgentExecutor,
|
||||||
BaseMultiActionAgent,
|
BaseMultiActionAgent,
|
||||||
@ -16,7 +21,7 @@ from langchain.agents.openai_functions_agent.base import (
|
|||||||
create_openai_functions_agent,
|
create_openai_functions_agent,
|
||||||
)
|
)
|
||||||
from langchain_core.callbacks import BaseCallbackManager
|
from langchain_core.callbacks import BaseCallbackManager
|
||||||
from langchain_core.language_models import LanguageModelLike
|
from langchain_core.language_models import BaseLanguageModel, LanguageModelLike
|
||||||
from langchain_core.messages import SystemMessage
|
from langchain_core.messages import SystemMessage
|
||||||
from langchain_core.prompts import (
|
from langchain_core.prompts import (
|
||||||
BasePromptTemplate,
|
BasePromptTemplate,
|
||||||
@ -147,7 +152,7 @@ def create_pandas_dataframe_agent(
|
|||||||
llm: LanguageModelLike,
|
llm: LanguageModelLike,
|
||||||
df: Any,
|
df: Any,
|
||||||
agent_type: Union[
|
agent_type: Union[
|
||||||
AgentType, Literal["openai-tools"]
|
AgentType, Literal["openai-tools", "tool-calling"]
|
||||||
] = AgentType.ZERO_SHOT_REACT_DESCRIPTION,
|
] = AgentType.ZERO_SHOT_REACT_DESCRIPTION,
|
||||||
callback_manager: Optional[BaseCallbackManager] = None,
|
callback_manager: Optional[BaseCallbackManager] = None,
|
||||||
prefix: Optional[str] = None,
|
prefix: Optional[str] = None,
|
||||||
@ -168,11 +173,13 @@ def create_pandas_dataframe_agent(
|
|||||||
"""Construct a Pandas agent from an LLM and dataframe(s).
|
"""Construct a Pandas agent from an LLM and dataframe(s).
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
llm: Language model to use for the agent.
|
llm: Language model to use for the agent. If agent_type is "tool-calling" then
|
||||||
|
llm is expected to support tool calling.
|
||||||
df: Pandas dataframe or list of Pandas dataframes.
|
df: Pandas dataframe or list of Pandas dataframes.
|
||||||
agent_type: One of "openai-tools", "openai-functions", or
|
agent_type: One of "tool-calling", "openai-tools", "openai-functions", or
|
||||||
"zero-shot-react-description". Defaults to "zero-shot-react-description".
|
"zero-shot-react-description". Defaults to "zero-shot-react-description".
|
||||||
"openai-tools" is recommended over "openai-functions".
|
"tool-calling" is recommended over the legacy "openai-tools" and
|
||||||
|
"openai-functions" types.
|
||||||
callback_manager: DEPRECATED. Pass "callbacks" key into 'agent_executor_kwargs'
|
callback_manager: DEPRECATED. Pass "callbacks" key into 'agent_executor_kwargs'
|
||||||
instead to pass constructor callbacks to AgentExecutor.
|
instead to pass constructor callbacks to AgentExecutor.
|
||||||
prefix: Prompt prefix string.
|
prefix: Prompt prefix string.
|
||||||
@ -209,7 +216,7 @@ def create_pandas_dataframe_agent(
|
|||||||
agent_executor = create_pandas_dataframe_agent(
|
agent_executor = create_pandas_dataframe_agent(
|
||||||
llm,
|
llm,
|
||||||
df,
|
df,
|
||||||
agent_type="openai-tools",
|
agent_type="tool-calling",
|
||||||
verbose=True
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -268,7 +275,7 @@ def create_pandas_dataframe_agent(
|
|||||||
input_keys_arg=["input"],
|
input_keys_arg=["input"],
|
||||||
return_keys_arg=["output"],
|
return_keys_arg=["output"],
|
||||||
)
|
)
|
||||||
elif agent_type in (AgentType.OPENAI_FUNCTIONS, "openai-tools"):
|
elif agent_type in (AgentType.OPENAI_FUNCTIONS, "openai-tools", "tool-calling"):
|
||||||
prompt = _get_functions_prompt(
|
prompt = _get_functions_prompt(
|
||||||
df,
|
df,
|
||||||
prefix=prefix,
|
prefix=prefix,
|
||||||
@ -277,21 +284,33 @@ def create_pandas_dataframe_agent(
|
|||||||
number_of_head_rows=number_of_head_rows,
|
number_of_head_rows=number_of_head_rows,
|
||||||
)
|
)
|
||||||
if agent_type == AgentType.OPENAI_FUNCTIONS:
|
if agent_type == AgentType.OPENAI_FUNCTIONS:
|
||||||
|
runnable = create_openai_functions_agent(
|
||||||
|
cast(BaseLanguageModel, llm), tools, prompt
|
||||||
|
)
|
||||||
agent = RunnableAgent(
|
agent = RunnableAgent(
|
||||||
runnable=create_openai_functions_agent(llm, tools, prompt), # type: ignore
|
runnable=runnable,
|
||||||
input_keys_arg=["input"],
|
input_keys_arg=["input"],
|
||||||
return_keys_arg=["output"],
|
return_keys_arg=["output"],
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
if agent_type == "openai-tools":
|
||||||
|
runnable = create_openai_tools_agent(
|
||||||
|
cast(BaseLanguageModel, llm), tools, prompt
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
runnable = create_tool_calling_agent(
|
||||||
|
cast(BaseLanguageModel, llm), tools, prompt
|
||||||
|
)
|
||||||
agent = RunnableMultiActionAgent(
|
agent = RunnableMultiActionAgent(
|
||||||
runnable=create_openai_tools_agent(llm, tools, prompt), # type: ignore
|
runnable=runnable,
|
||||||
input_keys_arg=["input"],
|
input_keys_arg=["input"],
|
||||||
return_keys_arg=["output"],
|
return_keys_arg=["output"],
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Agent type {agent_type} not supported at the moment. Must be one of "
|
f"Agent type {agent_type} not supported at the moment. Must be one of "
|
||||||
"'openai-tools', 'openai-functions', or 'zero-shot-react-description'."
|
"'tool-calling', 'openai-tools', 'openai-functions', or "
|
||||||
|
"'zero-shot-react-description'."
|
||||||
)
|
)
|
||||||
return AgentExecutor(
|
return AgentExecutor(
|
||||||
agent=agent,
|
agent=agent,
|
||||||
|
Loading…
Reference in New Issue
Block a user