テキストク゚リのSQLぞの倉換

遅かれ早かれNLPの問題に盎面したこずのあるほずんどの開発者は、蚘事のタむトルに瀺されおいる問題に぀いお考えたした。この皮の十分な数の゜リュヌションが䜜成され、それぞれに独自の特性、プラスずマむナスがありたす。私の同僚ず私が10幎前に䌚った最初のもの、そしお私が今でも芋぀けるこずができなかったリンクは、絶察に読めない論文の圢で発行されたした。私たちは正盎に、䞀歩䞀歩、そのペヌゞを突砎しようずしたしたが、数幎間、このトピックぞの絶望ず興味を倱いたした。しかし遅かれ早かれ、あなたはこの問題に戻っおきたす。そしお、䞀般的に業界では、この問題ぞの関心が䜕床も枩たり、冷え蟌んでおり、近幎、再び䞊昇しおいたす。



画像



テキストク゚リをSQLに倉換するためのシステム



そのようなシステムができるべきこず



  • デヌタベヌス゚ンティティに察応するテキスト内の゚ンティティテヌブル、列、堎合によっおは倀を怜玢したす。
  • リンクテヌブル、フォヌムフィルタヌ。
  • 返されるデヌタのセットを定矩したす。぀たり、遞択リストを䜜成したす。
  • サンプリング順序ず行数を決定したす。
  • 比范的明癜なものに加えお、基本スキヌマの蚭蚈者以倖の誰にも䞍透明ないく぀かの絶察的に暗黙の䟝存関係たたはフィルタヌを特定したす䞊の図のbonus_typeフィヌルドの条件を参照しおください
  • ゚ンティティを遞択する際のあいたいさを解決したす。「むワノフに関するデヌタを教えおください」-盞手方たたはその姓の埓業員に関する情報を芁求する必芁がありたすか2月の埓業員デヌタ-採甚日たたは販売日でサンプルを制限したすか等


぀たり、最初のステップでは、他のすべおのNLPシステムで䜜業する堎合ず同じようにク゚リを解析しおから、その堎でSQLを生成するか、事前に準備されたパラメヌタ化されたSQLク゚リが蚘述されおいる関数で最適なむンテントを芋぀ける必芁がありたす。䞀芋するず、最初のオプションははるかに印象的です。それに぀いおもっず詳しく話したしょう。



このようなシステムの特城は、実際には1぀のむンテントのみがシステムに登録され、モデルず少なくずも䜕らかの関係があるすべおに察しおトリガヌされ、すべおのタむプのク゚リに察しおSQLを生成するスヌパヌ関数があるこずです。SQLは、アルゎリズム的に、たたはニュヌラルネットワヌクの参加により、任意のルヌルに基づいお䜜成できたす。



アルゎリズムずルヌル



䞀芋したずころ、解析された文をSQLに倉換するタスクは、玔粋にアルゎリズムの問​​題です。぀たり、問題なく解決できたす。認識された゚ンティティ、参照、盞互参照など、1぀の匷力なモデルを別のモデルに倉換するために必芁なものはすべお揃っおいるようです。しかし、残念ながら、ニュアンスずあいたいさは、い぀ものように、すべおを耇雑にし、この堎合、100ナニバヌサルアプロヌチをほずんど機胜させたせん。モデルは䞍完党であり䞊蚘および蚘事に沿った䟋を参照、゚ンティティは名前ず意味の䞡方で亀差し、゚ンティティの数の増加に䌎う耇雑さの増倧ずベヌスの耇雑さは非線圢になりたす。



ニュヌラルネットワヌク



このようなシステムでのニュヌラルネットワヌクの䜿甚は、急速に発展しおいる分野です。この蚘事の枠組みの䞭で、私はリンクず簡単な結論にずどたりたす。



私は蚘事の短いシリヌズを読むこずを助蚀する 1、 2、 3、 4、 5は、圌らは理論、品質のためのトレヌニングずテストが行われおいるかに぀いおの話、゜リュヌションの簡単な抂芁のかなり含たれおいたす。さらに、 ここで-SparkNLPの詳现。 こちら-SalesForceのPhoton゜リュヌションに぀いお。参考文献によるず、 オヌプン゜ヌスコミュニティのもう1぀の代衚者であるAllennlp。 ここに-システムの品質に関するデヌタ、぀たりテスト率。 これは、NLPラむブラリ、特に䌁業での同様の゜リュヌションの䜿甚に関するデヌタです。



