🐕

【LangChain】情報収集に使えるLoaderまとめ

2025/01/19に公開

langchain 0.3
python 3.13

基本的な使い方

インポート

langchain_community.document_loadersに格納されている

from langchain_community.document_loaders import WebBaseLoader

ロード

loader = WebBaseLoader("https://funky802.com/hot100/")

docs = loader.load()

docsはDocumentのリスト。
このあとは以下の例のように好きに料理してください

例1 テキストの分割

from langchain_text_splitters import CharacterTextSplitter

splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base",
    chunk_size=100,
    chunk_overlap=0
)

documents = splitter.split_documents(docs)

例2 近傍検索

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

db = Chroma.from_documents(documents, embeddings)

similarity_res = db.similarity_search("今週のNo1の曲は?")

print(similarity_res)

例3 RAGの作成

from langchain_core.prompts import ChatPromptTemplate

template = """
以下の文脈だけを踏まえて解答してください
context:{context}

question:{question}
"""

prompt = ChatPromptTemplate.from_template(template)

from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

llm = ChatOpenAI(model="gpt-4o-mini")

retriever = db.as_retriever()

chain = {
    "question":RunnablePassthrough(),
    "context":retriever,
}|prompt|llm|StrOutputParser()

rag_res = chain.invoke("今週のNo1の曲は?")

print(rag_res)

Github

GitLoader

def file_filter(file_path:str)-> bool:
    return file_path.endswith(".mdx")

loader = GitLoader(
    clone_url="https://github.com/langchain-ai/langchain",
    repo_path="./langchain",
    branch="master",
    file_filter=file_filter
)

Youtube

YoutubeLoader

  • youtube動画の字幕からテキストをロードできます。
loader = YoutubeLoader.from_youtube_url(
    "https://youtu.be/q6QYAcF9Uoc", add_video_info=False, language=["ja"]
)

以下は、中川家の寄席2023「大阪の不動産屋」で話されていた内容をもとに、大阪近辺の特徴を返してくれるRAGです。

クリックで展開
from pathlib import Path
from dotenv import load_dotenv
load_dotenv()

from langchain_community.tools import YouTubeSearchTool
from langchain_community.document_loaders import YoutubeLoader

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import Runnable, RunnablePassthrough

from langchain_core.output_parsers import StrOutputParser

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

db_directory = "./osaka_real_estate"

# db_directoryが存在しない場合は、情報を取得する
if not Path(db_directory).exists():
    # YouTubeから情報を取得してデータベースを作成する
    loader = YoutubeLoader.from_youtube_url(
        "https://youtu.be/q6QYAcF9Uoc", add_video_info=False, language=["ja"]
    )
    documents = loader.load()
    db = Chroma.from_documents(documents, embeddings, persist_directory=db_directory)

else:
    db = Chroma(persist_directory=db_directory, embedding_function=embeddings)


template = """
以下の内容を参照に、ユーザーの質問に答えてください。
参考にするデータがない場合は、見つかりませんと返してください。

question:{question}
context:{context}
"""

prompt = ChatPromptTemplate.from_template(template)

llm = ChatOpenAI(model="gpt-4o-mini")

retriever = db.as_retriever()

chain: Runnable = {
    "question":RunnablePassthrough(),
    "context":retriever,
}|prompt|llm|StrOutputParser()


res = chain.invoke("難波の家賃の相場は?")

print(res)

YoutubeAudioLoader

https://python.langchain.com/docs/integrations/document_loaders/youtube_audio/

webから記事を取得する

WebBaseLoader

  • 内部的にbeautifulsoup4を使っているため別途インストール必要
loader = WebBaseLoader("https://zenn.dev/yuta_enginner")

PDFファイル

PDFPlumberLoader

  • 文章のPDFは強い
  • 図には弱いので、例えば以下のような図だとうまく取得できません
クリックで展開

loader = PDFPlumberLoader(
    file_path="src/000278836.pdf"
)

Discussion