LLMでのツール呼び出し
from langchain_core.tools import tool |
ツールをもったエージェントの作成
from langchain.agents import AgentExecutor, create_tool_calling_agent |
from langchain_core.tools import tool |
from langchain.agents import AgentExecutor, create_tool_calling_agent |
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage |
プロンプトの一部を可変にするには、プロンプトテンプレートを使う。
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, MessagePlaceholder, HumanMessagePrompTemplate |
たとえば、キーchat_historyはinvokeして、随時バリューのリストにはメッセージをアペンドする
あるrunnable
であるsome_runnable
があるとき,会話履歴を組み込むには次の形にする.
from langchain_core.runnables.history import RunnableWithMessageHistory |
RunnableWithMessageHistory
は引数にとったrunnable
をラップする造りである.
prompt
を引数に持ったsome_runnable
では,prompt
を呼び出すときにhistory
を組み入れる.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder |
from langchain_community.chat_message_histories import ChatMessageHistory |
全履歴をとり続けるとトークンを浪費するので,ChatMessageHistory
のところは改変の必要があるかもしれない.
SQLiteのサンプル.
まず,データベースに接続を行う
from langchain_community.utilities import SQLDatabase |
ここで,llm = ChatOpenAI(model = model, temperature = temperature)
が与えられているとして,
from langchain_community.agent_toolkits import create_sql_agent
agent_executor = create_sql_agent(llm=llm, db=db, agent_type="tool-calling", verbose=True)
agent_executor.invoke({"input": "質問文"})
とすると,SQLを生成して推論を行う.
FewShotでは以下のような様式で若干の応答例を与える.
from langchain_core.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate |
以上の準備の上で,実際の問いかけを行うプロンプトで次のようにする.
prompt = ChatPromptTemplate.from_messages( |
import operator |
from langgraph.graph import StateGraph |
graph.add_node("ノードの名前", function_name_as_node) |
graph.add_edge("ソースとなるノード名", "ターゲットとなるノード名") |
graph.set_entry_point("ノード名") |
from langgraph.graph import END |
graph.add_conditional_edges( |
compiled_graph = graph.compile() |
from langgraph.graph import StateGraph |
ここで,コメントアウトしているコンフィグの切り替えがない場合,同一のスレッドIDなのでresponse_1とresponse_2では記憶が引き継がれた回答を得る.
もしアンコメントすれば,スレッドが別れるので,記憶は引き継がれない.
質問に対するひとまずの回答をプロンプト | モデル | パーサ
で応答させ,これを仮説とみなす.
その質問をRunnablePassthrough
で素通りさせたRunnableParallel
を用意すれば,先の仮説チェーンを検索器に渡したコンテキストと当初の質問が対になり,仮説的思考が行われたと言える.
質問文を与えて検索クエリを複数生成するというチェーンを作る.
このチェーンを検索器.map()
メソッドに連結すると,複数の検索結果を得る.
検索結果は何らかの方法で並び替えたり,絞り込むことも有用.
異なる検索器を用意してルーティングを行ったり,類似度の評価方法が異なる検索器での結果を比較させることができる.
from langchain_openai import ChatOpenAI |
穴埋めされて変換された後のメッセージ部分は次のような形のイメージ
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage |
print
の行を次に差し替え.
for chunk in model.stream(messages): |
MessagesPlaceholder
をインポートして,メッセージに履歴となる部分を挿入する.
_
from langchain_core.prompts import MessagesPlaceholder |
キーとしたchat_history
でインボークする.
prompt_value = prompt.invoke( |
from langchain_openai import ChatOpenAI |
次のようにクラスを作って,それを埋めるチェーンを作ることができる.
from pydantic import BaseModel, Field |
GitLoader
を使用する例.
from langchain_community.document_loaders import GitLoader |
ここで,
docs = loader.load() |
とするとフィルタで絞り込まれた全文書が返る.
from langchain_text_splitters import CharacterTextSplitter |
from langchain_openai import OpenAIEmbeddings |
retriever = db.as_retriever() |
以上で,クエリのベクトルの類似度が高い文脈を掬い上げる.
チェーンの要素は抽象基底クラスRunnableを継承している.
連結部で入出力の型が揃っていれば,次のようにチェーン同士を直列繋ぎにできる.
chain_a = a1 | a2 | a3 |
独自関数some_func
があるとして,RunnableLambda
を用いた
from langchain_core.runnables import RunnableLambda |
または,自動変換により単に
chain = a | b | c | some_func |
としてチェーンに組み込める.
次のようにデコレータで書いておくことも可能である.
from langchain_core.runnables import chain |
RunnableParallel
でチェーンを並列繋ぎにできる.
from langchain_core.runnables import RunnableParallel |
RunnablePassthrough
のインポートは次のように行います.
from langchain_core.runnables import RunnablePassthrough |
並列で繋ぐものの1つをRunnablePassthrough
にしておくと,入力値を次工程に引き継げます.
例えば,ある質問を入力したとき,RunnablePassthrough
と検索を並列にすると,次工程へ元の質問文と検索結果をペアで渡すことができます.
渡すものと出力を両方保持して最終出力としたい場合は,RunnablePassthrough.assign
メソッドが使えます.
chain = 入力 | RunnablePassthrough.assign(answer = 出力用チェーン) |
とすると,実行結果は出力用チェーンからの出力結果と入力をあわせた辞書を出力します.
def some_function(arg1, arg2): |
tools = [ |
tools
を加えたときのレスポンスをまず得る.
from openai import OpenAI |
ここで,first_response
にてツールを使いたいtool_calls
というレスポンスが返ってくるものとする.
このレスポンスをメッセージに加えておく.
first_response_message = first_response.choices[0].message |
次に,callされた関数群のレスポンスをメッセージに加える.
import json |
以上のtool使用後の結果を含んだメッセージを再度処理にかけてレスポンスを
second_response = client.chat.completions.create( |
として得て,
print(second_response.to_json(indent=2)) |
などで出力するとよい.
from openai import OpenAI |
次のようにstream = True
とする.
response = client.chat.completions.create( |
print
は次のように変更する.
for r in response: |
次のようにresponse_format = {"type": "json_object"}
とする.
response = client.chat.completions.create( |
次のように{"type": "image_url", "image_url": {"url": image_url}}
を与える.
response = client.chat.completions.create( |
One cat just leads to another.
(Ernest Hemingway)
色鉛筆塗り