クエリ翻訳



この記事は、txtai、AI動力セマンティック検索プラットフォームのチュートリアルシリーズの一部です.
txtaiは、データを変換して、AIで動く意味の検索アプリケーションを構築するために機械学習ワークフローを実行します.
Txtaiクエリの2つの主要な種類をサポートしています:自然言語ステートメントとSQLステートメント.自然言語クエリはクエリのような検索エンジンを扱います.SQL文は、より複雑なフィルタリング、ソート、列選択を可能にします.クエリ翻訳は、2つの間のギャップをブリッジし、自然言語クエリのフィルタリングを有効にします.
たとえば、クエリ
Tell me a feel good story since yesterday
なる
select * from txtai where similar("Tell me a feel good story") and
entry >= date('now', '-1 day')

依存関係のインストール

txtaiとすべての依存関係をインストールします.
pip install txtai[pipeline]

インデックス作成


まずインデックスを作成する方法を要約しましょう.我々は古典的なtxtaiの例を使用します.
from txtai.embeddings import Embeddings

data = ["US tops 5 million confirmed virus cases",
        "Canada's last fully intact ice shelf has suddenly collapsed, forming a Manhattan-sized iceberg",
        "Beijing mobilises invasion craft along coast as Taiwan tensions escalate",
        "The National Park Service warns against sacrificing slower friends in a bear attack",
        "Maine man wins $1M from $25 lottery ticket",
        "Make huge profits without work, earn up to $100,000 a day"]

# Create embeddings index with content enabled. The default behavior is to only store indexed vectors.
embeddings = Embeddings({"path": "sentence-transformers/nli-mpnet-base-v2", "content": True})

# Create an index for the list of text
embeddings.index([(uid, text, None) for uid, text in enumerate(data)])

# Run a search
embeddings.search("feel good story", 1)
[{'id': '4',
  'score': 0.08329011499881744,
  'text': 'Maine man wins $1M from $25 lottery ticket'}]

クエリ翻訳モデル


次に、クエリの翻訳モデルがどのように動作するかを調べます.
from txtai.pipeline import Sequences

sequences = Sequences("NeuML/t5-small-txtsql")

queries = [
  "feel good story",
  "feel good story since yesterday",
  "feel good story with lottery in text",
  "how many feel good story",
  "feel good story translated to fr",
  "feel good story summarized"
]

# Prefix to pass to T5 model
prefix = "translate English to SQL: "

for query in queries:
  print(f"Input: {query}")
  print(f"SQL: {sequences(query, prefix)}")
  print()
Input: feel good story
SQL: select id, text, score from txtai where similar('feel good story')

Input: feel good story since yesterday
SQL: select id, text, score from txtai where similar('feel good story') and entry >= date('now', '-1 day')

Input: feel good story with lottery in text
SQL: select id, text, score from txtai where similar('feel good story') and text like '% lottery%'

Input: how many feel good story
SQL: select count(*) from txtai where similar('feel good story')

Input: feel good story translated to fr
SQL: select id, translate(text, 'fr') text, score from txtai where similar('feel good story')

Input: feel good story summarized
SQL: select id, summary(text) text, score from txtai where similar('feel good story')
上記のクエリ翻訳を見ると、このモデルがどのように動作するかについての考えがあります.
t5-small-txtsqlはデフォルトモデルです.カスタムドメインクエリ構文言語は、他の言語を含むこの同じ方法論を使用して作成できます.自然言語は、関数、クエリ節、列の選択などに翻訳することができます!

自然言語フィルタリング


今では、この行動のための時間です!まず、適切な設定で埋め込みインデックスを初期化しましょう.
from txtai.pipeline import Translation

def translate(text, lang):
  return translation(text, lang)

translation = Translation()

# Create embeddings index with content enabled. The default behavior is to only store indexed vectors.
embeddings = Embeddings({"path": "sentence-transformers/nli-mpnet-base-v2",
                         "content": True,
                         "query": {"path": "NeuML/t5-small-txtsql"},
                         "functions": [translate]})

# Create an index for the list of text
embeddings.index([(uid, text, None) for uid, text in enumerate(data)])

query = "select id, score, translate(text, 'de') 'text' from txtai where similar('feel good story')"

# Run a search using a custom SQL function
embeddings.search(query)[0]
{'id': '4',
 'score': 0.08329011499881744,
 'text': 'Maine Mann gewinnt $1M von $25 Lotterie-Ticket'}
クエリモデルが埋め込みインデックス設定パラメータとしてどのように提供されたかに注意してください.カスタムSQL関数も追加されました.自然言語クエリで同じSQL文を実行できるかどうかを確認しましょう.
embeddings.search("feel good story translated to de")[0]
{'id': '4',
 'score': 0.08329011499881744,
 'text': 'Maine Mann gewinnt $1M von $25 Lotterie-Ticket'}
同じ結果.もう少し試してみましょう.
embeddings.search("feel good story since yesterday")[0]
{'id': '4',
 'score': 0.08329011499881744,
 'text': 'Maine man wins $1M from $25 lottery ticket'}
embeddings.search("feel good story with lottery in text")[0]
{'id': '4',
 'score': 0.08329011499881744,
 'text': 'Maine man wins $1M from $25 lottery ticket'}
良い測定のために、カップルは、結果を全く返さないフィルタで質問します.
embeddings.search("feel good story with missing in text")
[]
embeddings.search("feel good story with field equal 14")
[]

アプリケーションによるクエリ翻訳


もちろん、これはすべてYamlの設定されたアプリケーションで利用可能です.
config = """
translation:

writable: true
embeddings:
  path: sentence-transformers/nli-mpnet-base-v2
  content: true
  query:
    path: NeuML/t5-small-txtsql
  functions:
    - {name: translate, argcount: 2, function: translation}
"""

from txtai.app import Application

# Build application and index data
app = Application(config)
app.add([{"id": x, "text": row} for x, row in enumerate(data)])
app.index()

# Run search query
app.search("feel good story translated to de")[0]
{'id': '4',
 'score': 0.08329011499881744,
 'text': 'Maine Mann gewinnt $1M von $25 Lotterie-Ticket'}

ラッピング


本稿は,自然言語のフィルタリングモデルを用いたフィルタリングを行う.この強力な機能は、自然言語文にフィルタリングとパイプラインを追加します.カスタムドメイン固有のクエリ言語は、Txtaiでネイティブのリッチクエリを有効にするために作成することができます.