import { StructuredTool, ToolRunnableConfig } from '@langchain/core/tools'; import { z } from 'zod'; import { CallbackManagerForToolRun } from '@langchain/core/callbacks/manager'; import { getVectorStore } from './vector-store'; export class KnowledgeBaseTool extends StructuredTool { name = 'search_knowledge_base'; description = 'Ищет информацию в базе знаний компании о процессах, оплатах, подаче заявок, правилах и документах УК. Используй этот инструмент для вопросов, требующих специфических знаний о компании.'; schema = z.object({ query: z.string().describe('Поисковый запрос для поиска в базе знаний'), }); protected async _call( arg: z.infer, runManager?: CallbackManagerForToolRun, parentConfig?: ToolRunnableConfig> ): Promise { try { const vectorStore = getVectorStore(); const retriever = vectorStore.asRetriever({ k: 5 }); const relevantDocs = await retriever.getRelevantDocuments(arg.query); if (!relevantDocs || relevantDocs.length === 0) { return 'В базе знаний не найдено информации по данному запросу. Возможно, стоит переформулировать вопрос или обратиться к специалисту.'; } const formattedDocs = relevantDocs.map((doc, index) => { return `Документ ${index + 1}:\n${doc.pageContent}\n`; }).join('\n---\n'); return `Найдена следующая информация в базе знаний компании:\n\n${formattedDocs}\n\nИспользуй эту информацию для ответа на вопрос пользователя.`; } catch (error) { return 'Произошла ошибка при поиске в базе знаний. Попробуйте переформулировать запрос.'; } } }