Интеграция семантического слоя DBT в LLM
Я работаю над приложением на Django, в котором хочу реализовать возможность запросов на естественном языке с использованием языковой модели OpenAI (LLM), например GPT-3. Для структурирования и упрощения доступа к базе данных я планирую использовать семантический слой DBT (Data Build Tool).
Моя цель - позволить пользователям задавать вопросы на естественном языке, которые затем транслируются в SQL-запросы через LLM, используя семантические определения, предоставляемые DBT. В идеале эта система должна поддерживать сложные запросы к нескольким таблицам, используя связи и измерения, определенные в семантическом слое.
Вот краткое описание установки:
1. Django Application: Serves the frontend and backend, managing user requests.
2. DBT Semantic Layer: Defines the data models, metrics, and relationships.
3. OpenAI LLM (e.g., GPT-3): Used for interpreting natural language inputs and generating SQL queries.
4. PostgreSQL Database: The source of data queried and managed via DBT.
Конкретные вопросы:
1. How should I integrate the DBT semantic layer within the Django app? Should the semantic layer be exposed via an API, or is there a more integrated approach?
2. What are the best practices for using an LLM to generate SQL queries from natural language, especially using the constructs defined in the DBT models? How can I ensure that the queries generated are efficient and secure?
3. Are there any existing libraries or frameworks that facilitate the integration of LLMs with DBT or similar semantic layers? If not, what should be the focus while building this integration?
Любые рекомендации, примеры или ресурсы будут высоко оценены! Мне особенно интересно узнать о похожем опыте или проблемах, с которыми сталкивались при такой интеграции.
Спасибо!
Я попробовал создать семантические модели
aggreement.sql
select
Agreement_Type_Code,
Agreement_Name,
Agreement_Original_Inception_Date,
Product_Identifier
from
dbt_cdw_benchmark__seed.agreement
agreement.yaml
semantic_models:
- name: agreement
model: ref('agreement')
entities:
- name: agreement_type_code
type: primary
- name: product_identifier
type: foreign
dimensions:
- name: agreement_name
type: categorical
- name: agreement_original_inception_date
type: time
type_params:
time_granularity: day
В идеале, вы должны изолировать DBT (слой трансформации), настройку GPT3 и приложение Django и держать их отдельно.
DBT (Трансформационный слой)
Здесь мы можем управлять чтением исходных данных, выполнять преобразования и вычислять метрики.
Он будет планироваться отдельно для выполнения заданного расписания. или может быть запущен при необходимости.
GPT3
Чтобы настроить GPT-3 на конкретный набор данных, необходимо провести тонкую настройку модели. Тонкая настройка включает в себя обучение модели на наборе данных, адаптированном к вашему случаю использования, что помогает модели изучить конкретные шаблоны и реакции, соответствующие вашим потребностям.
Шаги:
pip install openai
Получите ключ API OPENAI
Подготовьте набор данных: Ваш набор данных должен быть в формате JSONL, где каждая строка - это объект JSON с полями "prompt" и "completion".
{"prompt": "Customer: I recently purchased a product from your website, but it arrived damaged. What should I do?\nAgent:", "completion": " I'm sorry to hear that. Please send us a picture of the damaged product, and we'll arrange for a replacement or refund."} {"prompt": "Customer: Can I return a product I bought last month?\nAgent:", "completion": " Yes, you can return it within 30 days of purchase. Please visit our return portal to start the process."}
Используйте API OpenAI для загрузки вашего набора данных.
import openai openai.api_key = 'your-api-key' # Upload the dataset response = openai.File.create( file=open("dataset.jsonl"), purpose='fine-tune' ) file_id = response['id'] print(f"Uploaded file ID: {file_id}")
После загрузки набора данных вы можете начать процесс тонкой настройки.
response = openai.FineTune.create( training_file=file_id, model="davinci" # or another model you want to fine-tune ) fine_tune_id = response['id'] print(f"Fine-tune ID: {fine_tune_id}")
После завершения тонкой настройки вы можете использовать настроенную модель для генерации ответов.
def get_custom_response(prompt): response = openai.Completion.create( model="davinci:ft-your-custom-model-id", prompt=prompt, max_tokens=150, temperature=0.7 ) return response.choices[0].text.strip() # Example usage prompt = "Customer: I recently purchased a product from your website, but it arrived damaged. What should I do?\nAgent:" response = get_custom_response(prompt) print(response)
Django App
Это должен быть только запрос на тонкую настройку модели gpt3 для генерации ответов на основе подсказок пользователя.
DBT - это инструмент, который инженеры по обработке данных используют для упрощения
- Обеспечение качества данных (тестирование и свежесть)
- Документирование конвейеров данных
- Обеспечение согласованности данных
- Повторное использование наборов данных .
В нашем случае нам не нужны все эти функции, нам нужны только
.
Документированные определения данных в YAML-моделях.
Для этого вместо использования DBT вы можете хранить эти данные в простом YAML-файле, как мы храним их в DBT. Это поможет вам легко интегрироваться с семантической моделью.
Генерация запроса из текста на естественном языке более эффективна при использовании GenSQL. Выбор GenSQL вместо OpenAI API предпочтительнее, поскольку генеративные модели ИИ хорошо работают, когда оба входных данных являются текстом. Например, если у вас есть текстовые данные и вопрос на основе текста, генеративный ИИ будет идеальным подходом.
но здесь ваш вопрос текстовый, а данные в табличном формате.
Недавно исследователь из Массачусетского технологического института опубликовал работу на эту тему
https://dl.acm.org/doi/10.1145/3656409
Здесь используется генеративная вероятностная модель для запроса данных.
Вы можете работать над этим дальше.
И последнее, что касается части Django, после того как мы имеем входной текст, преобразованный в SQL с помощью GENSQL, мы можем генерировать запросы в одном модуле, а в другом получать структурированные результаты и представлять их в виде контекстных графиков с plotly и dash.
Существует рабочая модель с такой функциональностью, основанная на RAG: https://github.com/vanna-ai/vanna