OceanBaseはV4.3.3バージョンからベクトル型データの格納、ベクトルインデックス、そしてembeddingベクトル検索機能をサポートしています。これにより、ベクトル化したデータをOceanBaseに保存し、次の検索処理で利用できるようになります。
LangChainは、言語モデルを活用したアプリケーションを開発するためのフレームワークです。これにより、アプリケーションは以下の機能を備えることができます:
コンテキスト認識:言語モデルをコンテキストソース(ヒント指示、少量の例、応答が必要な内容など)に接続します。
推論機能:言語モデルに推論を依存させます(提供されたコンテキストに基づいてどのように回答するか、どのようなアクションを取るかなど)。
本記事では、通義千問APIを組み合わせて、OceanBase Cloudのベクトル検索機能、通義千問、およびLangChainを統合し、ドキュメント質問応答を実現する方法について紹介します。
前提条件
- 環境に利用可能なトランザクション型(MySQL)クラスタインスタンスがあります。
テナントの作成は、テナントの作成を参照して完了してください。その後、以下の手順に従って操作してください。
環境に使用可能なMySQL互換モードのテナント、MySQLデータベース、およびデータベースアカウントが既に存在し、データベースアカウントに読み書き権限が付与されていること。作成が必要な場合は、詳細についてはアカウントの作成およびデータベースの作成(MySQL専用)をご参照ください。
プロジェクト管理者またはインスタンス管理者ロールを持ち、プロジェクト内のインスタンスに対する読み書き操作を実行できること。権限がない場合は、組織管理者に連絡して権限の追加を依頼してください。
Python 3.9以降のバージョンと対応するpipをインストールしています。マシンのPythonバージョンが古い場合は、Minicondaを使用して新しいPython 3.9以降の環境を作成できます。詳細については、Minicondaインストールガイドをご参照ください。
依存関係をインストールします。
python3 -m pip install -U langchain-oceanbase python3 -m pip install langchain_community python3 -m pip install dashscope
ステップ1:データベース接続情報を取得する
ドロップダウンリストから、ID 選択してください。
**概要**ページに移動します。
接続をクリックし、**接続文字列を取得**を選択します。
ポップアップウィンドウで、**パブリックネットワークを使用**を選択します。
アクセスアドレスを取得し、**現在のブラウザIPアドレスを追加**を選択します。
データベース関連情報を入力し、**接続文字列をコピー**します。
ステップ2:LLMプラットフォームアカウントを登録する
Alibaba Cloud Bailianアカウントに登録し、モデルサービスを有効化してAPIキーを取得します。
注意
Alibaba Cloud Bailian大規模言語モデルサービスを有効化するには、第三者プラットフォームに移動して完了する必要があります。この操作は第三者プラットフォームの料金規則に従い、該当する費用が発生する可能性があります。続行する前に、その公式ウェブサイトを訪問するか関連ドキュメントを確認し、料金体系を確認して同意してください。同意しない場合は、操作を続けないでください。
API Keyを環境変数に設定します:
export DASHSCOPE_API_KEY="YOUR_DASHSCOPE_API_KEY"
ステップ3:AIアシスタントを構築する
ドキュメントの読み込みと分割
サンプルデータをダウンロードし、CharacterTextSplitterを使用して約1000文字ごとのブロックに分割します。
from langchain_community.document_loaders import TextLoader
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_oceanbase.vectorstores import OceanbaseVectorStore
import os
import requests
DASHSCOPE_API = os.environ.get("DASHSCOPE_API_KEY", "")
embeddings = DashScopeEmbeddings(
model="text-embedding-v1", dashscope_api_key=DASHSCOPE_API
)
url = "https://python.langchain.com/docs/get_started/installation"
res = requests.get(url)
with open("state_of_the_union.txt", "w") as f:
f.write(res.text)
loader = TextLoader('./state_of_the_union.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
データをOB Cloudに挿入する
connection_args = {
"host": "127.0.0.1",
"port": "2881",
"user": "root@sun",
"password": "",
"db_name": "test",
}
DEMO_TABLE_NAME = "demo_ann"
ob = OceanbaseVectorStore(
embedding_function=embeddings,
table_name=DEMO_TABLE_NAME,
connection_args=connection_args,
drop_old=True,
normalize=True,
)
res = ob.add_documents(documents=docs)
ベクトル検索
このステップでは、ドキュメントstate_of_the_union.txtから“What did the president say about Ketanji Brown Jackson”を検索する方法を示します。
query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = ob.similarity_search_with_score(query, k=3)
for doc, score in docs_with_score:
print("-" * 80)
print("Score: ", score)
print(doc.page_content)
print("-" * 80)
期待される出力は次のとおりです:
--------------------------------------------------------------------------------
Score: 1.204783671324283
Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding our elections.
Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United States Supreme Court. Justice Breyer, thank you for your service.
One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court.
And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excellence.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Score: 1.2146663629717394
It is going to transform America and put us on a path to win the economic competition of the 21st Century that we face with the rest of the world—particularly with China.
As I’ve told Xi Jinping, it is never a good bet to bet against the American people.
We’ll create good jobs for millions of Americans, modernizing roads, airports, ports, and waterways all across America.
And we’ll do it all to withstand the devastating effects of the climate crisis and promote environmental justice.
We’ll build a national network of 500,000 electric vehicle charging stations, begin to replace poisonous lead pipes—so every child—and every American—has clean water to drink at home and at school, provide affordable high-speed internet for every American—urban, suburban, rural, and tribal communities.
4,000 projects have already been announced.
And tonight, I’m announcing that this year we will start fixing over 65,000 miles of highway and 1,500 bridges in disrepair.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Score: 1.2193955178945004
Vice President Harris and I ran for office with a new economic vision for America.
Invest in America. Educate Americans. Grow the workforce. Build the economy from the bottom up
and the middle out, not from the top down.
Because we know that when the middle class grows, the poor have a ladder up and the wealthy do very well.
America used to have the best roads, bridges, and airports on Earth.
Now our infrastructure is ranked 13th in the world.
We won’t be able to compete for the jobs of the 21st Century if we don’t fix that.
That’s why it was so important to pass the Bipartisan Infrastructure Law—the most sweeping investment to rebuild America in history.
This was a bipartisan effort, and I want to thank the members of both parties who worked to make it happen.
We’re done talking about infrastructure weeks.
We’re going to have an infrastructure decade.
--------------------------------------------------------------------------------