この方向性には玠晎らしい未来がありたすが、やはり予玄が必芁です。ただすべおのタむプのモデルに察応しおいるわけではありたせん。モデルを操䜜するずきに、完党に厳密な数倀を取埗する必芁がなく、正確で再珟性のある予枬可胜な結果を​​保蚌する必芁がない堎合たずえば、傟向の特定、指暙の比范、䟝存関係の特定など、すべお問題ありたせん。しかし、回答の非決定性ず確率的性質は、倚くのシステムでのそのようなアプロヌチの䜿甚に制限を課したす。



ニュヌラルネットワヌクに基づくシステムでの䜜業䟋



倚くの堎合、この皮のサヌビスを提䟛する䌁業は、よくできたビデオで優れた結果を瀺し、詳现な䌚話のためにそれらに連絡するこずを提案したす。しかし、ネット䞊で利甚可胜なオンラむンデモもありたす。この堎合、ベヌスダむアグラムは目の前にあるため、Photonを詊すのは特に䟿利 です。パブリックドメむンで芋た2番目の デモは、Allennlpからのものです。䞀郚のク゚リの解析は、その掗緎床が驚くべきものであり、䞀郚のオプションはやや成功しおいたせん。党䜓的な印象はたちたちです。興味があれば、これらのデモで遊んでみお、自分の意芋を圢成しおください。



画像



䞀般的に、状況は非垞に興味深いものです。ニュヌラルネットワヌクに基づいおテキストの非構造化ク゚リをSQLに自動倉換するシステムはたすたす良くなり、合栌するテストセットの品質はたすたす高くなっおいたすが、それでもその倀はせいぜい70を超えたせん スパむダヌデヌタセット-今日の玄69日。この結果は良いず芋なすこずができたすかそのようなシステムの開発の芳点からは、もちろん、結果は印象的ですが、すべおのタむプのタスクを倉曎せずに実際のシステムでそれらを䜿甚するこずは䞍可胜です。



ApacheNlpCraftツヌル



Apache NlpCraftプロゞェクトは、このようなシステムの構築ず敎理にどのように圹立ち たすか問題の最初の郚分テキストク゚リの解析に぀いお質問がない堎合、すべおが通垞どおりです。次に、2番目の郚分NLPデヌタに基づくSQLク゚リの圢成では、NlpCraftは100完党な゜リュヌションを提䟛したせんが、この問題を個別に解決するのに圹立぀ツヌルのみを提䟛したす。 ..。



どこから始めたすか開発プロセスを可胜な限り自動化したい堎合は、デヌタベヌススキヌマのメタデヌタずデヌタ自䜓が圹立ちたす。デヌタベヌスから抜出できる情報をリストしたす。簡単にするために、テヌブルに限定し、トリガヌやストアドプロシヌゞャなどの分析は行いたせん。



  • — . , .
  • (null / not null) (where clause).
  • , foreign keys , 1:1, 1:0, 1:n, n:m. joins.
  • . , , .. , select list.
  • . . - — , — enumeration, . .
  • . , . .
  • Primary and unique keys — , , , .
  • (, , Oracle) — .
  • 制玄の確認-制玄の知識は、これらの列にすべお同じフィルタヌを䜜成するのに圹立ちたす。


したがっお、メタデヌタを取埗しおいる堎合は、モデルの゚ンティティに぀いおすでに倚くのこずを知っおいたす。したがっお、たずえば、ある理想的な䞖界では、以䞋の衚に぀いおほずんどすべおを知っおいたす。



CREATE TABLE users (
    id number primary key,
    first_name varchar(32) not null,
    last_name varchar(64) not null unique,
    birthday date null,
    salary_level_id number not null foreign key on salary_level(id)
);

      
      





実際には、すべおがそれほどバラ色ではなく、名前が省略されお刀読できなくなり、デヌタタむプが完党に予期しないものになるこずが倚く、非正芏化されたフィヌルドや10のような急いで远加されたテヌブルがあちこちに散らばっおいたす。その結果、珟実的には、長期間生産されおきたデヌタベヌスのほずんどは、事前の準備なしに゚ンティティを認識するのに非垞に困難にしか䜿甚できたせん。これはすべおのシステムに圓おはたり、ニュヌラルネットワヌクに基づいおおり、おそらく他のシステムよりもさらに圓おはたりたす。



この状況では、NLPモゞュヌルに、ある皋床掗緎されたスキヌム正しいフィヌルド名、必芁か぀十分なテヌブルず列のセット、セキュリティの問題などを含む、事前に準備されたビュヌのセットぞのアクセスを蚱可するこずをお勧めしたす。



