LangChain を活用して Amazon Bedrock を利用する

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

現在は、LangChainを利用する際は、LCEL記法が推奨されております。 LCELについては、以下を参照ください。

python.langchain.com

また別でブログを書いているため、ご興味ある方はご覧ください。

blog.serverworks.co.jp

はじめに

2ヶ月ほど前からLLMのアプリ開発に役立つフレームワークであるLangChainを使っていたのですが、 来年になったら忘れてしまうと思ったため、今年のうちに備忘録として残しておきます。

利用するクラスの整理

### LLM
* Bedrock
Amazon BedrockのLLM用のクラス

### callback
* StreamingStdOutCallbackHandler
標準出力にストリーミングするクラス

### Embeddings
* BedrockEmbeddings
Amazon BedrockのEmbeddings用のクラス

### Loader
* PyPDFDirectoryLoader
PDFドキュメントをロードするクラス

### indexes
* VectorstoreIndexCreator
ベクターストアを作成するクラス

### vectorstores
* FAISS
FAISS形式のベクターストアを扱うクラス

### history
* DynamoDBChatMessageHistory
DynamoDBを利用して会話履歴を保持するクラス

### memory
* ConversationBufferWindowMemory
LLMに質問する際に利用する会話履歴を適切に管理するクラス

### Chains
* RetrievalQA
関連文書を検索しつつ、質問に答えるクラス
* ConversationChain
会話履歴を踏まえて、質問に答えるクラス
* ConversationalRetrievalChain
関連文書を検索しつつ、会話履歴を踏まえて、質問に答えるクラス

Amazon BedrockのLLMに質問する

簡単な処理であれば、LangChainを使わなくてもできるため、boto3だけで実行する方法も書いてみます。

boto3

import boto3
import sys
import json
  
def generate_answer(question):
  
    ## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )
  
    ## invoke_modelメソッドで利用するデータの設定
    input_data = json.dumps({
        "prompt": f"\n\nHuman: {question} \n\nAssistant:",
        "max_tokens_to_sample": 4096,
        "temperature": 0,
        "stop_sequences": []
    })
  
    ## invoke_modelメソッドの実行(質問に対する回答の生成)
    response = bedrock_runtime.invoke_model(
        accept='application/json',
        body=input_data,
        contentType='application/json',
        modelId='anthropic.claude-v2:1'
    )

    print(f"""
## レスポンス
{response}
""")
  
    response_body = response['body'].read().decode('utf-8')
  
    print(f"""
## レスポンスのBodyを読み取り、デコードした結果
{response_body}
""")
  
    answer = json.loads(response_body)['completion']
  
    print(f"""
## レスポンスのBodyをデコードして回答結果のみを出力
{answer}
""")
  
## 引数から質問を取得
question = sys.argv[1]
## generate_answer関数の実行
generate_answer(question)
  • 実行結果例
$ python3 boto3-llm.py 日本の首都は?

