まだ途中で、未完成です。
背景
決算短信PDFの内容の変化を計算したい。
やること
- 二つの決算短信のpdfを渡したら、決算短信間の類似度を計算し、その変化を評価してみる。
方法
- 環境構築
- まずは一回「LangChain」というライブラリを使ってみる
- 過去の決算短信と比較し、決算短信間の類似度を計算してみる
実装
1. 環境構築
まずはPythonでの開発を始める前に、必要なライブラリをインストールする。
今回は、LangChainとOpenAIのライブラリ、そしてOpenAIのAPIキーが必要。
環境構築はPoetryとasdfで行った。Poetryとasdfでの環境構築の方法は別の記事にメモしてある。
- LangChainのインストール:
poetry add langchain
でインストール。 - OpenAIのインストール:
poetry add openai
でインストール。 - Indexesを実行するためのライブラリのインストール:
poetry add chromadb
とpoetry add tiktoken
でインストール。 - PDFを読み込むためのライブラリのインストール:
poetry add pypdf
でインストール。 - APIキーの設定:OpenAIおよびGoogle検索を使うためには、APIキーが必要です。自分で発行したAPIキーを、指定の場所に設定します。
2. まずは一回「LangChain」というライブラリを使ってみる
そもそも「LangChain」というライブラリをまだ使ったことがなかったので、一回使ってみることにした。
LangChainの中には、Indexesという機能があり、これを使うと、PDFやCSVなどの与えられた外部データを基に回答を回答を生成するのに適している。
Indexesとは
Indexesとは、 LLM がドキュメントと最適に対話できるようにドキュメントを構造化する方法。
インデックスが利用される最も一般的な方法は、「検索」。
ユーザーのクエリを取得し、最も関連性の高いドキュメントを返すことができる。
したがって、 Retrieverインターフェイスという概念がある。
LangChain は主に、Retrieverとして使用することを目的としたインデックスの構築に重点を置いている。
つまり、検索ツールとして使うための「索引」を作るイメージっぽい。
今回使ったのは、高島屋の2024年2月期第2四半期決算短信、
と
高島屋の2024年2月期第3四半期決算短信。
なお、簡単に実行したい場合には、 VectorstoreIndexCreatorが使えそう。
VectorstoreIndexCreatorは、Embedding、ベクトルストア等、複数処理のラッパーである。
VectorstoreIndexCreator は与えられた文書(この場合はPDF)の内容を基にして回答を生成するのに適している。これは、特に大規模な文書集合から特定の情報を迅速に検索したい場合に有効。
他の有効な使い方としては、類似文書の検索、トピックベースの文書分類、テキストの類似度分析などが挙げられる。これらの機能を利用することで、特定のトピックに関連する文書を見つけたり、文書集合内のトレンドを分析したりすることが可能。
ということでやってみる。
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
from langchain.indexes import VectorstoreIndexCreator
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# OPENAIのAPI
os.environ["OPENAI_API_KEY"] = "YOUR API KEY"
# 決算短信のpdfファイル
takashimaya_pdf2_2 = "./2024-2-2_tanshin.pdf"
takashimaya_pdf3_3 = "./2024-2-3_tanshin.pdf"
# 複数のPDFファイルをまとめる
pdf_files = [takashimaya_pdf2_2, takashimaya_pdf3_3]
# 各PDFファイルに対してドキュメントローダーを作成
loaders = [PyPDFLoader(pdf) for pdf in pdf_files]
# VectorstoreIndexCreatorを使用してベクトルストアを作成
index = VectorstoreIndexCreator(
vectorstore_cls=Chroma, # デフォルト
embedding=OpenAIEmbeddings(), # デフォルト
).from_loaders(loaders)
# クエリ
query = "決算短信における戦略的な変更点や市場動向の変化についての分析をしてください。"
answer = index.query(query)
print(answer) # 応答
そして、得られた回答。
決算短信における戦略的な変更点や市場動向の変化についての分析は、当第3四半期連結累計期間において、新型コロナウイルス感染症の影響により、個人消費や訪日外国人数に変化が見られたことが挙げられます。また、足元では物価上昇に賃金の伸びが追い付かない実質賃金のマイナスが続いており、生活防衛意識の高まりなど、今後の個人消費に影響を与える要因が存在しています。これらの変化を踏まえ、当社では2023年度にさらなる成長と飛躍を目指し、グループ総合戦
応答の長さに制限があるためか、応答が途中で切れてしまう。困った。
これを解決するためには、クエリの調整やチャンク分けなどが必要そう。
CharacterTextSplitter
なども使ってうまくチャンクわけなどの工夫が必要なので、この後やってみる。
しかし、使い方の雰囲気はなんとなくわかった。
まだ未完成ですが、一旦お疲れ様でした。
わからないところ、間違っているところ、もっといい方法がある場合は、コメントでもDMでも教えてください。