[技術日誌]LangChainでReActとtoolsを使いPDFの検索と思考を見る & なんj論文レビュー
酔っ払いすぎて投稿するのを忘れたので,今投稿
LangChainでReActとtoolsを使いPDFの検索と思考を見る
複数のPDFをどのように参照したのかも知りたいので、LangChainでReActとtoolsを組み合わせみました。
VertexAIのキー設定
import os
os.environ['VertexAI_PROJECT'] = "****************"
os.environ['VertexAI_LOCATION'] = "****************"
os.environ['VertexAI_MODEL'] = "gemini-1.5-flash-001"
PDF検索のツールを作成
import vertexai
from vertexai.generative_models import GenerativeModel, Part
from langchain.tools import BaseTool
class PDFSearch1(BaseTool):
name: str = "PDF検索1"
description: str = "質問をもとに⚪︎⚪︎⚪︎⚪︎⚪︎⚪︎を検索することに利用します。"
def _run(self, question: str) -> str:
# PDFの情報
pdf_file1 = Part.from_uri(
"gs://pdf/search1.pdf",
mime_type="application/pdf",
)
# モデルの設定
vertexai.init(project=os.environ['VertexAI_PROJECT'],
location=os.environ['VertexAI_LOCATION'])
model = GenerativeModel(model_name=os.environ['VertexAI_MODEL'])
prompt = f'''
PDFは⚪︎⚪︎⚪︎⚪︎⚪︎⚪︎についての資料です。
質問に関連する情報を抽出して簡単にまとめてください。
また、回答を作成する時は、PDF以外の情報を使わないでください。
質問文:
{question}
'''[1:-1]
response = model.generate_content([pdf_file1, prompt])
return response.text
class PDFSearch2(BaseTool):
name: str = "PDF検索2"
description: str = "質問をもとに⚪︎⚪︎⚪︎⚪︎⚪︎⚪︎を検索することに利用します。"
def _run(self, question: str) -> str:
# PDFの情報
pdf_file2 = Part.from_uri(
"gs://pdf/search2.pdf",
mime_type="application/pdf",
)
# モデルの設定
vertexai.init(project=os.environ['VertexAI_PROJECT'],
location=os.environ['VertexAI_LOCATION'])
model = GenerativeModel(model_name=os.environ['VertexAI_MODEL'])
prompt = f'''
PDFは⚪︎⚪︎⚪︎⚪︎⚪︎⚪︎についての資料です。
質問に関連する情報を抽出して簡単にまとめてください。
また、回答を作成する時は、PDF以外の情報を使わないでください。
質問文:
{question}
'''[1:-1]
response = model.generate_content([pdf_file2, prompt])
return response.text
エージェントの作成
from langchain import hub
from langchain_google_vertexai import ChatVertexAI
from langchain.agents import AgentExecutor, create_react_agent
# PDF検索のインスタンスを作成
pdf_search1 = PDFSearch1()
pdf_search2 = PDFSearch2()
# LLMの指定
# max_tokens=Noneではflashの上限8192以下でもトークンオーバーしたので、8192で指定した
llm = ChatVertexAI(
project = os.environ['VertexAI_PROJECT'],
location = os.environ['VertexAI_LOCATION'],
model=os.environ['VertexAI_MODEL'],
temperature=0,
max_tokens=8192,
max_retries=6,
stop=None,
)
# 0-shotのReActのプロンプト
prompt = hub.pull("hwchase17/react")
# Agentを作成
tools = [pdf_search1, pdf_search2]
agent = create_react_agent(llm, tools, prompt)
# AgentExecutorを作成
# 過程がみたいので、verbose=True
# toolsの結果もみたいので、return_intermediate_steps=True
agent_executor = AgentExecutor(agent=agent,
tools=tools,
verbose=True,
return_intermediate_steps=True)
ReActで検索実行
# エージェントに質問を渡して実行
question = "************"
result = agent_executor.invoke({"input": question})
# 結果を確認
# 最終回答
output = result["output"]
print("【回答】", output)
# ツールの回答
for tool_agent, tool_output in result["intermediate_steps"]:
print(f"【{tool_agent}の回答】{tool_output}")
全部のPDFを見てくれるわけではなく、どれか一つを選ぶようになっているようです。
ReActのテンプレートプロンプト(hub.pull("hwchase17/react"))を更新して全てのPDFを使うようにしよう。
なんj論文レビュー
CogVideo: Transformers によるテキストからビデオへの生成のための大規模な事前トレーニング
SOTA:https://paperswithcode.com/paper/cogvideo-large-scale-pretraining-for-text-to
この記事が気に入ったらサポートをしてみませんか?