公式ライブラリの読み方
生成AI系の開発など、ライブラリの更新頻度が早く、
個人ブログなど、前例があまり追いついていない分野については特に刺さる内容になるかと思います。
まずはブログ。そのあと公式情報
例えば、RAGの構築を行うためにベクトルデータベースを作成する際に、
以下のような関数を利用してチャンクを作成するという記事が多いと思います。
※以下の関数のpathは古いです。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator = "\n\n",
chunk_size = 11,
chunk_overlap = 0,
)
これを利用すると、最新の情報とパスや関数の仕様が若干異なるため、コンパイルエラーを起こします(当然)
そのため、これでimportをしている対象について検索を行い、公式ライブラリに移動します
[CharacterTextSplitter関数についての公式ライブラリ]
ここでこの関数は情報が古いことがわかります。
そのため、このライブラリ情報から最新のDocsの中で再度、CharacterTextSplitterについて検索を行います。
すると以下の記事がヒットします。
[最新版のCharacterTextSplitter関数の情報]
ここで初めて最新バージョンでこの関数を利用することが可能になります
以下がその関数の使用例です。
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base",
chunk_size=100,
chunk_overlap=0
)
texts = text_splitter.split_text(document)
明らかに分割方法について改修され、仕様はもちろんのことですが、importのpathが変更されていることがわかります。
こういう調べ方でたどり着くのが一番オーソドックスなたどり着き方かなと思います。
英語が読めないが、手っ取り早く関数の仕様について、より詳細に知りたい場合
まずは上記手順で検索し、関数のpathや関数名を正確に特定しておきます。
その後、その関数についてGoogle検索などで「関数名 Github」と検索します。
すると、その関数についてのissueがあるページやそのライブラリ本体のGitHubにたどり着くはずです。
そこで、issueから調べたい関数のファイルpathを抜き、そのファイルpathにライブラリ本体のGitHubからアクセスします。
これで、その関数がどのような仕様になっているかソースコードから把握できるため、便利です。
ちなみに以下が今回課題としていた関数の定義が記されているGitHubになります
- どういう時に使用するか
CharacterTextSplitterを例としますが、この関数ってどういう引数を欲しており、そのreturnはどういう型なのか
また、どのようなsplitをしているのかというのがわからないなどあるかと思います
そういう時に読んでより詳細な仕様を把握して設定を把握することで確実に把握することを想定しています。
上記GitHubから抜粋になりますが、この関数のクラス定義は以下になります。
class CharacterTextSplitter(TextSplitter):
"""Splitting text that looks at characters."""
def __init__(
self,
separator: str = "\n\n",
is_separator_regex: bool = False, # noqa: FBT001,FBT002
**kwargs: Any,
) -> None:
"""Create a new TextSplitter."""
super().__init__(**kwargs)
self._separator = separator
self._is_separator_regex = is_separator_regex
def split_text(self, text: str) -> list[str]:
"""Split into chunks without re-inserting lookaround separators."""
# 1. Determine split pattern: raw regex or escaped literal
sep_pattern = (
self._separator if self._is_separator_regex else re.escape(self._separator)
)
# 2. Initial split (keep separator if requested)
splits = _split_text_with_regex(
text, sep_pattern, keep_separator=self._keep_separator
)
# 3. Detect zero-width lookaround so we never re-insert it
lookaround_prefixes = ("(?=", "(?<!", "(?<=", "(?!")
is_lookaround = self._is_separator_regex and any(
self._separator.startswith(p) for p in lookaround_prefixes
)
# 4. Decide merge separator:
# - if keep_separator or lookaround -> don't re-insert
# - else -> re-insert literal separator
merge_sep = ""
if not (self._keep_separator or is_lookaround):
merge_sep = self._separator
# 5. Merge adjacent splits and return
return self._merge_splits(splits, merge_sep)
ここで、この関数ではseparator的なことしか書いていないので、
区切り方という仮説はあっているなとわかります。
総括
生成AIのように技術の進歩が速い分野では、個人ブログの情報が古くなりがちです。
エラーに遭遇した際は、ブログの情報を鵜呑みにせず、
関数名などを手がかりに公式のAPIリファレンスや公式ドキュメントを検索し、
最新のimportパスや仕様を確認する習慣が重要です。
また、英語のドキュメント読解が難しい場合や、関数の詳細な動作(引数の意味など)を正確に把握したい場合は、G関数名+GitHubで検索し、ソースコードを直接読むことも有効です。
コードは翻訳の必要がなく、最も正確な仕様のため翻訳リスクなどを抑えて精読できます。
閲覧いただきありがとうございました。