Comments 28
... По вопросу нарезки данных (чанков текста) возможны три пути.
Вариант с онлайн (не локальной) моделью в 120к токенов не рассматриваете?
Я наконец получил нужный мне результат нарезки с использованием GPT4 128k токенов. Аккуратно нарезает текст.
Учитывая, что у меня 3.5тыс документов с текстом > 14k tokens, с доп. обработкой это порядка $4k для OpenAPI за нарезку всех текстов и пост-обработку.
А затем ежемесячный мелкий объем, зато не нужно растопыриваться, как та корова в бомболюке.
Не понял вопроса или Вы не прочитали первую часть.
Конечно можно использовать gpt4, это есть в выводах, но к сожалению такое решение вряд ли пройдёт инфобез в крупных компаниях, а в Российских и подавно.
Но если речь будет идти об открытой информации, вроде маркетинга, то gpt4 turbo вполне можно использовать и получить не менее 80% правильных ответов
Первую часть читал, контекст уловил.
Пытаюсь донести идею - не усложнять, если есть возможность.
У крупных компаний такая возможность есть - ChatGPT Enterprise (https://openai.com/blog/introducing-chatgpt-enterprise), и некоторые известные мне компании в процессе прохождения InfoSec (занимает время).
У мелких (стартапов) - тоже. О чем и написал, как о личном опыте.
Насчет российских компаний - все верно, блокировка, но обходные пути существуют и ими пользуются.
Понял. Я все же думаю Европейские компании будут стараться гайки прикручивать тоже. Тут даже дело не в цене или доступе. А в самом смысле, что если это станет core бизнеса, то быть в зависимости от кого-либо неправильно.
Как бытовое применение- да, как бизнес я бы много раз подумал.
А расскажите по какому принципу резали текст? 128 к в целом даёт большое пространство, но вот ембединги по такому размеру будут плохи кажется
А расскажите по какому принципу резали текст? 128 к в целом даёт большое пространство, но вот ембединги по такому размеру будут плохи кажется
Обычный промпт: специализация, задача, ожидаемый результат, пример результата.
Хорошо что с этим промптом филонить перестал. А дальше - нарезка по section_start.
Только пришлось повозиться с настройкой.
You are a semantic text analyzer: a specialized tool designed to interpret and understand the meaning of text in a document.
Your primary role involves processing written content to discern its underlying structure, context, and intent.
You excel in analyzing the semantics, or the meaning conveyed by the text, rather than just focusing on the words themselves.
As a semantic text analyzer, your tasks include:
-- Identifying Key Themes and Concepts: You detect and highlight the main ideas and themes present in the text, which helps in understanding the overall message or purpose of the document.
-- Extracting and Structuring Information: You extract relevant information and organize it into a structured format, like identifying headings, subheadings, and categorizing content into a hierarchical structure for easier comprehension.
-- Summarizing and Paraphrasing Content: You can generate concise summaries or paraphrases of large text segments, capturing the essence of the content while maintaining its original meaning.
User provides a document text.
You perform semantic text analysis and identify hierarchical document structure.
Provide a structured breakdown of the document, focusing on the semantic meaning of each section.
The analysis should include:
-- Sequential numbering for each section and subsection (e.g., 1, 1.1, 1.2, 2, 3.1, 3.1.1, 4, etc.).
-- The semantic meaning or summary of each section.
-- A specific substring or phrase that clearly marks the beginning of each section in the document.
The Document Analysis Response should be in JSON format.
Example of Document Analysis Response (as JSON):
-------------
{
"document_structure": [
{
"section_number": "1",
"section_meaning": "Introduction to the Topic",
"section_start": "In this paper, we explore"
},
{
"section_number": "1.1",
"section_meaning": "Background Information",
"section_start": "The concept of X has its roots in"
},
{
"section_number": "1.2",
"section_meaning": "Purpose of the Study",
"section_start": "This study aims to"
},
{
"section_number": "2",
"section_meaning": "Literature Review",
"section_start": "A review of the relevant literature"
},
{
"section_number": "3.1",
"section_meaning": "Methodology Overview",
"section_start": "The methodology employed in this research"
},
{
"section_number": "3.1.1",
"section_meaning": "Data Collection Methods",
"section_start": "Data was collected using"
},
{
"section_number": "4",
"section_meaning": "Results and Discussion",
"section_start": "The results of the study indicate"
}
]
}
-------------
Пример результата:
{
"document_structure": [
{
"section_number": "1",
"section_meaning": "Introduction to the Official Interpretations",
"section_start": "Introduction"
},
{
"section_number": "1.1",
"section_meaning": "Official status of the commentary",
"section_start": "1. Official status."
},
{
"section_number": "2",
"section_meaning": "Authority, purpose, coverage, and effect on state laws",
"section_start": "Section 1030.1 Authority, purpose, coverage, and effect on state laws"
},
{
"section_number": "2.1",
"section_meaning": "Coverage details and foreign applicability",
"section_start": "(c) Coverage"
},
{
"section_number": "2.1.1",
"section_meaning": "Foreign applicability specifics",
"section_start": "1. Foreign applicability."
},
{
"section_number": "2.1.2",
"section_meaning": "Persons who advertise accounts",
"section_start": "2. Persons who advertise accounts."
},
{
"section_number": "3",
"section_meaning": "Definitions and their interpretations",
"section_start": "Section 1030.2 Definitions"
},
{
"section_number": "3.1",
"section_meaning": "Definition and examples of 'Account'",
"section_start": "(a) Account"
},
{
"section_number": "3.1.1",
"section_meaning": "Covered accounts examples",
"section_start": "1. Covered accounts."
},
{
"section_number": "3.1.2",
"section_meaning": "Examples of accounts not subject to the regulation",
"section_start": "2. Other accounts."
},
{
"section_number": "3.1.3",
"section_meaning": "Other investments not considered as 'account'",
"section_start": "3. Other investments."
},
{
"section_number": "3.2",
"section_meaning": "Definition and examples of 'Advertisement'",
"section_start": "(b) Advertisement"
},
{
"section_number": "3.2.1",
"section_meaning": "Covered messages in advertisements",
"section_start": "1. Covered messages."
},
{
"section_number": "3.2.2",
"section_meaning": "Examples of messages that are not advertisements",
"section_start": "2. Other messages."
},
{
"section_number": "3.3",
"section_meaning": "Definition and examples of 'Bonus'",
"section_start": "(f) Bonus."
},
{
"section_number": "3.3.1",
"section_meaning": "Examples of bonuses",
"section_start": "1. Examples."
},
{
"section_number": "3.3.2",
"section_meaning": "De minimis rule for bonuses",
"section_start": "2. De minimis rule."
},
{
"section_number": "3.3.3",
"section_meaning": "Aggregation of items for bonus determination",
"section_start": "3. Aggregation."
},
{
"section_number": "3.4",
"section_meaning": "Definition and examples of 'Consumer'",
"section_start": "(h) Consumer"
},
{
"section_number": "3.5",
"section_meaning": "Definition of 'Depository institution and institution'",
"section_start": "(j) Depository institution and institution"
},
{
"section_number": "3.6",
"section_meaning": "Definition of 'Deposit broker'",
"section_start": "(k) Deposit broker"
},
{
"section_number": "3.7",
"section_meaning": "Definition and relation of 'Interest' to bonuses",
"section_start": "(n) Interest"
},
{
"section_number": "3.8",
"section_meaning": "Definition and relation to Regulation E for 'Passbook savings account'",
"section_start": "(p) Passbook savings account"
},
{
"section_number": "3.9",
"section_meaning": "Definition and examples of 'Periodic statement'",
"section_start": "(q) Periodic statement"
},
{
"section_number": "3.10",
"section_meaning": "Definition and examples of 'Tiered-rate account'",
"section_start": "(t) Tiered-rate account"
},
{
"section_number": "3.11",
"section_meaning": "Definition and specifics of 'Time account'",
"section_start": "(u) Time account"
},
{
"section_number": "3.12",
"section_meaning": "Definition of 'Variable-rate account'",
"section_start": "(v) Variable-rate account"
},
{
"section_number": "4",
"section_meaning": "General disclosure requirements",
"section_start": "Section 1030.3 General disclosure requirements"
},
{
"section_number": "4.1",
"section_meaning": "Form and design requirements for disclosures",
"section_start": "(a) Form"
},
{
"section_number": "4.2",
"section_meaning": "General rules for disclosures",
"section_start": "(b) General"
},
{
"section_number": "4.3",
"section_meaning": "Relation to Regulation E for disclosures",
"section_start": "(c) Relation to Regulation E"
},
{
"section_number": "4.4",
"section_meaning": "Oral response to inquiries",
"section_start": "(e) Oral response to inquiries"
},
{
"section_number": "4.5",
"section_meaning": "Rounding and accuracy rules for rates and yields",
"section_start": "(f) Rounding and accuracy rules for rates and yields"
},
{
"section_number": "5",
"section_meaning": "Account disclosures",
"section_start": "Section 1030.4 Account disclosures"
},
{
"section_number": "5.1",
"section_meaning": "Delivery of account disclosures",
"section_start": "(a) Delivery of account disclosures"
},
{
"section_number": "5.2",
"section_meaning": "Content of account disclosures",
"section_start": "(b) Content of account disclosures."
},
{
"section_number": "6",
"section_meaning": "Subsequent disclosures",
"section_start": "Section 1030.5 Subsequent disclosures"
},
{
"section_number": "6.1",
"section_meaning": "Change in terms and advance notice requirements",
"section_start": "(a) Change in terms"
},
{
"section_number": "6.2",
"section_meaning": "Notice before maturity for time accounts",
"section_start": "(b) Notice before maturity for time accounts longer than one month that renew automatically."
},
{
"section_number": "6.3",
"section_meaning": "Notice before maturity for time accounts longer than one year that do not renew automatically",
"section_start": "(c) Notice before maturity for time accounts longer than one year that do not renew automatically."
},
{
"section_number": "7",
"section_meaning": "Periodic statement disclosures",
"section_start": "Section 1030.6 Periodic statement disclosures"
},
{
"section_number": "7.1",
"section_meaning": "General rules for periodic statements",
"section_start": "(a) General rule"
},
{
"section_number": "7.2",
"section_meaning": "Special rule for average daily balance method",
"section_start": "(b) Special rule for average daily balance method"
},
{
"section_number": "8",
"section_meaning": "Payment of interest",
"section_start": "Section 1030.7 Payment of interest"
},
{
"section_number": "8.1",
"section_meaning": "Permissible methods for payment of interest",
"section_start": "(a)(1) Permissible methods"
},
{
"section_number": "8.2",
"section_meaning": "Determination of minimum balance to earn interest",
"section_start": "(a)(2) Determination of minimum balance to earn interest"
},
{
"section_number": "8.3",
"section_meaning": "Compounding and crediting policies",
"section_start": "(b) Compounding and crediting policies"
},
{
"section_number": "8.4",
"section_meaning": "Date interest begins to accrue",
"section_start": "(c) Date interest begins to accrue"
},
{
"section_number": "9",
"section_meaning": "Advertising",
"section_start": "Section 1030.8 Advertising"
},
{
"section_number": "9.1",
"section_meaning": "Misleading or inaccurate advertisements",
"section_start": "(a) Misleading or inaccurate advertisements"
},
{
"section_number": "9.2",
"section_meaning": "Permissible rates in advertising",
"section_start": "(b) Permissible rates."
},
{
"section_number": "9.3",
"section_meaning": "Additional disclosures required in advertising",
"section_start": "(c) When additional disclosures are required"
},
{
"section_number": "9.4",
"section_meaning": "Advertising bonuses",
"section_start": "(d) Bonuses"
},
{
"section_number": "9.5",
"section_meaning": "Exemption for certain advertisements",
"section_start": "(e) Exemption for certain advertisements."
},
{
"section_number": "10",
"section_meaning": "Enforcement and Record Retention",
"section_start": "Section 1030.9—Enforcement and Record Retention"
},
{
"section_number": "10.1",
"section_meaning": "Record retention requirements",
"section_start": "(c) Record retention."
},
{
"section_number": "11",
"section_meaning": "Additional Disclosures Regarding the Payment of Overdrafts",
"section_start": "Section 1030.11—Additional Disclosures Regarding the Payment of Overdrafts"
},
{
"section_number": "11.1",
"section_meaning": "Disclosure of total fees on periodic statements",
"section_start": "(a) Disclosure of total fees on periodic statements."
},
{
"section_number": "11.2",
"section_meaning": "Advertising disclosures for overdraft services",
"section_start": "(b) Advertising disclosures for overdraft services."
},
{
"section_number": "11.3",
"section_meaning": "Disclosure of account balances",
"section_start": "(c) Disclosure of account balances."
}
]
}
Очень интересно мне как юристу, но непонятно как программисту. Но это мои проблемы: последний раз я писал программу на бейсике ещё на спектруме. А квадратичные отклонения я помню (что есть такое) из курса правовой статистики, лет 27 назад, что сдал и забыл. В любом случае прошу автора не забрасывать тему, Legaltech наше будущее.
На Хабре не просто найти баланс.
Но в части Legaltech, я бы сказал, что будущее все таки за машиночитаемыми договорами. Или базовые договора+ точечные машиночитаемые изменения.
Но это далёкая история.
Сейчас кажется, что графовое представление знаний все таки не умирает с появлением llm. Больших языковых моделей.
И тему я буду копать дальше. Обязательно.
Какие вообще критерии допустимости? Кажется, что рассматривать что-то с правильным ответом менее 98% - не серьёзно. А до этого, на первый взгляд, ещё фантастически далеко.
98% нет и у человека. В ходе обсуждения проекта мы иногда спорили, что является правильным ответом, а один из ответов был неожиданным для одного из коллег. Он не знал.
Поэтому более правильно сейчас кажется научить определять сложные и простые вопросы и в случае сложных делать пометку "данные не точные, хотите запросить консультацию?". А простые довести до уровня 100%.
Правильно же понимаю, что это сравнение моделей без дообучения для задачи, стоковые модели?
Если да, то есть в планах дообучить?
В целом да. Если конечно не считать, что Сайга это тоже дообученная Llama
Дообучение в работе, но пока без результатов. Есть сложности с промтом обучения и галлюцинациями. Но сделаем.
Как оказалось в большей степени узкое горлышко- это токенайзер и чанки , а не модель.
Есть сложности с промтом обучения и галлюцинациями.
А что вы считаете галлюцинациями? По моим прикидкам их куча разновидностей, некоторые можно подтюнить настройками генерации, другие лучше исправлять фильтрацией и расширением обучающих данных.
Ещё интересно не упрётись ли вы в высокую долю копипасты в попытках уменьшить галлюцинации.
Пробовали обучать reward на людских оценках ответов от юристов?
Есть какие то метрики которые используете для оценки модели перед ручными разметками?
Дмитрий, узкое место сама технология :).
в RAG по сути ответ на 80% должен давать токенизатор и разбиение, а оставшиеся 20% - уже LLM просто подобранный ответ оформляет/суммаризует. Если промпт плохой, то и ответ будет плохим. У Василия (vagon333) хорошо получилось, потому что разбиение делала мощная модель - по сути она все сделала на этапе предобработки документов.
Кстати, а почему не попробовать локальную openLLM "попросить" разбить текст по какому то критерию, как сделал Василий (vagon333) с openAI?
Еще одна проблема в вашей конкретной идее - в них в любом случае нельзя быть уверенными и нельзя использовать с коммерческой деятельности (риск то может быть огромным - скажем модель ошибется со сроками ответа на исковое заявление).
Спасибо за труд и за оформление статьи! ?
Вывод абсолютно верный и он подтвердился экспериментом.
Но я бы не стал списывать этот подход:
1) графовые данные, классический поиск и прочее могут помочь с лучшим фокусом
2) ручная или получручная разбивка может помочь.
3) правильная встройка в бизнес процесс - ключевой навык. Но это путь. На первом этапе запрещаем например любые ответы, кроме определений. Потом даем предварительный ответ с пометкой "не точно. И т.д.
Дмитрий, с прошлой недели (на выходных был на базе отдыха, но просидел в номере ;). даже на вечернее шоу с ноутом пошел) пытаюсь реализовать простую в принципе задачу. Векторизую КоАП на RAG. Почему КоАП? потому что я могу сам проверить корректность ответа.
В общем, я конечно совсем не специалист, но мне кажется, надо не "векторно" искать контекст в базе, а по словам.
Пример "Вопрос: Что грозит за оставление месте ДТП". И даже в таком вопросе, где явно есть слова-подсказки, разные версии BERT плохо находят конкретную статью кодекса по вектору. А вот "оставление" уже явно даст нужные статьи.
Но если нашли, то даже IlyaGusev/saiga_mistral_7b_gguf отлично справляется с ответами - это я проверил.
Т.е. я хочу сказать, что по моему мнению, вот так напрямую задачу поиска по базе юридической информации с помощью BERT решить не получится.
Буду дальше искать нормальный "контекстный поисковик". Скорее всего нахождение информации в базе по конктексу давно решеная задача (типа Elasticsearch).
Так задачи разные -- elasticsearch для вас найдет все вхождения и выдаст ссылки на параграфы, вам придется проанализировать их и сделать вывод.
А тут задумка, чтоб все это модель сделала (ну с RAG помощью) и сразу дала ответ. Что пока выглядит довольно сложным.
Соглашусь и в целом Я бы разделил задачи. Фокусировка на кусках и подготовка ответа. Подготовка - это llm модель. Тут пока без вариантов. И в целом даже локальная работать.
А вот как обеспечить RAG - дело исследовательское. Я делал почти в лоб. Получилось средне. Через косиносное сравнение.
Можно попробовать и нужно через эластик или через локальный поисковик или онтологии и т.д.. Или ручная разметка.
Поэтому некорректно сравнивать "вектор" как инструмент с типом поиска, как методологию. Разные сущности. В конечном итоге поисковик использует тоже вектора в т.ч.
Нужен гибридный поиск, и векторная база и обычный поисковик bm25 - но потом нужно ранжировать результаты, чтобы понять какой же из них дал более правильные результаты
Наверняка глупый вопрос новичка, но в обоих частях не нашел ответа на него: а как можно даже для внутреннего использования начать использовать модель, которая ошибается даже хотя бы в 5% случаев? Особенно, если речь о юридических тематиках. Другими словами, что происходит такого, чтобы качество работы использующих эти ошибочные ответы не падало?
Если в лоб, то:
1) руками разбить на куски, каждый из которых был законченный. Если список чего-то, то тогда весь список - один кусок.
2) Подключить gpt4 turbo с контекстом 128к
3) все что не вошло в п. 1 запретить использовать на уровне админ правил и может быть промтпом, если нельзя никак сократить.
При таком подходе думаю можно добиться 90+ процентов.
Сложности начинаются, когда Вы захотите перенести все в закрытый контур.
Как пример -- юрист тратит на договор на 50 тыс. и за 500 тыс. примерно одинаковое кол-во времени. Все, что условно до 50 тыс. можно передать модели, если модель будет сомневаться, то отправить на допроверку. Для ряда компаний так можно освободить пару ставок ))
По сути оптимизация за счет управления рисками.
По мне еще куча вариантов для улучшения:
1. с ручная нарезка;
2. применение kNN few-shot (если я верно запомнил) когда сразу готовятся пары вопрос-ответ. И, кстати, можно модель заставить задавать вопросы по тексту.
3. Прямое "дообучение" -- реальные ответы живых юристов, которые потом пойдут в п. 2.
1) сейчас делаем. Возможно сделаю часть. 3
2-3) уже есть. Большой датасет для обучения, но не взлетает пока. Ищем причину.
Посмотрите в сторону нашей библиотеки ExplainitAll
ExplainitAll — это библиотека для интерпретируемого ИИ, предназначенная для интерпретации генеративных моделей ( GPT-like), и векторизаторов, например, Sbert. Библиотека предоставляет пользователям инструменты для анализа и понимания работы этих сложных моделей. Кроме того, содержит модули RAG QA, fast_tuning и пользовательский интерфейс.
Мы сделали там чекер галлюцинаций. Плюс либу можно использовать как компонент RAG систем для оценки доверия ответу и чтобы система отказывалась давать ответ, если вопрос некорректен или ответа в тексте нет.
Вариантов улучшений масса - например мы провели много экспериментов по построению структуры текста, для того, чтобы на разных уровнях абстракции улавливать связи (документ, главы, разделы, абзацы, предложения) - это похоже на knowledge graph, только у нас он фрактальный из-за самоподобия, поэтому назвали Fractal answer synthesis.
Вообще в целом проблема глобальная - вариантов RAG систем сейчас если погуглить будет штук 15, с разными параметрами настроек под разные доменные области. Найти оптимальный вариант - это проводить десятки экспериментов и учить модели. А еще адаптировать поиск, тк по нашим наблюдениям более 70% качества это не LLM а эмбеддинги, поэтому глобально даже дорогущая GPT4 не поможет.
Один из вариантов - применять Ai агентов с многоагентной системой, чтобы агенты сами собирались оптимально под задачу.
Большой тест GPT4, GPT3.5, YandexGPT, GigaChat, Saiga в RAG-задаче. Часть 2/2