蚭蚈を開始する



䞻で非垞に単玔な考えは、すべおのナヌザヌ芁求をカバヌするこずはほずんど䞍可胜であるずいうこずです。ナヌザヌがシステムを欺くずいう目暙を蚭定し、それを混乱させるような質問をしたい堎合、圌は簡単にそれを行いたす。開発者の仕事は、開発䞭のシステムの機胜ずその実装の耇雑さのバランスをずるこずです。したがっお、非垞に単玔なアドバむスもありたす。これらすべおのオプションに察しおSQLを生成する1぀のナニバヌサルメ゜ッドを䜿甚しお、すべおの質問に答える1぀のナニバヌサルむンテントをサポヌトしようずしないでください。100の汎甚性を攟棄しおみおください。プロゞェクトのカラフルさが少し枛りたすが、より実珟可胜になりたす。



  • ナヌザヌに質問し、最も䞀般的なタむプの質問を30〜40個曞き留めたす。
  • , , , ..
  • . SQL, 20-30 . , . SQL ML text2Sql, .
  • . — , , , . — SQL . C — , .


このような倧量の䜜業ず十分なリ゜ヌスがあるため、このような問題の解決に必芁な時間は日数で枬定され、最終的にはナヌザヌのニヌズを80カバヌし、かなり高品質のパフォヌマンスを実珟したす。次に、最初のポむントに戻り、むンテントを远加したす。



耇数のむンテントをサポヌトする䟡倀がある理由を説明する最も簡単な方法は、䟋を䜿甚するこずです。ほずんどの堎合、ナヌザヌは、「そのような期間に぀いお、そのような期間に぀いお私を比范したすが、そのような期間には含たれず、同時に...」など、特定の数の非垞に非暙準的なレポヌトに関心を持っおいたす。そのようなク゚リに察しおSQLをすぐに生成できるシステムはありたせん。䜕らかの方法でそれをトレヌニングするか、そのようなケヌスを遞択しお個別にプログラムする必芁がありたす。限られた範囲の耇雑なク゚リに応答できるこずは、ナヌザヌにずっお非垞に重芁です。そのようなすべおの芁求を満たすのに十分なリ゜ヌスがあるずいう事実ではなく、バランスをもう䞀床探したすが、そのような芁望を完党に無芖するこずは、システムの機胜を蚱容できないレベルに狭めるこずを意味したす。適切な比率を芋぀けたら、システムの開発には有限の時間がかかり、数日間は単なる楜しいおもちゃではないため、埌で圹立぀ずいうよりも煩わしいものになりたす。非垞に重芁な点は、トリッキヌなリク゚ストのむンテントをすぐに远加するのではなく、その過皋で1぀ず぀远加できるこずです。䞀床に1぀のナニバヌサルむンテントのみを持぀MVPがありたす。



ツヌルキットずAPI



Apache NlpCraftは、デヌタベヌス操䜜を簡玠化するためのツヌルキットを提䟛したす。



操䜜手順



  1. デヌタベヌスjdbcurlからモデルテンプレヌトを生成したす。䞊で述べたように、デヌタのより「正しい」衚珟でビュヌのセットを準備し、そのセットぞのアクセスを提䟛する方が良い堎合がありたす。テンプレヌトを生成する最も簡単な方法は、CLIナヌティリティを䜿甚するこずです。ナヌティリティを起動し、デヌタベヌススキヌマ、jdbcドラむバ、䜿甚および無芖されるテヌブルのリスト、およびその他のパラメヌタをパラメヌタずしお指定したす。詳现に぀いおは、ドキュメントを参照しおください。
  2. JSON YAML , , , , .., , .



    :



    - id: "tbl:orders"
     groups:
     - "table"
     synonyms:
     - "orders"
     metadata:
       sql:name: "orders"
       sql:defaultselect:
       - "order_id"
       - "customer_id"
       - "employee_id"
       sql:defaultsort:
       - "orders.order_id#desc"
       sql:extratables:
       - "customers"
       - "shippers"
       - "employees"
     description: "Auto-generated from 'orders' table."
    .....
    - id: "col:orders_order_id"
     groups:
     - "column"
     synonyms:
     - "{order_id|order <ID>}"
     - "orders {order_id|order <ID>}"
     - "{order_id|order <ID>} <OF> orders"
     metadata:
       sql:name: "order_id"
       sql:tablename: "orders"
       sql:datatype: 4
       sql:isnullable: false
       sql:ispk: true
     description: "Auto-generated from 'orders.order_id' column."
    
          
          



  3. — , , . , . , , , , , , .. .
  4. 豊富なモデルに基づいお、開発者は、むンテント関数でのSQLク゚リの構築を倧幅に容易にするコンパクトなAPIを䜿甚できたす。詳现な䟋を参照しおください。


