Текущая настройка:
Код: Выделить всё
from fastapi import FastAPI
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import Tool
app = FastAPI()
llm = ChatOpenAI(temperature=0, model="gpt-4")
agent = initialize_agent(tools, llm, agent=AgentType.OPENAI_FUNCTIONS)
@app.post("/chat")
async def chat(query: str):
result = await agent.arun(query)
return {"response": result}
- Создание экземпляра агента. Агент инициализируется один раз глобально. Неясно, безопасно ли это для одновременных запросов или каждый запрос должен создавать экземпляр своего собственного агента.
- Память для каждого пользователя. В настоящее время память используется глобально, что приводит к смешиванию данных сеанса между пользователями. Правильный шаблон для изоляции ConversationBufferMemory или RedisChatMessageHistory для каждого session_id среди нескольких рабочих процессов не установлен.
- Асинхронная блокировка — метод arun() иногда блокирует цикл обработки событий. Не подтверждено, является ли asyncio.run_in_executor правильным подходом.
- Несколько рабочих процессов. Запуск с Gunicorn + Uvicorn с использованием 4 рабочих процессов приводит к несогласованному состоянию памяти между процессами. Отсутствует общая стратегия управления состоянием.
- Создание нового экземпляра агента по запросу — функционально, но приводит к заметным задержкам.
- Использование RedisChatMessageHistory для постоянства — решает проблему хранения, но общая архитектура обеспечивает его чистое подключение на сеанс остается неясным.
- Обертывание arun() в run_in_executor — уменьшает блокировку, но не уверен, является ли это рекомендуемым подходом.
Какова рекомендуемая архитектура для запуска агентов LangChain в FastAPI в большом масштабе?