Описание проблемы:
Я разрабатываю агент, использующий LangChain, langchain_openai и специальный инструмент для отправки электронных писем. Инструмент под названием mail_tool разработан с учетом строгого набора правил и определенного формата ввода для отправки электронных писем. Однако я сталкиваюсь с проблемами, когда агент иногда не соблюдает правила, изобретает адреса электронной почты или не может отправить правильный контент. Правила инструмента и формат ввода:
Mail_tool должен строго следовать следующим правилам:
Использование инструмента: Его следует использовать только тогда, когда пользователь запрашивает отправку информации по электронной почте и предоставляет свой адрес электронной почты. адрес и необходимый контент.
Никаких вымышленных адресов электронной почты: Не следует изобретать адреса электронной почты; он должен использовать только тот формат, который предоставлен пользователем.
Формат ввода: Входные данные представляют собой строку, содержащую словарь, поскольку модель возвращает только строки:
import asyncio
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.messages import HumanMessage, AIMessage
from langgraph.graph import StateGraph, START, END, MessagesState
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.agents import create_openai_functions_agent, AgentExecutor
import json
# Model and tools configuration
model = ChatOpenAI(model="gpt-4", openai_api_key="KEY_HERE")
prompt = ChatPromptTemplate.from_messages([
("system", "You are a friendly assistant named Axel, and you will answer questions. You only provide answers of a maximum of 25 words. You respond in Spanish"),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
def send_mail_tool(data: str):
try:
parsed_data = json.loads(data)
mail = parsed_data.get("mail")
content = parsed_data.get("content")
if mail and content:
return "Email sent"
else:
return "Error: 'mail' or 'content' is missing"
except Exception as e:
return f"Error: {str(e)}"
mail_tool = Tool(
name="send_mail_tool",
func=send_mail_tool,
description="""
FOLLOW THESE RULES STRICTLY TO USE THIS TOOL:
- Use this tool only when the user requests to send information via email and provides their email address and the required content.
- Only use it for this purpose.
- Do not invent email addresses; only use the one provided by the user.
- Always, without exception, use the Input format.
- this is the Input Format:
The input must be a dictionary with the following keys:
{
'mail': 'user_email', # The user's email address.
'content': 'content_to_send' # The information to be sent.
}
"""
)
tools = [mail_tool]
agent = create_openai_functions_agent(llm=model, prompt=prompt, tools=tools)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=False)
workflow = StateGraph(state_schema=MessagesState)
async def call_agent(state: MessagesState):
user_input = state["messages"][-1].content
chat_history = state["messages"][:-1]
response = await agent_executor.ainvoke({
"input": user_input,
"chat_history": chat_history
})
return {"messages": state["messages"] + [AIMessage(content=response["output"])]}
workflow.add_node("agent", call_agent)
workflow.add_edge(START, "agent")
memory = MemorySaver()
app = workflow.compile(checkpointer=memory)
config = {"configurable": {"thread_id": "user1234"}}
app.update_state(config, {"messages": [
AIMessage(content="You are a friendly assistant named Axel, and you will answer questions. You only provide answers of a maximum of 25 words. You respond in Spanish")
]})
async def main():
print("Assistant Online. Type 'exit' to quit.")
while True:
user_input = input("\nYou: ")
if user_input.lower() == "exit":
print("Goodbye!")
break
app.update_state(config, {"messages": [HumanMessage(content=user_input)]})
state = app.get_state(config).values
try:
output = await app.ainvoke(state, config)
except Exception as e:
print("\nAssistant: Sorry, an error occurred while processing your request.")
print(f"Details: {str(e)}")
continue
print("\nAssistant:")
print(output["messages"][-1].content)
if __name__ == "__main__":
asyncio.run(main())
Конкретная проблема:
Агент иногда не следует правилам, установленным для mail_tool. А именно: 1. Придумывает адреса электронной почты. Иногда агент придумывает адреса электронной почты вместо того, чтобы использовать адрес, предоставленный пользователем. 2. Не удалось отправить контент: В других случаях агент отправляет контент неправильно или не соответствует указанному формату ввода. Вопрос:
Как исправить это поведение, чтобы агент строго следовал правилам и формату ввода для mail_tool? Существуют ли какие-либо альтернативные подходы или улучшения, которые я могу реализовать, чтобы сделать агент более согласованным?
Дополнительная информация:
В качестве языковой модели я использую gpt-4.
Функция send_mail_tool представляет собой симуляцию и не отправляет настоящие электронные письма, но должно соответствовать указанному формату и правилам.
Я ценю любые предложения и помощь, которые вы можете предоставить. Спасибо!
[b]Описание проблемы:[/b] Я разрабатываю агент, использующий LangChain, langchain_openai и специальный инструмент для отправки электронных писем. Инструмент под названием mail_tool разработан с учетом строгого набора правил и определенного формата ввода для отправки электронных писем. Однако я сталкиваюсь с проблемами, когда агент иногда не соблюдает правила, изобретает адреса электронной почты или не может отправить правильный контент. [b]Правила инструмента и формат ввода: [/b] Mail_tool должен строго следовать следующим правилам: [list] [*][b]Использование инструмента: [/b] Его следует использовать только тогда, когда пользователь запрашивает отправку информации по электронной почте и предоставляет свой адрес электронной почты. адрес и необходимый контент.
[*][b]Никаких вымышленных адресов электронной почты:[/b] Не следует изобретать адреса электронной почты; он должен использовать только тот формат, который предоставлен пользователем.
[*][b]Формат ввода:[/b] Входные данные представляют собой строку, содержащую словарь, поскольку модель возвращает только строки:
[/list] [code]{ 'mail': 'user_email', # The user's email address. 'content': 'content_to_send' # The information to be sent. } [/code] [b]Соответствующий код:[/b] Вот код, который я реализовал на данный момент: [code]import asyncio from langchain_openai import ChatOpenAI from langchain.tools import Tool from langgraph.checkpoint.memory import MemorySaver from langchain_core.messages import HumanMessage, AIMessage from langgraph.graph import StateGraph, START, END, MessagesState from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain.agents import create_openai_functions_agent, AgentExecutor import json
# Model and tools configuration model = ChatOpenAI(model="gpt-4", openai_api_key="KEY_HERE")
prompt = ChatPromptTemplate.from_messages([ ("system", "You are a friendly assistant named Axel, and you will answer questions. You only provide answers of a maximum of 25 words. You respond in Spanish"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}"), MessagesPlaceholder(variable_name="agent_scratchpad") ])
def send_mail_tool(data: str): try: parsed_data = json.loads(data) mail = parsed_data.get("mail") content = parsed_data.get("content") if mail and content: return "Email sent" else: return "Error: 'mail' or 'content' is missing" except Exception as e: return f"Error: {str(e)}"
mail_tool = Tool( name="send_mail_tool", func=send_mail_tool, description=""" FOLLOW THESE RULES STRICTLY TO USE THIS TOOL: - Use this tool only when the user requests to send information via email and provides their email address and the required content. - Only use it for this purpose. - Do not invent email addresses; only use the one provided by the user. - Always, without exception, use the Input format. - this is the Input Format: The input must be a dictionary with the following keys: { 'mail': 'user_email', # The user's email address. 'content': 'content_to_send' # The information to be sent. } """ )
app.update_state(config, {"messages": [ AIMessage(content="You are a friendly assistant named Axel, and you will answer questions. You only provide answers of a maximum of 25 words. You respond in Spanish") ]})
async def main(): print("Assistant Online. Type 'exit' to quit.") while True: user_input = input("\nYou: ") if user_input.lower() == "exit": print("Goodbye!") break app.update_state(config, {"messages": [HumanMessage(content=user_input)]}) state = app.get_state(config).values try: output = await app.ainvoke(state, config) except Exception as e: print("\nAssistant: Sorry, an error occurred while processing your request.") print(f"Details: {str(e)}") continue print("\nAssistant:") print(output["messages"][-1].content)
if __name__ == "__main__": asyncio.run(main()) [/code] [b]Конкретная проблема:[/b] Агент иногда не следует правилам, установленным для mail_tool. А именно: [b]1. Придумывает адреса электронной почты.[/b] Иногда агент придумывает адреса электронной почты вместо того, чтобы использовать адрес, предоставленный пользователем. [b]2. Не удалось отправить контент:[/b] В других случаях агент отправляет контент неправильно или не соответствует указанному формату ввода. [b]Вопрос: Как исправить это поведение, чтобы агент строго следовал правилам и формату ввода для mail_tool? Существуют ли какие-либо альтернативные подходы или улучшения, которые я могу реализовать, чтобы сделать агент более согласованным? Дополнительная информация:[/b] [list][*]В качестве языковой модели я использую gpt-4.
[*]Функция send_mail_tool представляет собой симуляцию и не отправляет настоящие электронные письма, но должно соответствовать указанному формату и правилам.
[/list] Я ценю любые предложения и помощь, которые вы можете предоставить. [b]Спасибо![/b]