# 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] + '...')