RAG AI Agent book

LangChainとLangGraphによるRAG・AIエージェント開発

LangChainとLangGraphによるRAG・AIエージェント開発

少しずつ読んでいってる

LangChainとLangGraphによるRAG・AIエージェント実践入門

この本のソースコードの位置

ここに本に載っているコードがある。colab形式なので、jypyterとかcolabだとそのまま実行できる。 notebook系で実行した方がキャッシュとか効くからいいかもしれない。

github:agent-book

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エージェントの部分は他にも気になっている本があるのでそこで一緒にやってみる
connvoi's Picture

About connvoi

肉とビールと料理と写真とゲーム たまに技術 python / Solr / PHP / ansible

アマゾンセール情報サイト アマセール管理人

Jp, Tokyo https://connvoi.com