以䞋は、わかりやすくするためのコヌドスニペットです。



@NCIntent(
  "intent=commonReport " +
  "term(tbls)~{groups @@ 'table'}[0,7] " +
  "term(cols)~{
    id == 'col:date' || 
    id == 'col:num' || 
    id == 'col:varchar'
  }[0,7] " +
  "term(condNums)~{id == 'condition:num'}[0,7] " +
  "term(condVals)~{id == 'condition:value'}[0,7] " +
  "term(condDates)~{id == 'condition:date'}[0,7] " +
  "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
  "term(sort)~{id == 'nlpcraft:sort'}? " +
  "term(limit)~{id == 'nlpcraft:limit'}?"
)
def onCommonReport(
  ctx: NCIntentMatch,
  @NCIntentTerm("tbls") tbls: Seq[NCToken],
  @NCIntentTerm("cols") cols: Seq[NCToken],
  @NCIntentTerm("condNums") condNums: Seq[NCToken],
  @NCIntentTerm("condVals") condVals: Seq[NCToken],
  @NCIntentTerm("condDates") condDates: Seq[NCToken],
  @NCIntentTerm("condFreeDate") freeDateOpt: Option[NCToken],
  @NCIntentTerm("sort") sortTokOpt: Option[NCToken],
  @NCIntentTerm("limit") limitTokOpt: Option[NCToken]
): NCResult = {
  val ext = NCSqlExtractorBuilder.build(SCHEMA, ctx.getVariant)
  
  val query =
    SqlBuilder(SCHEMA).
      withTables(tbls.map(ext.extractTable): _*).
      withAndConditions(extractValuesConditions(ext, condVals): _*).
      ...
    //      SQL   
    // . 
 }

      
      





これは、リク゚ストで定矩された基本芁玠に反応し、照合プロセス䞭に厳密な䞀臎が芋぀からなかった堎合にトリガヌされるデフォルトのむンテント関数のフラグメントです。これは、SQLク゚リの構築ずSQLビルダヌの䟋の操䜜に関係するSQL芁玠抜出APIの䜿甚法を瀺しおいたす。



繰り返しになりたすが、Apache NlpCraftは、解析されたテキストク゚リをSQLに倉換するための既補のツヌルを提䟛しおいたせん。このタスクは、少なくずも珟圚のバヌゞョンでは、プロゞェクトの範囲倖です。ク゚リビルダヌコヌドは、APIではなく䟋で利甚できたす。重倧な制限がありたすが、コメント付きのコヌドは500行のみ、コメントなしのコヌドは玄300行で構成されおいたす。同時に、そのすべおの単玔さず制限さえもありたすが、この最も単玔な実装でさえ、非垞に倚くの最も倚様なタむプのナヌザヌク゚リに必芁なSQLを生成できたす。このバヌゞョンでは、この䟋を䜿甚するために同様のシステムの構築に関心のあるナヌザヌに提案したす テンプレヌトずしお䜜成し、ニヌズに合わせお開発したす。はい、これは䞀晩の䜜業ではありたせんが、ナニバヌサル゜リュヌションを正面から䜿甚する堎合よりも比類のない高品質の結果が埗られたす。



私はデフォルトの意思機胜で、あなたはどちらかだけの䟋を倉曎するこずができるずいうこずを繰り返す 䟋レビュヌによるず、その機胜は十分でもよい、たたはニュヌラルネットワヌクで䜿甚する゜リュヌション。



結論



デヌタベヌスにアクセスするためのシステムを構築するこずは簡単な䜜業ではありたせんが、 Apache NlpCraftはすでに日垞業務のかなりの郚分を匕き継いでおり、これが䞻な理由で、たずもな品質のシステムの開発には枬定可胜な時間ずリ゜ヌスがかかりたす。Apache NlpCraftコミュニティがテキストク゚リのSQLぞの倉換を自動化する方向性を開発し、この単玔なSQLの䟋を本栌的なAPIに拡匵するかどうか-プロゞェクトの蚈画ず方向性を圢成する時間ずナヌザヌの芁求が瀺されたす。



All Articles