見出し画像

ChatGPT勉強日記(#9) Pineconeの使用料が高いのでqdrantというベクターデータベースに乗り換えた(後編)

前回、IDEOのHuman Centered Design (人間中心設計)の資料をベクターデータにしたものをPineconeからqdrantに移し替えた。
今回はこのqdrantのベクターデータベースを使ってベクターデータを探索するように、第6回の内容をPineconeからqdrantに切り替えて行きたいと思う。

第6回はこちら↓↓↓

前6回でつくったsearch.ipynbファイルを編集していく。

search.ipynb

まず、今まで、langchainのPineconeクラスとpineconeをimportしていた以下の箇所を

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
import pinecone

以下のように書き換える。

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Qdrant
from qdrant_client import QdrantClient

langchainのQdrantクラスをimportし、次に、qdrant_clientモジュールのQdrantClientクラスをimportする。

次に、Pineconeクラスの初期化部分の以下のコード


# Initialize OpenAi Embedding
embeddings = OpenAIEmbeddings(openai_api_key=os.environ['OPENAI_API_KEY'])

# Initialize Pinecone
pinecone.init(api_key=os.environ['PINECONE_API_KEY'], environment=os.environ['PINECONE_INDEX_REGION'])
index = pinecone.Index(os.environ['PINECONE_INDEX_NAME'])
docsearch = Pinecone(
    index, embeddings.embed_query, "text"
)

を下のように書き換える

# Initialize Openai embedding
embeddings = OpenAIEmbeddings(openai_api_key=os.environ['OPENAI_API_KEY'])

# Initialize Qdrant
client = QdrantClient(url=os.environ['QDRANT_URL'])
docsearch = Qdrant(
    client=client,
    collection_name=os.environ['QDRANT_COLLECTION_NAME'],
    embeddings=embeddings.embed_query,
)

Qdrantクラスに渡すパラメータはQdrantClientオブジェクト、qdrantのCollection名、そして、OpenAIEmbeddingsオブジェクトのembed_query関数である。
(embed_queryはオブジェクトではなく、下のような関数となっている)

embed_query(text: str) → List[float][source]
Call out to OpenAI’s embedding endpoint for embedding query text.

第6回からの修正点はこれだけで、ask_question関数などは変更しない。
使い方も同じで、前回のように質問と一緒にQdrantオブジェクトをask_question関数にわたすと質問内容から最も近いベクターデータを見つけそれを文脈に答えを返してくれる。

query1="What is the common technichs IDEO uses in their projects?"
chat_history = ask_question(query1, docsearch, chat_history)
print("history: ", chat_history)


ask_question関数は第6回と全く同じだが、参考までに下に再掲する。

def ask_question(query, vectordb, chat_history):    
    retriever = vectordb.as_retriever(search_kwargs={"k": 2}) # This one uses similarity search na din?    
    chat = ConversationalRetrievalChain.from_llm(llm, retriever=retriever, return_source_documents=True)
    result = chat({"question": query,"chat_history": chat_history})
    print("answer: ", result["answer"])    
    chat_history.insert(0, (query, result["answer"]))
    return chat_history

このように今回もLangChainのおかげで、ask_questionに渡すベクターデータベースのオブジェクトをPineconeからQdrantオブジェクトに変えるだけで後のインターフェースは全くそのまま動いていくれたのであった。

質問内容も前回と同じく、正しくIDEOの資料に基づいてChatGPTが回答していることか確認できた。

前回うまく行かなかった↑の質問に対しても今回はうまく答えている


続く。

ここまで作ってきて、開発フェーズではqdrantのコンテナを使うことでコストゼロでベクターデータベースが使えるのがすごく良いと思った。完全ストレスフリーで開発ができる。
qdrantにもフルマネージドサービスのプランはあるので、リリースするときは自分でコンテナをEC2などにおくよりもスケーラビリティの面で手間がかからず良いだろうと思った。
qdrabtのフルマネージドサービス(Qdrant Cloud)の料金のシミュレーションは以下でできる。

2023年9月の時点では、1536次元のベクターデータを30万件保存したとしても料金は8.54ドルなので、僕のケースの場合そんなにたくさんのデータはないしPineconeよりだいぶ安くなりそうである。

ちなみにデータの件数を1件にしても料金は30万件の場合と同じ8.54ドルだったので、1536次元のベクターデータの最低使用料が今現在は8.54ドルのようだ。

続く。


このブログに関する質問や、弊社(Goldrush Computing)への開発案件の依頼は↓↓↓からお願いします。弊社では現在、OpenAI APIを使った高度なドキュメントや文字列情報を扱ったシステムの開発に注力しております。

mizutori@goldrushcomputing.com


この記事が気に入ったらサポートをしてみませんか?