Zenn
🌟

LangChainを使って0から何か開発してみる

に公開
1

最近のAIの動向は目まぐるしく盛り上がっています。新しい機能が開発されたと思ったら、数日後にはさらにハイレベルなものが出てきたりと、ちょっと目を離せない状況です。

AI自体はこんな状態ですが、人間側がこれをただ「凄い!」と驚き屋でいるだけでは仕方ありません。エンジニアは絶滅するにではないかと言われるような時代だからこそ、人間側も新しいスキルを身に着けて、存在価値を高めておかないといけないと、身の迫る思いがしてます。

そこで今回、実績づくりをする意味も含めて、LangChainというものを使って何かAIサービスというものを作ってみようと思います。

LangChainとは:AIアプリ開発の魔法の杖

LangChainは、大規模言語モデル(LLM)をより強力で実用的なアプリケーションに変えるためのオープンソースライブラリです。まるで魔法の杖のように、LLMの潜在能力を引き出し、様々なタスクをこなせるようにします。

わかりやすく説明すると:

  • LLMは賢いアシスタント: ChatGPTやBardのようなLLMは、大量のテキストデータから学習した、非常に賢いアシスタントです。質問に答えたり、文章を書いたり、コードを生成したりできます。
  • LangChainはLLMの力を解き放つ: LangChainは、LLMを様々なデータソースや外部ツールと連携させるためのツールを提供します。これにより、LLMは単なる賢いアシスタントから、実用的な問題解決ツールへと進化します。

LangChainで出来ること:

  • データへのアクセス: LangChainは、データベース、API、ファイルシステムなどのデータソースにアクセスし、LLMに情報を提供します。
  • 外部ツールの活用: LangChainは、LLMが外部ツール(例えば、検索エンジン、計算機、翻訳ツール)を使用できるようにします。
  • 複雑なワークフロー: LangChainは、複数のLLMやツールを組み合わせ、複雑なタスクを自動化するためのワークフローを構築できます。

今回作るもの:社内文書のコンシェルジュ

今回作成してみるサービスの題材として、「社内文書のコンシェルジュ」を設定してみます。
イメージとしては、AIが社内文書の保管されているフォルダを参照し、こちらの質問に応じて資料の解説をしてくれるものです。
保存されている資料が膨大で複雑なもののであるとき、そもそもこの資料が自分の求めているのか調べるだけで体力を使ってしまいますが、そこをAIに助けてもらおうといものです。

具体的なイメージ:

  • あなたは、社内文書の保管フォルダにアクセスする権限を持つAIアシスタントに話しかけます。
  • 「○○の資料について教えて」と指示します。
  • AIアシスタントは、フォルダ内の文書を分析し、当該資料の解説を行って

実装していく

セットアップ

今回のプロジェクトでは、AIはGoogleのGeminiを使います。無料で簡単に始められるのでおすすめです。

APIキーを「Gemini API」と調べて出てくるサイトから取得します。

まず簡単な実験から

資料の読み込み claudeで適当にそれっぽい資料を作りました。これを読み込んでいきます。

必要なライブラリを読み込む

pip install langchain
pip install langchain-community
pip install langchain-google-genai
pip install chromadb
pip install pypdf

資料の読み込み

loader = PyPDFLoader("./docs/生成AI最新動向レポート 2024年.pdf")

内容が大きすぎる場合は、分割して資料を扱うことになります。
分割して出力してみます

pages = loader.load_and_split()

print(len(pages))
print(pages[0].page_content)


# 6

# ⽣成 AI 最新動向レポート
# 2024 年 10 ⽉時点の情報
# ⽬次
# 1. 概要
# 2. ⼤規模⾔語モデル( LLM )の最新動向
...

資料を数値化する

分割した資料をは必要に応じて検索し、引っ張てくる必要があります。
そのために資料を数値化し、保存します。

ここからAIを使っていきます。

os.environ["GOOGLE_API_KEY"] = "APIキー"

# 資料の数値化のためのEmbeddingを用意
embed = GoogleGenerativeAIEmbeddings(model="models/embedding-001")

# 資料を数値化し、Chromaというもので保持
vectorstore = Chroma.from_documents(pages, embedding=embed)

# 資料を数値化したものを検索可能な状態にする
retriever = vectorstore.as_retriever()

資料を検索する

# 検索したいクエリ
query = "AIの倫理的課題を教えて"  # ここに具体的な質問を入力

# クエリに基づいて関連性の高いドキュメントを検索
relevant_documents = retriever.get_relevant_documents(query)

# 検索結果を表示
for doc in relevant_documents:
    print(doc.page_content)
    print("-" * 30)

こんな感じで資料を引っ張てきます。
やってみた感じ、精度が低いように感じました。
そもそも使ってる"models/embedding-001"が日本語対応なのかという疑問が…
おそらくOpenAIのモデルを使えば確実なんでしょうが、今は無料でためしたいのでこれで行きます。

AIと会話する(シンプルな受け答え)

llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
result = llm.invoke("「Hello World」と答えてください。")

print(result.content)
# Hello world

AIと会話する(テンプレートを使う)

llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")
prompt = PromptTemplate.from_template("{country}の首都は?")
chain = prompt | llm
# これでpromptとllmをくっつけるという意味になるらしい
#(詳しくは(https://blog.serverworks.co.jp/langchain-lcel-overview)がわかりやすかったです)

print(chain.invoke({"country": "日本"}).content)
# 日本の首都は東京都です。

