Интеграция семантического слоя 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 на конкретный набор данных, необходимо провести тонкую настройку модели. Тонкая настройка включает в себя обучение модели на наборе данных, адаптированном к вашему случаю использования, что помогает модели изучить конкретные шаблоны и реакции, соответствующие вашим потребностям.

Шаги:

  1. pip install openai

  2. Получите ключ API OPENAI

  3. Подготовьте набор данных: Ваш набор данных должен быть в формате 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."}
    
  4. Используйте 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}")
    
  5. После загрузки набора данных вы можете начать процесс тонкой настройки.

     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}")
    
  6. После завершения тонкой настройки вы можете использовать настроенную модель для генерации ответов.

     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 - это инструмент, который инженеры по обработке данных используют для упрощения

  1. Обеспечение качества данных (тестирование и свежесть)
  2. Документирование конвейеров данных
  3. Обеспечение согласованности данных
  4. Повторное использование наборов данных
  5. .

В нашем случае нам не нужны все эти функции, нам нужны только
. Документированные определения данных в 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

Вернуться на верх