С момента написания моей прошлой статьи прошло не так много времени, но прогрес не стоит на месте и произошло несколько важных изменений. Здесь я не буду рассматривать основы - почитайте оригинальную статью.
Контекст
Итак, первое важное изменение - это значительный рост размера контестного окна и падение стоимости токенов. Например размер окна в самой большой медели Клод от Антропик составляет 200+ тыс токенов, а Gemini, судя по последним новостям до 10млн. В таких условиях для многих задач RAG просто не требуется (или не все его компоненты), т.к. все данные можно поместить в контекстное окно. Мы уже столкнулись на практике с несколькими проектами в финансово-аналитической сфере, где задача составления инвестиционных проспектов на основе отчености компаний, была полностью решена без использования векторной базы данных как промежуточного хранилища. Тенденция на удешевление токенов и увелчичение контекстного окна явно продолжится, поэтому актуальность использования сторонних для LLM механизмов будет падать. Но пока они еще требуются.
Если же (вдруг) размера контекста все же не хватает, то в люди придумали разные методы суммаризации и сжатия контекста. В langchain появился класс, направленный на это: ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=OpenAI(temperature=0))
memory.save_context({"input": "hi"}, {"output": "Hello there!"})
memory.load_memory_variables({})
{'history': '\nThe human greets the AI, to which the AI responds.'}
llm = OpenAI(temperature=0)
conversation_with_summary = ConversationChain(
llm=llm,
memory=ConversationSummaryMemory(llm=OpenAI()),
verbose=True
)
conversation_with_summary.predict(input="Hi, what's up?")Карта Знаний
С ростом количества данных, в которых LLM приходится ориентироваться становится куда более важным возможность ориентироваться в данных. Иногда, без возможности проанализировать структуру данных и некоторые другие атрибуты не возможно ими нормально пользоватся. Например, допустим источником данных является вики компании. В вики есть страница с телефоном данной компании, но это никак явно нигде не указанно. Итак - как ЛЛМ понять что это телефон компании? Непонятно, поэтому на вопрос о телефлне компании стандартный RAG ничего не выдаст (т.к. не видит никакой взаимосвязи). Как человек понимает что это телефон компании в данном случае? Очень просто, страница хранится в подкаталоге, который называется “Информация о компании”. Т.е. человек способен из конвенции о том как данные хранятся (т.е. из структуры или иначе метаданных) понять о чем эти данные и эффективно их использовать. В случае с LLM данная проблемма решается с помощью Knowledge Graphs с метаданными (они же Knowledge Maps), т.е. LLM имеет не только данные в чистом виде но и данные о структуре хранения и связях разных data entites в данных. Т.е. понимает что эти данные означают. Этот подход называют еще Graph Retreival Augumented Generation или GraphRag.
Графы отлично подходят для представления и хранения разнородной и взаимосвязанной информации в структурированном виде, легко захватывая сложные отношения и атрибуты среди различных типов данных, с чем возникают проблеммы у векторных баз.

Как создать граф знаний? Это интересный вопрос. Обычно этот процесс включает в себя сбор и структурирование данных, что требует глубокого понимания как предметной области, так и моделирования графов.
В значительной степени этот процесс можно автоматизировать с помощью LLM (сюрприз
