# LangChain

# はじめに

大規模言語モデル(LLM)は、開発者が以前は不可能だった強力なアプリケーションを作成できるようにすることで、人工知能の分野を革新しています。しかし、LLM単体ではアプリケーションの全ポテンシャルを引き出すことはできません。実際の力は、他の計算や知識のソースと組み合わせることができるときに発揮されます。LangChainは、開発者がこのようなアプリケーションを構築するのを支援するために設計されています。

LangChainの詳細については、LangChainドキュメントウェブサイト (opens new window)を参照してください。

# 前提条件

始める前に、langchain (opens new window)clickhouse python client (opens new window)をインストールする必要があります。

pip install -U langchain clickhouse-connect

# 環境のセットアップ

OpenAIの埋め込みモデルを使用するためには、OpenAI (opens new window)でOpenAI APIキーを登録する必要があります。また、MyScaleコンソールのクラスターホスト、ユーザー名、パスワード情報を取得する必要もあります(接続の詳細)。

次のコマンドを実行して環境変数を設定します:

export MYSCALE_HOST="YOUR_CLUSTER_HOST"
export MYSCALE_PORT=443
export MYSCALE_USERNAME="YOUR_USERNAME"
export MYSCALE_PASSWORD="YOUR_CLUSTER_PASSWORD"
export OPENAI_API_KEY="YOUR_OPENAI_API_KEY"

# データの読み込みとインデックスの構築

OpenAIEmbeddingモデルを使用して、入力テキストファイルから埋め込みベクトルを抽出します:

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import TextLoader
loader = TextLoader("YOUR_PATH_TO_FILE")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
for d in docs:
    d.metadata = {"some": "metadata"}

次に、データをMyScaleクラスターにアップロードします。インデックスが存在しない場合は作成され、既に存在する場合は再利用されます。MyScaleインデックスの設定については、MyScaleSettings (opens new window)を参照してください。

from langchain.vectorstores import MyScale
docsearch = MyScale.from_documents(docs, embeddings)

# MyScaleのクエリ

# 類似性検索

類似性検索に基づいてクエリを行うことができます:

query = "YOUR_QUESTION"
docs = docsearch.similarity_search(query)
print(docs[0].page_content)

# フィルタリングされた検索

myscaleのSQL where文に直接アクセスすることができます。標準のSQLに従ってWHERE句を記述することができます。

注意: SQLインジェクションに注意してください。このインターフェースはエンドユーザーに直接呼び出されるべきではありません。

設定でcolumn_mapをカスタマイズした場合、次のようにフィルタを使用して検索することができます:

meta = docsearch.metadata_column
output = docsearch.similarity_search_with_relevance_scores(
  "YOUR_QUESTION", k=4, where_str=f"{meta}.doc_id<10")
for d, dist in output:
    print(dist, d.metadata, d.page_content[:20] + '...')