fix system prompt
This commit is contained in:
@@ -1,63 +0,0 @@
|
|||||||
# AI Support Agent
|
|
||||||
|
|
||||||
AI-агент поддержки интегрирован в существующий `supportApi.js`.
|
|
||||||
|
|
||||||
## Структура
|
|
||||||
|
|
||||||
```
|
|
||||||
support-ai-agent/
|
|
||||||
├── gigachat.ts # Конфигурация GigaChat
|
|
||||||
├── support-agent.ts # Основной класс агента
|
|
||||||
└── README.md # Документация
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### POST `/support`
|
|
||||||
Отправить сообщение в службу поддержки (теперь с AI-агентом).
|
|
||||||
|
|
||||||
**Запрос:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"user_id": "string", // Обязательно
|
|
||||||
"message": "string", // Обязательно
|
|
||||||
"system_prompt": "string" // Опционально - настройка поведения агента
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"reply": "Ответ AI-агента",
|
|
||||||
"success": true
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### POST `/support/configure`
|
|
||||||
Настроить системный промпт для конкретного пользователя.
|
|
||||||
|
|
||||||
### DELETE `/support/history/:userId`
|
|
||||||
Очистить историю диалога пользователя.
|
|
||||||
|
|
||||||
## Возможности
|
|
||||||
|
|
||||||
- 🤖 Интеллектуальные ответы на основе GigaChat
|
|
||||||
- 💾 Сохранение всех сообщений в базу данных Supabase
|
|
||||||
- 🧠 Память контекста диалога для каждого пользователя
|
|
||||||
- ⚙️ Настраиваемые системные промпты
|
|
||||||
- 📊 Поддержка множественных пользователей
|
|
||||||
|
|
||||||
## Примеры системных промптов
|
|
||||||
|
|
||||||
### Техническая поддержка
|
|
||||||
```
|
|
||||||
Ты - специалист технической поддержки мобильного приложения "Умный дом".
|
|
||||||
Помогай пользователям решать проблемы, объясняй функции простым языком,
|
|
||||||
проводи диагностику пошагово. Всегда будь дружелюбным и терпеливым.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Общая поддержка клиентов
|
|
||||||
```
|
|
||||||
Ты - профессиональный агент службы поддержки. Помогай решать вопросы
|
|
||||||
пользователей, отвечай вежливо и по существу, проявляй эмпатию.
|
|
||||||
```
|
|
||||||
@@ -5,7 +5,6 @@ import { MemorySaver } from '@langchain/langgraph';
|
|||||||
import gigachat from './gigachat';
|
import gigachat from './gigachat';
|
||||||
|
|
||||||
export interface SupportAgentConfig {
|
export interface SupportAgentConfig {
|
||||||
systemPrompt?: string;
|
|
||||||
temperature?: number;
|
temperature?: number;
|
||||||
threadId?: string;
|
threadId?: string;
|
||||||
}
|
}
|
||||||
@@ -22,11 +21,13 @@ export class SupportAgent {
|
|||||||
private agent: any;
|
private agent: any;
|
||||||
private systemPrompt: string;
|
private systemPrompt: string;
|
||||||
private threadId: string;
|
private threadId: string;
|
||||||
|
private isFirstMessage: boolean;
|
||||||
|
|
||||||
constructor(config: SupportAgentConfig = {}) {
|
constructor(config: SupportAgentConfig = {}) {
|
||||||
this.systemPrompt = config.systemPrompt || this.getDefaultSystemPrompt();
|
this.systemPrompt = this.getDefaultSystemPrompt();
|
||||||
this.threadId = config.threadId || 'default';
|
this.threadId = config.threadId || 'default';
|
||||||
this.memorySaver = new MemorySaver();
|
this.memorySaver = new MemorySaver();
|
||||||
|
this.isFirstMessage = true;
|
||||||
|
|
||||||
// Настраиваем модель с заданной температурой
|
// Настраиваем модель с заданной температурой
|
||||||
this.llm = gigachat;
|
this.llm = gigachat;
|
||||||
@@ -58,30 +59,24 @@ export class SupportAgent {
|
|||||||
Всегда отвечай на русском языке и старайся быть максимально полезным.`;
|
Всегда отвечай на русском языке и старайся быть максимально полезным.`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Обновить системный промпт
|
|
||||||
*/
|
|
||||||
public updateSystemPrompt(newPrompt: string): void {
|
|
||||||
this.systemPrompt = newPrompt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Получить текущий системный промпт
|
|
||||||
*/
|
|
||||||
public getSystemPrompt(): string {
|
|
||||||
return this.systemPrompt;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Обработать сообщение пользователя и получить ответ
|
* Обработать сообщение пользователя и получить ответ
|
||||||
*/
|
*/
|
||||||
public async processMessage(userMessage: string): Promise<SupportResponse> {
|
public async processMessage(userMessage: string): Promise<SupportResponse> {
|
||||||
try {
|
try {
|
||||||
// Создаем сообщения с системным промптом
|
// Создаем массив сообщений
|
||||||
const messages = [
|
const messages: BaseMessage[] = [];
|
||||||
new SystemMessage(this.systemPrompt),
|
|
||||||
new HumanMessage(userMessage)
|
// Добавляем системный промпт только в первом сообщении
|
||||||
];
|
if (this.isFirstMessage) {
|
||||||
|
messages.push(new SystemMessage(this.systemPrompt));
|
||||||
|
this.isFirstMessage = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Добавляем сообщение пользователя
|
||||||
|
messages.push(new HumanMessage(userMessage));
|
||||||
|
|
||||||
// Получаем ответ от агента
|
// Получаем ответ от агента
|
||||||
const response = await this.agent.invoke({
|
const response = await this.agent.invoke({
|
||||||
@@ -120,12 +115,9 @@ export class SupportAgent {
|
|||||||
tools: [],
|
tools: [],
|
||||||
checkpointSaver: this.memorySaver
|
checkpointSaver: this.memorySaver
|
||||||
});
|
});
|
||||||
|
// Сбрасываем флаг первого сообщения
|
||||||
|
this.isFirstMessage = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Изменить ID потока (для работы с разными пользователями)
|
|
||||||
*/
|
|
||||||
public setThreadId(threadId: string): void {
|
|
||||||
this.threadId = threadId;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -8,15 +8,12 @@ const userAgents = new Map();
|
|||||||
/**
|
/**
|
||||||
* Получить или создать агента для пользователя
|
* Получить или создать агента для пользователя
|
||||||
*/
|
*/
|
||||||
function getUserAgent(userId, systemPrompt) {
|
function getUserAgent(userId) {
|
||||||
if (!userAgents.has(userId)) {
|
if (!userAgents.has(userId)) {
|
||||||
const config = {
|
const config = {
|
||||||
threadId: userId,
|
threadId: userId,
|
||||||
temperature: 0.7
|
temperature: 0.7
|
||||||
};
|
};
|
||||||
if (systemPrompt) {
|
|
||||||
config.systemPrompt = systemPrompt;
|
|
||||||
}
|
|
||||||
userAgents.set(userId, new SupportAgent(config));
|
userAgents.set(userId, new SupportAgent(config));
|
||||||
}
|
}
|
||||||
return userAgents.get(userId);
|
return userAgents.get(userId);
|
||||||
@@ -25,7 +22,7 @@ function getUserAgent(userId, systemPrompt) {
|
|||||||
// POST /api/support
|
// POST /api/support
|
||||||
router.post('/support', async (req, res) => {
|
router.post('/support', async (req, res) => {
|
||||||
const supabase = getSupabaseClient();
|
const supabase = getSupabaseClient();
|
||||||
const { user_id, message, system_prompt } = req.body;
|
const { user_id, message } = req.body;
|
||||||
|
|
||||||
if (!user_id || !message) {
|
if (!user_id || !message) {
|
||||||
return res.status(400).json({ error: 'user_id и message обязательны' });
|
return res.status(400).json({ error: 'user_id и message обязательны' });
|
||||||
@@ -42,12 +39,7 @@ router.post('/support', async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Получаем агента для пользователя
|
// Получаем агента для пользователя
|
||||||
const agent = getUserAgent(user_id, system_prompt);
|
const agent = getUserAgent(user_id);
|
||||||
|
|
||||||
// Обновляем системный промпт если передан
|
|
||||||
if (system_prompt) {
|
|
||||||
agent.updateSystemPrompt(system_prompt);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Получаем ответ от AI-агента
|
// Получаем ответ от AI-агента
|
||||||
const aiResponse = await agent.processMessage(message);
|
const aiResponse = await agent.processMessage(message);
|
||||||
@@ -89,35 +81,7 @@ router.post('/support', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// POST /api/support/configure - Настройка системного промпта
|
|
||||||
router.post('/support/configure', async (req, res) => {
|
|
||||||
const { user_id, system_prompt } = req.body;
|
|
||||||
|
|
||||||
if (!user_id) {
|
|
||||||
return res.status(400).json({ error: 'user_id обязателен' });
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const agent = getUserAgent(user_id, system_prompt);
|
|
||||||
|
|
||||||
if (system_prompt) {
|
|
||||||
agent.updateSystemPrompt(system_prompt);
|
|
||||||
}
|
|
||||||
|
|
||||||
res.json({
|
|
||||||
message: 'Конфигурация агента обновлена',
|
|
||||||
current_system_prompt: agent.getSystemPrompt(),
|
|
||||||
success: true
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Ошибка в /support/configure:', error);
|
|
||||||
res.status(500).json({
|
|
||||||
error: 'Внутренняя ошибка сервера',
|
|
||||||
success: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// DELETE /api/support/history/:userId - Очистка истории диалога
|
// DELETE /api/support/history/:userId - Очистка истории диалога
|
||||||
router.delete('/support/history/:userId', async (req, res) => {
|
router.delete('/support/history/:userId', async (req, res) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user