## レスポンス
{'ResponseMetadata': {'RequestId': '82d5470b-22d9-4a32-9eb4-5849d8fee285', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 29 Dec 2023 04:04:39 GMT', 'content-type': 'application/json', 'content-length': '309', 'connection': 'keep-alive', 'x-amzn-requestid': '82d5470b-22d9-4a32-9eb4-5849d8fee285', 'x-amzn-bedrock-invocation-latency': '4245', 'x-amzn-bedrock-output-token-count': '86', 'x-amzn-bedrock-input-token-count': '17'}, 'RetryAttempts': 0}, 'contentType': 'application/json', 'body': <botocore.response.StreamingBody object at 0x10545b310>}


## レスポンスのBodyをデコードした結果
{"completion":" 東京です。\n\n東京は日本の首都で、人口も一番多い都市です。政治の中心である国会議事堂や皇居があるなど、日本の政治・経済・文化の中心地としての役割を果たしています。","stop_reason":"stop_sequence","stop":"\n\nHuman:"}


## レスポンスのBodyをデコードして回答結果のみを出力
東京です。

東京は日本の首都で、人口も一番多い都市です。政治の中心である国会議事堂や皇居があるなど、日本の政治・経済・文化の中心地としての役割を果たしています。
$

LangChain

import boto3
import sys
from langchain_community.llms.bedrock import Bedrock


def generate_answer(question):
## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## LangChainにおけるBedrockクラスのインスタンス化
    llm = Bedrock(
        model_id='anthropic.claude-v2:1',
        client=bedrock_runtime,
        model_kwargs={
            "max_tokens_to_sample": 4096,
            "temperature": 0,
            "stop_sequences": []
        },
        region_name="us-east-1",
    )

## predictメソッドの実行(質問に対する回答の生成)
    response = llm.predict(question)
    print(response)


## 引数から質問を取得
question = sys.argv[1]
## generate_answer関数の実行
generate_answer(question)
  • 実行結果例
$ python3 langchain-llm.py 日本の首都は?
 東京です。

東京は日本の首都で、人口が最も多い都市です。政治の中心地であり、経済やビジネスの中心地でもあります。東京には皇居や国会議事堂などの政治的な施設の他、スカイツリーや東京タワーなどのランドマークがあります。
$

回答を出力するにあたり、boto3の場合は、回答が生成された後にBodyを読み込み、そこから必要なKeyのValueを取得する必要がありますが、 LangChainの場合は、そういった処理を行う必要がなく、簡単に回答を取得することができます。

質問に対する回答をストリーミング出力する

boto3

import boto3
import sys
import json


def generate_answer(question):
    # bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )
# invoke_modelメソッドで利用するデータの設定
    input_data = json.dumps({
        "prompt": f"\n\nHuman: {question} \n\nAssistant:",
        "max_tokens_to_sample": 4096,
        "temperature": 0,
        "stop_sequences": []
    })
# invoke_modelメソッドの実行(質問に対する回答の生成)
    response = bedrock_runtime.invoke_model_with_response_stream(
        accept='application/json',
        body=input_data,
        contentType='application/json',
        modelId='anthropic.claude-v2:1',
    )
    print(f"""
## レスポンス
{response}
""")

    print("## 回答(ストリーミング出力)")
    for response_body in response['body']:
        print(json.loads(response_body['chunk']['bytes'].decode(
            'utf-8'))['completion'], end='')


# 引数から質問を取得
question = sys.argv[1]
# generate_answer関数の実行
generate_answer(question)
$ python3 boto3-llm-streaming.py 日本の首都は?  

## レスポンス
{'ResponseMetadata': {'RequestId': '5ffd196a-d5b1-428a-9c75-3e24bf52ef0f', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Sun, 31 Dec 2023 05:12:34 GMT', 'content-type': 'application/vnd.amazon.eventstream', 'transfer-encoding': 'chunked', 'connection': 'keep-alive', 'x-amzn-requestid': '5ffd196a-d5b1-428a-9c75-3e24bf52ef0f', 'x-amzn-bedrock-content-type': 'application/json'}, 'RetryAttempts': 0}, 'contentType': 'application/json', 'body': <botocore.eventstream.EventStream object at 0x1069d8290>}

## 回答(ストリーミング出力)
 東京です。

東京は日本の首都で、人口が最も多い都市です。政治の中心地であると同時に、経済や文化の中心地でもあります。%                                                                      
$ 

LangChain

import boto3
import sys
from langchain_community.chat_models.bedrock import BedrockChat
from langchain_community.llms.bedrock import Bedrock
from langchain.callbacks import StreamingStdOutCallbackHandler


def generate_answer(question):
    # bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )
# LangChainにおけるBedrockクラスのインスタンス化
    llm = Bedrock(
        model_id='anthropic.claude-v2:1',
        client=bedrock_runtime,
        model_kwargs={
            "max_tokens_to_sample": 4096,
            "temperature": 0,
            "stop_sequences": []
        },
        region_name="us-east-1",
        streaming=True,
        callbacks=[StreamingStdOutCallbackHandler()]
    )
# predictメソッドの実行(質問に対する回答の生成)
    llm.predict(question)


# 引数から質問を取得
question = sys.argv[1]
# generate_answer関数の実行
generate_answer(question)
  • 実行結果例
 python3 langchain-llm-streaming.py 日本の首都は?
 東京です。

東京は日本の首都で、人口も一番多い都市です。政治の中心である国会議事堂や皇居があるなど、日本の政治・経済・文化の中心地としての役割を果たしています。
$ 

会話履歴を踏まえてAmazon BedrockのLLMに質問する

LangChain

import boto3
import sys
from langchain_community.llms import Bedrock
from langchain_community.chat_message_histories import FileChatMessageHistory
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import ConversationChain


def generate_answer(question):
## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## LangChainにおけるBedrockクラスのインスタンス化
    llm = Bedrock(
        model_id='anthropic.claude-v2:1',
        client=bedrock_runtime,
        model_kwargs={
            "max_tokens_to_sample": 4096,
            "temperature": 0,
            "stop_sequences": []
        },
        region_name="us-east-1",
    )

## FileChatMessageHistoryクラスのインスタンス化
    chat_message_history = FileChatMessageHistory(
        '/tmp/chat-message-history.txt'
    )

## ConversationBufferWindowMemoryクラスのインスタンス化
    memory = ConversationBufferWindowMemory(
        k=5,
        chat_memory=chat_message_history,
        # input_key='input',
        # output_key=output_key,
        return_messages=True,
    )

## ConversationChainクラスのインスタンス化
    chain = ConversationChain(
        llm=llm,
        memory=memory,
    )

## predictメソッドの実行(会話履歴を踏まえて質問に対する回答の生成)
    response = chain.predict(input=question)
    print(response)


## 引数から質問を取得
question = sys.argv[1]
## generate_answer関数の実行
generate_answer(question)
  • 実行結果例
$ python3 langchain-conversation-chain.py 日本の都道府県を1つ教えて
 はい、日本には47の都道府県があります。1つ例を挙げると、

東京都 - 日本の首都である東京がある都道府県です。東京は政治、経済、文化の中心地として知られ、世界有数の大都市です。東京都には23の特別区があり、それぞれが個性的な街並みや文化を持っています。
$
$ python3 langchain-conversation-chain.py それ以外にもう1つ教えて
 はい、日本には47の都道府県があり、それぞれに個性的な文化や歴史があります。

もう1つ例を挙げると、大阪府です。大阪府は関西地方の中心に位置し、大阪市をはじめとする複数の大都市が存在します。大阪は「万国博覧会」の会場になったことでも知られ、食文化や方言など非常に個性的な文化が育まれています。また、歴史的にも大阪は古くから政治・経済の中心地として栄えてきた街です。

以上のように、日本の都道府県にはそれぞれ独自の魅力があります。他にも様々な都道府県をご紹介できるので、もし興味があれば遠慮なく聞いてください。
$

会話履歴をローカルのファイルに保持しているため、会話の流れを理解してLLMが回答を生成してくれていることが分かります。

補足1

上記は会話履歴をローカルのファイルに保存しておりますが、以下の方法でDynamoDBを利用することもできます。

  • パーティションキーをSessionId (String)に指定し、DynamoDBを作成する

  • DynamoDBChatMessageHistoryのモジュールを読み込む

from langchain_community.chat_message_histories import DynamoDBChatMessageHistory
  • FileChatMessageHistoryの部分をDynamoDBChatMessageHistoryに変更する。
chat_message_history = DynamoDBChatMessageHistory(
    table_name=[テーブル名],
    session_id=[一意の識別子]
)

補足2

上記(ConversationBufferWindowMemory)は、会話履歴を5回分考慮するようになっておりますが、 ConversationSummaryMemoryを利用することで過去のやり取りを要約したものを利用することもできます。

  • ConversationSummaryMemoryのモジュールを読み込む
from langchain.memory import ConversationSummaryMemory
  • ConversationBufferWindowMemoryの部分をConversationSummaryMemoryに変更する。
memory = ConversationSummaryMemory(
    llm=llm,
    chat_memory=chat_message_history,
    return_messages=True
)

Amazon BedrockのEmbeddingsモデルで埋め込み

boto3

import boto3
import sys
import json


def generate_embeddings(text):
## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## invoke_modelメソッドで利用するデータの設定
    input_data = json.dumps({
        "inputText": text
    })

## invoke_modelメソッドの実行(埋め込み)
    response = bedrock_runtime.invoke_model(
        accept='application/json',
        body=input_data,
        contentType='application/json',
        modelId='amazon.titan-embed-text-v1'
    )

    print(f"""
## レスポンス
{response}
""")

    response_body = response['body'].read()

    print(f"""
## レスポンスのBodyを読み取った結果
{response_body}
""")

    answer = json.loads(response_body)['embedding']

    print(f"""
## レスポンスのBodyをデコードして回答結果のみを出力
{answer}
""")


## 引数から質問を取得
question = sys.argv[1]
## generate_embeddings関数の実行
generate_embeddings(text)
  • 実行結果例
$ python3 boto3-embeddings.py 東京
## レスポンス
{'ResponseMetadata': {'RequestId': 'ae0199a4-a9e5-4880-95de-97d349520abb', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Fri, 29 Dec 2023 05:12:03 GMT', 'content-type': 'application/json', 'content-length': '16636', 'connection': 'keep-alive', 'x-amzn-requestid': 'ae0199a4-a9e5-4880-95de-97d349520abb', 'x-amzn-bedrock-invocation-latency': '82', 'x-amzn-bedrock-input-token-count': '1'}, 'RetryAttempts': 0}, 'contentType': 'application/json', 'body': <botocore.response.StreamingBody object at 0x10294b130>}


## レスポンスのBodyを読み取った結果
b'{"embedding":[1.15625,1.15625, ''' 中略 ''', 1.0078125],"inputTextTokenCount":1}'


## レスポンスのBodyをデコードして回答結果のみを出力
[1.15625, 1.15625, ''' 中略 ''' , 1.0078125]
$

LangChain

import boto3
import sys
from langchain_community.embeddings import BedrockEmbeddings


def generate_embeddings(text):
## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## BedrockEmbeddingsのインスタンス化
    embeddings = BedrockEmbeddings(
        model_id="amazon.titan-embed-text-v1",
        client=bedrock_runtime,
        region_name="us-east-1",
    )

## embed_queryメソッドの実行(埋め込み)
    print(embeddings.embed_query(text))

text = sys.argv[1]
generate_embeddings(text)
  • 実行結果例
$ python3 boto3-embeddings.py 東京
[1.15625, 1.15625, ''' 中略 ''' , 1.0078125]
$

関連文書を検索しつつ、Amazon BedrockのLLMに質問する(RAG)

LangChain

import boto3
import sys
from langchain_community.llms import Bedrock
from langchain.chains import RetrievalQA
from langchain_community.embeddings import BedrockEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.indexes import VectorstoreIndexCreator
from langchain_community.document_loaders import PyPDFDirectoryLoader


def retrival_generate_answer(question, load_dir):

## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## Bedrockのインスタンス化
    llm = Bedrock(
        model_id='anthropic.claude-v2:1',
        client=bedrock_runtime,
        model_kwargs={"max_tokens_to_sample": 4096},
        region_name="us-east-1",
    )

## BedrockEmbeddingsのインスタンス化
    embeddings = BedrockEmbeddings(
        model_id="amazon.titan-embed-text-v1",
        client=bedrock_runtime,
        region_name="us-east-1",
    )

## PyPDFDirectoryLoaderのインスタンス化
    pdf_loader = PyPDFDirectoryLoader(load_dir)

## VectorstoreIndexCreatorのインスタンス化
    index_creator = VectorstoreIndexCreator(
        vectorstore_cls=FAISS,
        embedding=embeddings
    )

## from_loadersメソッドの実行(ディレクトリ内のPDFを読み込む)
    index_from_loader = index_creator.from_loaders([pdf_loader])
## save_localメソッドの実行(インデックスファイルを保存)
    index_from_loader.vectorstore.save_local("/tmp/")

## load_localメソッドの実行(インデックスファイルの読み込み)
    faiss_index = FAISS.load_local("/tmp", embeddings)

## as_retrieverメソッドの実行(retrieverとして、FAISSのインデックスファイルを設定)
    retriever = faiss_index.as_retriever()

## from_chain_typeメソッドの実行
    qa = RetrievalQA.from_chain_type(
        llm=llm,
        # chain_type="map_reduce",
        retriever=retriever,
        # return_source_documents=True,
    )

## runメソッドの実行(PDFファイルを検索しつつ、質問に対する回答を生成)
    response = qa.run(question)

    print(response)

## 引数から質問を取得
question = sys.argv[1]
## 引数からPDFを読み込むディレクトリを取得
load_dir = sys.argv[2]
## retrival_generate_answer関数の実行
retrival_generate_answer(question, load_dir)
  • 実行結果例

~/Downloads/index-sourceには、以下のページをPDF化したものを配置しています。

https://www.serverworks.co.jp/people/ryooishi.html

$ ls -lrt ~/Downloads/index-source
total 12160f
-rw-r--r--@ 1 kazuya  staff  1130922 11 15 15:19 大石 良 - 株式会社サーバーワークス.pdf
$
$ python3 langchain-retrieval-qa.py サーバーワークスの社長は? ~/Downloads/index-source
 株式会社サーバーワークスの社長は、大石良(Ryo Ooishi)です。
大石良はサーバーワークスの代表取締役社長を務めています。
$

関連文書を検索しつつ、会話履歴を踏まえてAmazon BedrockのLLMに質問する(RAG)

LangChain

import boto3
import sys
from langchain_community.llms import Bedrock
from langchain_community.embeddings import BedrockEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.indexes import VectorstoreIndexCreator
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.chains.conversational_retrieval.base import ConversationalRetrievalChain
from langchain.memory.chat_message_histories import DynamoDBChatMessageHistory
from langchain.memory import ConversationBufferWindowMemory


def retrival_generate_answer(question, load_dir):
## bedrock-runtimeのインスタンス化
    bedrock_runtime = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

## Bedrockのインスタンス化
    llm = Bedrock(
        model_id='anthropic.claude-v2:1',
        client=bedrock_runtime,
        model_kwargs={"max_tokens_to_sample": 4096},
        region_name="us-east-1",
    )

## BedrockEmbeddingsのインスタンス化
    embeddings = BedrockEmbeddings(
        model_id="amazon.titan-embed-text-v1",
        client=bedrock_runtime,
        region_name="us-east-1",
    )

## PyPDFDirectoryLoaderのインスタンス化
    pdf_loader = PyPDFDirectoryLoader(load_dir)

## VectorstoreIndexCreatorのインスタンス化
    index_creator = VectorstoreIndexCreator(
        vectorstore_cls=FAISS,
        embedding=embeddings
    )

## from_loadersメソッドの実行(ディレクトリ内のPDFを読み込む)
    index_from_loader = index_creator.from_loaders([pdf_loader])
## save_localメソッドの実行(インデックスファイルを保存)
    index_from_loader.vectorstore.save_local("/tmp/")

## load_localメソッドの実行(インデックスファイルの読み込み)
    faiss_index = FAISS.load_local("/tmp", embeddings)

## as_retrieverメソッドの実行(retrieverとして、FAISSのインデックスファイルを設定)
    retriever = faiss_index.as_retriever()


## DynamoDBChatMessageHistoryクラスのインスタンス化
    chat_message_history = DynamoDBChatMessageHistory(
        table_name='Memory-DB',
        session_id="xxxxxxxxxxxxxxxx"
    )

## ConversationBufferWindowMemoryクラスのインスタンス化
    memory = ConversationBufferWindowMemory(
        k=5,
        chat_memory=chat_message_history,
        memory_key='chat_history',
        input_key='question',
        output_key='answer',
        return_messages=True,
    )

## from_llmメソッドの実行
    qa = ConversationalRetrievalChain.from_llm(
        llm=llm,
        retriever=retriever,
        memory=memory,
        return_source_documents=True,
        condense_question_llm=llm,
    )

## 関連文書を検索しつつ、会話履歴を踏まえた回答を生成
    response = qa({"question": question})

    print(f"""
## レスポンス
{response}

## レスポンスから回答だけ抽出
{response['answer']}
""")


## 引数から質問を取得
question = sys.argv[1]
## 引数からPDFを読み込むディレクトリを取得
load_dir = sys.argv[2]
retrival_generate_answer(question, load_dir)
  • 実行結果例
$ python3 langchain-conversation-history-rag-llm.py サーバーワークスの役員を1人教えて ~/Downloads/index-source

## レスポンス
{'question': 'サーバーワークスの役員を1人教えて', 'chat_history': [], 'answer': ' 株式会社サーバーワークスの役員として、会社概要には以下のような情報があります:\n\n代表取締役社長: 大石 良\n\nこのほかにも、取締役の羽柴孝、取締役の大塩啓行、監査等委員(社外)のいくつかの役職が紹介されています。\n\nしたがって、株式会社サーバーワークスの役員の1人として「代表取締役社長 大石 良」を教えました。ご質問の条件を満たす役員を1名答えることができました。', 'source_documents': [Document(page_content='2023/11/15 15:19 ⼤塩  啓⾏  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/hiroyukioshio.html 2/3代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也\nMikiya Inoue取締役 監査等委 員\n(社外)\n⽥中 優⼦\nYuko Tanaka取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎\nIchiro Terajima取締役 監査等委 員\n(社外)\n藤本 ひかり\nHikari Fujimoto\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報\nIR情報 採⽤情報役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/大塩 啓行 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 ⽻柴  孝  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/takashihashiba.html 2/3代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也\nMikiya Inoue取締役 監査等委 員\n(社外)\n⽥中 優⼦\nYuko Tanaka取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎\nIchiro Terajima取締役 監査等委 員\n(社外)\n藤本 ひかり\nHikari Fujimoto\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報\nIR情報 採⽤情報役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/羽柴 孝 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 ⼤⽯  良  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/ryooishi.html 2/3⽇経BP社 ウェブデザインの教科書\n他多数\nサーバーワークス 社⻑ブログ\n代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也取締役 監査等委 員\n(社外)\n⽥中 優⼦取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎取締役 監査等委 員\n(社外)\n藤本 ひかりブログ\n役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/大石 良 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 会社概要  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/corporate/ 4/11グパートナー(現 AWS プレミアティア サービスパートナー)に認定されるなど、この分野で先進的な取り組\nみを⾏っている企業として知られる存在になりつつあります。\n先の東⽇本⼤震災 では、震災後に過負荷でダウンしてしまった⽇本⾚⼗字社 のウェブサイトを、AWSを使っ\nて復旧。さらに3,200億円超の義援⾦を集めるシステムをわずか48時間で構築しました。これは、クラウドの\nもたらすスピードと⾼いセキュリティを両⽴した事例として広く知られるようになりました。\n震災の折、多くの企業で「技術者 がデータセンターに派遣される」ということが⾏われました。電⾞は⽌まり、\nタクシーによる移動もままならず、家族の安否もしれぬ状況でも、「サーバーの様⼦を⾒に⾏け」という会社\nからの命令が下ったのです。\n私たちは、⽣活を豊かにし、よりよい社会を築くためにコンピューターを利⽤しているはずです。ところが、実\n際にはコンピューターの場所に私たちの活動がしばられ、コンピューターのお守りをするために企業の貴重\nな⼈材が割かれ、コンピューターにはエアコンを当てながら⼈間は節電の名の下汗だくで仕事をしているの\nが現状です。\n⽇本⾚⼗字社様 のプロジェクトでは、シンガポールにシステムを⽴ち上げました。\n東京にいながら、家に居ながらにして海外のデータセンターで3,200億円の義援⾦を管理する仕組みを構\n築したのです。\n物理的な場所に関係なく、社会に必要なコンピューターシステムを迅速にデリバリーする。\nこれこそがクラウドの醍醐味だと、私は確信します。\nコンピューターの場所にしばられず、所有による制限にしばられず、⾃由にコンピューターを使いこなす「クラ\nウドというアイディア」をもっと世の中に広めたい。そして、より多くの企業がクラウドによって競争⼒が増し、\nそこではたらく社員のみなさんが「はたらきやすい環境になった」と喜んでいただける社会にしたい。\nそんな想いを、「クラウドで、世界を、もっと、はたらきやすく」という⾔葉に込めました。\n代表取締役社⻑ ⼤⽯ 良\n沿⾰\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN', metadata={'source': '/Users/kazuya/Downloads/index-source-2/会社概要 - 株式会社サーバーワークス.pdf', 'page': 3})]}

## レスポンスから回答だけ抽出
 株式会社サーバーワークスの役員として、会社概要には以下のような情報があります:

代表取締役社長: 大石 良

このほかにも、取締役の羽柴孝、取締役の大塩啓行、監査等委員(社外)のいくつかの役職が紹介されています。

したがって、株式会社サーバーワークスの役員の1人として「代表取締役社長 大石 良」を教えました。ご質問の条件を満たす役員を1名答えることができました。

$ python3 langchain-conversation-history-rag-llm.py もう1人教えて ~/Downloads/index-source

## レスポンス
{'question': 'もう1人教えて', 'chat_history': [HumanMessage(content='サーバーワークスの役員を1人教えて'), AIMessage(content=' 株式会社サーバーワークスの役員として、会社概要には以下のような情報があります:\n\n代表取締役社長: 大石 良\n\nこのほかにも、取締役の羽柴孝、取締役の大塩啓行、監査等委員(社外)のいくつかの役職が紹介されています。\n\nしたがって、株式会社サーバーワークスの役員の1人として「代表取締役社長 大石 良」を教えました。ご質問の条件を満たす役員を1名答えることができました。')], 'answer': ' 株式会社サーバーワークスの役員について、文脈から以下の情報が得られます。\n\n代表取締役社長: 大石 良\n取締役: 羽柴 孝\n\n他の役員は明確に示されていないため、もう1人の役員を特定することはできません。文脈から得られる情報が足りません。申し訳ありませんが、もう1人の役員を教えることはできません。', 'source_documents': [Document(page_content='2023/11/15 15:19 ⼤塩  啓⾏  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/hiroyukioshio.html 2/3代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也\nMikiya Inoue取締役 監査等委 員\n(社外)\n⽥中 優⼦\nYuko Tanaka取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎\nIchiro Terajima取締役 監査等委 員\n(社外)\n藤本 ひかり\nHikari Fujimoto\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報\nIR情報 採⽤情報役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/大塩 啓行 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 ⽻柴  孝  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/takashihashiba.html 2/3代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也\nMikiya Inoue取締役 監査等委 員\n(社外)\n⽥中 優⼦\nYuko Tanaka取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎\nIchiro Terajima取締役 監査等委 員\n(社外)\n藤本 ひかり\nHikari Fujimoto\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報\nIR情報 採⽤情報役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊<e4><ba><8b>例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/羽柴 孝 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 ⼤⽯  良  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/people/ryooishi.html 2/3⽇経BP社 ウェブデザインの教科書\n他多数\nサーバーワークス 社⻑ブログ\n代表取締役社⻑\n⼤⽯ 良\nRyo Ooishi\n取締役\n⽻柴 孝\nTakashi\nHashiba\n取締役\n⼤塩 啓⾏\nHiroyuki Oshio\n取締役 常勤 監査\n等委員(社外)\n井上 幹也取締役 監査等委 員\n(社外)\n⽥中 優⼦取締役 監査等委 員\n(社外)\n寺嶋 ⼀郎取締役 監査等委 員\n(社外)\n藤本 ひかりブログ\n役員紹介\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN\n選ばれる理由サービス AWS導⼊事例\nイベント・セミナーブログ会社情報 IR情報\n採⽤情報', metadata={'source': '/Users/kazuya/Downloads/index-source-2/大石 良 - 株式会社サーバーワークス.pdf', 'page': 1}), Document(page_content='2023/11/15 15:19 会社概要  - 株式会社サーバーワークス\nhttps://www.serverworks.co.jp/corporate/ 4/11グパートナー(現 AWS プレミアティア サービスパートナー)に認定されるなど、この分野で先進的な取り組\nみを⾏っている企業として知られる存在になりつつあります。\n先の東⽇本⼤震災 では、震災後に過負荷でダウンしてしまった⽇本⾚⼗字社 のウェブサイトを、AWSを使っ\nて復旧。さらに3,200億円超の義援⾦を集めるシステムをわずか48時間で構築しました。これは、クラウドの\nもたらすスピードと⾼いセキュリティを両⽴した事例として広く知られるようになりました。\n震災の折、多くの企業で「技術者 がデータセンターに派遣される」ということが⾏われました。電⾞は⽌まり、\nタクシーによる移動もままならず、家族の安否もしれぬ状況でも、「サーバーの様⼦を⾒に⾏け」という会社\nからの命令が下ったのです。\n私たちは、⽣活を豊かにし、よりよい社会を築くためにコンピューターを利⽤しているはずです。ところが、実\n際にはコンピューターの場所に私たちの活動がしばられ、コンピューターのお守りをするために企業の貴重\nな⼈材が割かれ、コンピューターにはエアコンを当てながら⼈間は節電の名の下汗だくで仕事をしているの\nが現状です。\n⽇本⾚⼗字社様 のプロジェクトでは、シンガポールにシステムを⽴ち上げました。\n東京にいながら、家に居ながらにして海外のデータセンターで3,200億円の義援⾦を管理する仕組みを構\n築したのです。\n物理的な場所に関係なく、社会に必要なコンピューターシステムを迅速にデリバリーする。\nこれこそがクラウドの醍醐味だと、私は確信します。\nコンピューターの場所にしばられず、所有による制限にしばられず、⾃由にコンピューターを使いこなす「クラ\nウドというアイディア」をもっと世の中に広めたい。そして、より多くの企業がクラウドによって競争⼒が増し、\nそこではたらく社員のみなさんが「はたらきやすい環境になった」と喜んでいただける社会にしたい。\nそんな想いを、「クラウドで、世界を、もっと、はたらきやすく」という⾔葉に込めました。\n代表取締役社⻑ ⼤⽯ 良\n沿⾰\nTOPニュー\nス JP資料ダウンロー\nドお問い合わ\nせ EN', metadata={'source': '/Users/kazuya/Downloads/index-source-2/会社概要 - 株式会社サーバーワークス.pdf', 'page': 3})]}

## レスポンスから回答だけ抽出
 株式会社サーバーワークスの役員について、文脈から以下の情報が得られます。

代表取締役社長: 大石 良
取締役: 羽柴 孝

他の役員は明確に示されていないため、もう1人の役員を特定することはできません。文脈から得られる情報が足りません。申し訳ありませんが、もう1人の役員を教えることはできません。

$

終わりに

今回は備忘として、LangChainの使い方を記載いたしました。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。