🐕
【LangChain】情報収集に使えるLoaderまとめ
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
webから記事を取得する
WebBaseLoader
- 内部的にbeautifulsoup4を使っているため別途インストール必要
loader = WebBaseLoader("https://zenn.dev/yuta_enginner")
PDFファイル
PDFPlumberLoader
- 文章のPDFは強い
- 図には弱いので、例えば以下のような図だとうまく取得できません
クリックで展開
loader = PDFPlumberLoader(
file_path="src/000278836.pdf"
)
Discussion