これだけ使えれば、それっぽいものが作れるはずです!

実装していく

cli上でですが、簡単なサービスを実装してみましょう

まずは、知りたい資料を入力してもらうところから。

入力

print("どの資料を読み込みますか?")
file_path = input("ファイルパスを入力してくだい: ")

資料を数値化

import os
from langchain_community.document_loaders import PyPDFLoader
from langchain_google_genai import GoogleGenerativeAIEmbeddings
from langchain_chroma import Chroma

os.environ["GOOGLE_API_KEY"] = "APIキー"

loader = PyPDFLoader(file_path)

pages = loader.load_and_split()

# 資料の数値化のためのEmbeddingを用意
embed = GoogleGenerativeAIEmbeddings(model="models/embedding-001")

# 資料を数値化し、Chromaに保存
vectorstore = Chroma.from_documents(pages, embedding=embed)

# 資料を数値化したものを検索可能な状態にする
retriever = vectorstore.as_retriever()

AIとの対話開始

from langchain_google_genai import ChatGoogleGenerativeAI
from langchain.prompts import PromptTemplate

llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash")

prompt1 = PromptTemplate.from_template("""
あなたの目的は、与えられた資料をもとに、質問に答えることです。
ただし、あなたはコンシェルジュのようにふるまってください。
現在資料は与えられているという前提で対話をすすめてください。
それでは、資料のどのようなことについて知りたいか聞いてください。
コンシェルジェ:
                                    """)

chain = prompt1 | llm

print("\n\nコンシェルジェ:")
print(chain.invoke({}).content)
query = input("入力:")

クエリに基づいて関連性の高いドキュメントを検索

## クエリに基づいて関連性の高いドキュメントを検索
relevant_documents = retriever.get_relevant_documents(query)

# 一つの文字列にまとめる
combined_document = ""
for doc in relevant_documents:
    combined_document += doc.page_content + "\n\n"  # 各ドキュメントの間に改行を2つ入れる

print("\n\n関連するドキュメント:")
print(combined_document)

参考資料を使って応答する

prompt2 = PromptTemplate.from_template("""
### 参考資料
{combined_document}
                                       
### 質問
{query}
                                       
### 指示
あなたの目的は、与えられた資料をもとに、質問に答えることです。
ただし、あなたはコンシェルジュのようにふるまってください。
それでは、質問に答えてください。
コンシェルジェ:
                                    """)

chain = prompt2 | llm

print("\n\n入力されたプロンプト:")
print(prompt2.format(combined_document=combined_document, query=query))

print("\n\nコンシェルジェ:")
print(chain.invoke({"combined_document" : combined_document, "query" : query}).content)

結果

どの資料を読み込みますか?
ファイルパスを入力してくだい: ./docs/sample.pdf


コンシェルジェ:
かしこまりました。お客様、本日はどのようなご質問でしょうか?資料の内容について、どんな些細なことでも構いませんので、お気軽にお尋ねください。お客様の ご要望に沿えるよう、精一杯お手伝いさせていただきます。
入力:AIの倫理的課題について教えて


関連するドキュメント:
⽣成 AI 最新動向レポート
2024 年 10 ⽉時点の情報
⽬次
(中略)
6.3 ビジネスモデルの変⾰
AIaaS ( AI as a Service ): 業界特化型の AI サービス提供が⼀般化し、中⼩企業でも⾼度な AI 活⽤が
可能になっています。

入力されたプロンプト:

### 参考資料
⽣成 AI 最新動向レポート
2024 年 10 ⽉時点の情報
⽬次
1. 概要
(中略)
6.3 ビジネスモデルの変⾰
AIaaS ( AI as a Service ): 業界特化型の AI サービス提供が⼀般化し、中⼩企業でも⾼度な AI 活⽤が
可能になっています。



### 質問
AIの倫理的課題について教えて

### 指示
あなたの目的は、与えられた資料をもとに、質問に答えることです。
ただし、あなたはコンシェルジュのようにふるまってください。
それでは、質問に答えてください。


ンシェルジェ:
はい、喜んでお答えします。AIの倫理的課題についてですね。

資料によりますと、主に以下の3つの課題が挙げられています。

1.  **コンテンツ真正性:** AIが生成する偽情報やディープフェイクの問題です。見破ることが難しい精巧な偽物が作られることで、社会的な混乱や誤解を招く可能 性があります。この問題に対して、検出技術の開発や規制による対応が進められています。

2.  **著作権問題:** AIの学習データや生成されたコンテンツの著作権に関する議論が活発になっています。AIが学習したデータに著作権がある場合、生成されたも のにも影響があるのか、誰に権利があるのかなどが課題となっています。

3.  **バイアスと公平性:** AIモデルに内在するバイアスの問題です。学習データに偏りがあると、AIが特定のグループに対して不公平な判断を下す可能性がありま す。バイアスの検出と緩和が重要な課題となっています。

これらの課題に対して、国際的な規制フレームワークの策定や、業界による自主的な取り組みが進められています。例えば、AIシステムの判断根拠の説明可能性を高 める技術開発や、AI生成コンテンツの識別を可能にするデジタル署名技術の導入などが挙げられます。

何かさらに詳しく知りたい点や、別の角度からの質問などございましたら、お気軽にお申し付けください。

それっぽいものが出来ました
また機会があれば、アプリやサービスも作ってみたいです。

1

Discussion

ログインするとコメントできます