テックブログ

エルカミーの技術ブログです

🦜 LangChain応用 AnalyzeDocumentChain編

はじめに


LangChainの機能の一つであるChainには様々な機能が提供されています。今回はChain機能の一つであるAnalyzeDocumentChainについて説明します。

AnalyzeDocument


AnalyzeDocumentChainを使用することで、簡単にドキュメントの内容を要約することや、質問に対して回答を生成することができます。

やってみる

今回はChatGPTに生成させた、AIに関する文章 (about_ai.txt) を読み込ませ、問い合わせていきます。

about_ai.txtの内容は以下の通りです。

AI(人工知能)は、コンピューターが人間と同様の認知能力を備えることを可能にする技術です。AIは、機械学習、自然言語処理、画像認識、ロボット工学などの分野で発展しており、現在、さまざまな業界で活用されています。
例えば、自動運転車やロボットは、AIを使用して環境を認識し、適切な判断を下すことができます。また、医療分野では、AIを使用して病気の診断や治療の決定を支援することが可能です。AIは、ビジネスやマーケティングにも利用されており、消費者の嗜好や需要を分析することで、より効果的なマーケティング戦略を策定することができます。
AIの進化により、社会はますます自動化され、効率化されることが予想されます。例えば、製造業では、AIを活用することで生産性が向上し、人手不足による生産の停滞を回避することができます。また、農業分野でも、AIを活用することで、作物の収穫量を増やし、農業生産性を向上することができます。
しかし、一方でAIによる自動化が進むことで、職業が失われたり、人間らしさが失われたりするといった問題も生じる可能性があります。そのため、AIの活用には、人間らしい価値観を尊重し、人間とAIが共存する社会を実現するための議論や取り組みが必要です。
また、AIが発展するにつれ、プライバシーや倫理的な問題も生じています。例えば、AIが個人情報を解析することにより、個人のプライバシーが侵害される可能性があります。また、AIが人間と同様の判断力を持つ場合、誤った判断を下す可能性もあります。そのため、AIの開発や使用には、倫理的な観点からの取り組みも重要となっています。
コード全体

コード全体を載せておきました。概要を知りたい方はご確認ください。

コード例
import os
from langchain import OpenAI
from langchain.chains.summarize import load_summarize_chain
from langchain.chains import AnalyzeDocumentChain
from langchain.chains.question_answering import load_qa_chain
os.environ["OPENAI_API_KEY"]="YOUR_OPENAI_API_KEY"
with open("about_ai.txt", encoding='utf-8') as f:
    document = f.read()
llm = OpenAI(temperature=0, max_tokens=500)
summary_chain = load_summarize_chain(llm, chain_type="map_reduce")
summarize_document_chain = AnalyzeDocumentChain(combine_docs_chain=summary_chain)
output = summarize_document_chain.run(document)
print(output)
qa_chain = load_qa_chain(llm, chain_type="map_reduce")
qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)
output = qa_document_chain.run(input_document=document, question="AIの問題点を教えてください")
print(output)
コードの説明

コードの説明に入ります。

まずは必要なライブラリをインポートします。

import os
from langchain import OpenAI
from langchain.chains.summarize import load_summarize_chain
from langchain.chains import AnalyzeDocumentChain
from langchain.chains.question_answering import load_qa_chain

次にOpenAIのAPIを設定します。"YOUR_OPENAI_API_KEY”の部分に自分のAPIキーを入力します。

os.environ["OPENAI_API_KEY"]="YOUR_OPENAI_API_KEY"

ドキュメントの内容を読み込み、ドキュメントの要約をしていきます。

with open("about_ai.txt", encoding='utf-8') as f:
    document = f.read()
llm = OpenAI(temperature=0, max_tokens=500)
summary_chain = load_summarize_chain(llm, chain_type="map_reduce")
summarize_document_chain = AnalyzeDocumentChain(combine_docs_chain=summary_chain)
output = summarize_document_chain.run(document)
print(output)
AI (Artificial Intelligence) is a technology that enables computers to have cognitive abilities similar to humans, and is being used in various industries such as autonomous vehicles, robotics, healthcare, business, and marketing. However, as automation through AI increases, jobs are being lost and privacy and ethical issues arise. Therefore, it is important to respect human values and take an ethical approach when utilizing AI.

英語で出力されたため、日本語訳を載せておきます。

