
LangChainとLangGraphによるRAG・AIエージェント開発
LangChainとLangGraphによるRAG・AIエージェント開発
少しずつ読んでいってる
LangChainとLangGraphによるRAG・AIエージェント実践入門
この本のソースコードの位置
ここに本に載っているコードがある。colab形式なので、jypyterとかcolabだとそのまま実行できる。 notebook系で実行した方がキャッシュとか効くからいいかもしれない。
webでコード編集するのが嫌いなので、適当にローカルにファイルを作って同様の処理をやっている
4章 LangChainの基礎
LangchainのインストールとOpenAIを使ったチャットのレスポンスの取得など 下はLanghainのドキュメントをembeddingして、RAGとして検索に使っている。
RAGの流れ
- DocumentLoader: データの読み込み
- DocumentTransformer: データの加工、前処理など
- embedding(model): ドキュメントのベクトル化
- Vector store: ベクトル化したドキュメントの保管先(Chroma, elasticsearch, solrなどなど)
- Retriever: 情報を検索する
from langchain_community.document_loaders import 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,
)
raw_docs = loader.load()
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(raw_docs)
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
query = "AWSのS3からデータを読み込むためのDocument loaderはありますか?"
from langchain_chroma import Chroma
db = Chroma.from_documents(docs, embeddings)
retriever = db.as_retriever()
query = "AWSのS3からデータを読み込むためのDocument loaderはありますか?"
context_docs = retriever.invoke(query)
print(f"len = {len(context_docs)}")
first_doc = context_docs[0]
print(f"metadata = {first_doc.metadata}")
print(first_doc.page_content)
5章 LangChain Expression Language( LCEL )
パイプで繋いで簡単に表現できる。prompt | model | output_perser
みたいに。
これを並列に書いたり、RunableLamdaにして自前のfunctionを追加したりできる。
まだ慣れないなー。
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages(
[
("system", "ユーザーが入力した料理のレシピを考えてください。"),
("human", "{dish}"),
]
)
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
output_parser = StrOutputParser()
prompt_value = prompt.invoke({"dish": "カレー"})
ai_message = model.invoke(prompt_value)
output = output_parser.invoke(ai_message)
print(output)
#3行書くよりも下で完結させれる
chain = prompt | model | output_parser
for chunk in chain.stream({"dish": "カレー"}):
print(chunk, end="", flush=True)
6章 AdvancedRAG
- ベクターデータベースに入れる
- retrieverとしてベクトルDBからデータを取り出す
- 検索前
- HyDE(Hypothetical Document Embeddings) ユーザーの回答を仮想的に推論し、検索クエリとして利用する
- HyDEで複数の検索クエリを作成して、ベクトルDBに投げる方法もある
- 検索後
- RAG-Fusion 複数の検索クエリの取得結果をまとめる(Fusionする)
- RRF (Reciprocal Rank Fusion) 1/(rank + k )をスコアとしてランキングを並べる
- 1つの検索結果を並び替えるリランクのモデルもある
- Cohereのリランクモデルで、上位3件のみをllMに入れるなど(あとでやろう)
7章 オフライン評価
RAGEによるオフライン評価のやり方など。
8章 AIエージェント
9章 LangGraphによるAIエージェント実装
10章 AIエージェントのデザインパターン
11章 AIエージェントのデザインパターン実装
LangGraphによる簡単な実装例 要件定期をしてくれるAIエージェントの実装とかの話 ここは他の本と一緒に読んでいきたいのでざっと流す
まとめ
- RAG周りの実装を知りたかったのでよかった
- 思った以上にAIエージェントの開発というものが進んでいて、すでにそれぞれのフレームワークがあったりデザインパターンも語られるようになっているのね
- AIエージェントの部分は他にも気になっている本があるのでそこで一緒にやってみる