Проблема с агентом LangChain: инструмент отправки электронной почты не соответствует установленным правиламPython

Программы на Python
Ответить
Anonymous
 Проблема с агентом LangChain: инструмент отправки электронной почты не соответствует установленным правилам

Сообщение Anonymous »

Описание проблемы:
Я разрабатываю агент, использующий LangChain, langchain_openai и специальный инструмент для отправки электронных писем. Инструмент под названием mail_tool разработан с учетом строгого набора правил и определенного формата ввода для отправки электронных писем. Однако я сталкиваюсь с проблемами, когда агент иногда не соблюдает правила, изобретает адреса электронной почты или не может отправить правильный контент.
Правила инструмента и формат ввода:
Mail_tool должен строго следовать следующим правилам:
  • Использование инструмента: Его следует использовать только тогда, когда пользователь запрашивает отправку информации по электронной почте и предоставляет свой адрес электронной почты. адрес и необходимый контент.
  • Никаких вымышленных адресов электронной почты: Не следует изобретать адреса электронной почты; он должен использовать только тот формат, который предоставлен пользователем.
  • Формат ввода: Входные данные представляют собой строку, содержащую словарь, поскольку модель возвращает только строки:

Код: Выделить всё

{
'mail': 'user_email',  # The user's email address.
'content': 'content_to_send'  # The information to be sent.
}
Соответствующий код:
Вот код, который я реализовал на данный момент:

Код: Выделить всё

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 представляет собой симуляцию и не отправляет настоящие электронные письма, но должно соответствовать указанному формату и правилам.
Я ценю любые предложения и помощь, которые вы можете предоставить. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... shed-rules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»