日本語訳
AI(人工知能)は、コンピュータに人間に類似した認知能力を持たせる技術であり、自動車、ロボット工学、医療、ビジネス、マーケティングなど、さまざまな産業で使用されています。ただし、AIによる自動化が進むにつれて、雇用が失われ、プライバシーや倫理の問題も生じています。そのため、AIを活用する際には人間の価値を尊重し、倫理的なアプローチを取ることが重要です。

内容をうまく要約できていました!

最後にドキュメントの内容について質問していきます。

qa_chain = load_qa_chain(llm, chain_type="map_reduce")
qa_document_chain = AnalyzeDocumentChain(combine_docs_chain=qa_chain)
output = qa_document_chain.run(input_document=document, question="AIの問題点を教えてください")
print(output)
AIによる自動化が進むことで、職業が失われたり、人間らしさが失われたりする可能性があります。また、AIが発展するにつれ、プライバシーや倫理的な問題も生じています。例えば、AIが個人情
報を解析することにより、個人のプライバシーが侵害される可能性があります。また、AIが人間と同様の判断力を持つ場合、誤った判断を下す可能性もあります。

文章の内容に基づいて、AIの問題点を正確に答えられています。

AnalyzeDocumentを使わない場合との違いは?

AnalyzeDocumentを使った場合とそうでない場合はどのように違うのか、気になりました。そこで、同じテキストファイルを読み込ませて検証してみます!

比較に使うコードは以下の通りです。

比較に使うコード
import os
from langchain import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
loader = TextLoader("about_ai.txt", encoding="utf-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
qa = RetrievalQA.from_chain_type(
    llm=OpenAI(temperature=0, max_tokens=500),
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 1}),
)

query = "要約してください"
output = qa.run(query)
print(output)
query = "AIの問題点について教えてください"
output = qa.run(query)
print(output)

  1. 要約
  • AnalyzeDocumentを使わない場合
query = "要約してください"
output = qa.run(query)
print(output)
AIは、コンピューターが人間と同様の認知能力を備える技術であり、自動運転車やロボット、医療分野、ビジネスやマーケティングなど、さまざまな業界で活用されています。AIの進化により、社会は自動化され、効率化されると予想されますが、職業が失われたり、プライバシーが侵害されたりする可能性もあり、倫理的な観点からの取り組みも重要となっています。

  • AnalyzeDocumentを使った場合
AI(人工知能)は、コンピュータに人間に類似した認知能力を持たせる技術であり、自動車、ロボット工学、医療、ビジネス、マーケティングなど、さまざまな産業で使用されています。ただし、AIによる自動化が進むにつれて、雇用が失われ、プライバシーや倫理の問題も生じています。そのため、AIを活用する際には人間の価値を尊重し、倫理的なアプローチを取ることが重要です。

比較してみると大きく内容は変わらないですね!

  1. 質問

最後に同じ質問をしてみます。

  • AnalyzeDocumentを使わない場合
query = "AIの問題点について教えてください"
output = qa.run(query)
print(output)
AIの活用には、人間らしい価値観を尊重し、人間とAIが共存する社会を実現するための議論や取り組みが必要です。また、AIが発展するにつれ、プライバシーや倫理的な問題も生じています。例えば、AIが個人情報を解析することにより、個人のプライバシーが侵害される可能性があります。また、AIが人間と同様の判断力を持つ場合、誤った判断を下す可能性もあります。

  • AnalyzeDocumentを使った場合
AIによる自動化が進むことで、職業が失われたり、人間らしさが失われたりする可能性があります。また、AIが発展するにつれ、プライバシーや倫理的な問題も生じています。例えば、AIが個人情報を解析することにより、個人のプライバシーが侵害される可能性があります。また、AIが人間と同様の判断力を持つ場合、誤った判断を下す可能性もあります。

両者を比較してみます。

AnalyzeDocumentを使わない場合は、問題点について質問しているのですが、「AIの活用には、人間らしい価値観を尊重し、人間とAIが共存する社会を実現するための議論や取り組みが必要です。」のように問題点ではなく、必要なことを答えてしまっていますね。

ですが、ほとんどAnalyzeDocumentを使った場合と同じような内容になっていました!

まとめ

今回は、AnalyzeDocumentについて紹介していきました!

AnalyzeDocumentは文書の内容に関して、簡単に要約や質問することができます。embeddingやVectorStoreの記述を必要としないので、理解しやすく、簡単に実装することできます。

AnalyzeDocumentを使った場合とそうでない場合の回答は、ほとんど変わらないので、文書に関して簡単に問い合わせたい場合はAnalyzeDocumentを使うとよいかもしれません。

参考