title: LangChainでデータベースベースのQ&Aロボットを構築する(4): プロキシ経由で外部ツールを利用する

前のチュートリアルでは、非常に強力な動作パターンである ReAct システムを紹介しましたが、LLM にどのように考えて行動するかを伝えるために多くの例を記述する必要があります。また、このパターンに従うには、次のように記述する必要もあります。テキストを分析して生成するコード、関数の呼び出し、プロンプトの結合など、これらのタスクは非常に面倒で時間がかかります。LangChain は、これらの手順を非表示にし、この一連のアクションを「エージェント」にカプセル化するのに役立ちます。使用できるツールとその機能を提供するだけで、LLM にこれらのタスクを自動的に完了させることができます。このようにして、コードは簡潔で読みやすくなり、柔軟性が高まります。

エージェント

いわゆるプロキシは、使用できる一連の動作とツールをカプセル化するもので、これにより、これらのアクションがどのように完了するかを気にせずに、単純なインターフェイスを通じてこれらのアクションを呼び出すことができます。これにより、コードがより簡潔になり、読みやすくなり、柔軟性が高まります。次に、ReAct データベースとベクター データベースを組み合わせて、エージェントの使用方法を紹介します。

準備

前と同様に、環境変数を設定することから始めます。

# set the environment variables needed for openai package to know to reach out to azure
import os

os.environ["OPENAI_API_TYPE"] = "azure"
os.environ["OPENAI_API_BASE"] = "https://<your-endpoint.openai.azure.com/"
os.environ["OPENAI_API_KEY"] = "your AzureOpenAI key"
os.environ["OPENAI_API_VERSION"] = "2023-03-15-preview"

次に、最初に llm クラスを作成しましょう。

from langchain.chat_models import AzureChatOpenAI
from langchain.embeddings import OpenAIEmbeddin Whether to return only outputs in the
                response. If True, only new keys generated by this chain will be
                returned. If False, both input keys and new keys generated by this
                chain will be returned. Defaults to False.gs

llm = AzureChatOpenAI(deployment_name="gpt-35-turbo", temperature=0)
embeddings = OpenAIEmbeddings(deployment="text-embedding-ada-002", chunk_size=1)

ベクトル データベースは前のチュートリアルですでに作成されているため、from_existing_indexデータベースに直接接続します。これは、index_name以前にデータベースを作成したときに指定した名前です。また、データベースごとに連携方法が異なる場合がありますので、詳細は各データベースのドキュメントを参照してください。

from langchain.vectorstores.redis import Redis

rds = Redis.from_existing_index(
    embeddings, redis_url="redis://localhost:6379", index_name="link"
)
retriever = rds.as_retriever()

ビルドツール

プロキシを使用すると llm が外部ツールを使用できるようになりますが、最初にツールを作成し、ツールの説明を記述します。私たちの目的は、llm が質問に基づいてデータベースから回答を取得できるようにすることなので、作成するツールはこれに関連するものでなければなりません。レトリーバーの検索機能を関数にラップしてツールとして使用することもできますが、前のチュートリアルで紹介したチェーンを使用することもできます。RetrievalQAその出力は文字列であり、関連する情報が最初に整理されています。レトリーバーよりも効率的です。

from langchain.chains import RetrievalQA

qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever)

次に、Tool上で作成したチェーンを でラップします。このうちfunc、パラメータはエージェント システムにどの関数を呼び出すかを指示するもので、descriptionこれがこのツールの説明です。パッケージ化されたツールをリストに入れて、どのツールが使用できるかをシステムに伝えます。

from langchain.agents import Tool

tools = [
    Tool(
        name="Contract QA System",
        func=qa.run,
        description="useful for when you need to answer questions about contracts."
    )
]

プロキシを作成する

initialize_agentこの関数を使用してプロキシを作成します。ここのパラメータagentは、作成したいエージェントのタイプをシステムに伝えるものです。ここで作成するものは、チャット モデルを使用しているため、CHAT_ZERO_SHOT_REACT_DESCRIPTION名前の はCHATこれがチャット エージェントであることを示し、プロンプトはチャット モデルを使用してZERO_SHOTいないことを示します。例を書きますが、llm の動作をブートするための説明のみを使用します。

agent_chain = initialize_agent(
    tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)

次に、runメソッドを使用してエージェントを実行します。

agent_chain.run("在什么情况下可以单方面解除合同?")
> Entering new  chain...
Thought: This question is asking about the circumstances under which a contract can be unilaterally terminated.

Action:
\```
{
  "action": "Contract QA System",
  "action_input": "在什么情况下可以单方面解除合同?"
}
\```


Observation: 根据文本,可以单方面解除合同的情况包括:

- 在承担国家重大科研项目期间;
- 掌握重大科技成果关键技术和资料,未脱离保密期;
- 被审查期间或因经济问题未作结案处理之前;
- 合同订立时所依据的客观情况发生重大变化,致使合同无法履行,经甲乙双方协商不能就变更合同达成协议的;
- 甲方提出解除本合同,乙方同意解除的;
- 乙方患病或者非因工负伤,医疗期满后,不能从事原工作也不能从事由甲方安排的其他工作,甲方单方面解除本合同的;
- 乙方年度考核或者聘期考核不合格,又不同意甲方调整其工作岗位的;
- 在试用期内被证明不符合本岗位要求;
- 连续旷工超过 10 个工作日或者 1 年内累计旷工超过 20 个工作日的;
...

Final Answer: 根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。

> Finished chain.

'根据文本,可以单方面解除合同的情况有很多种,包括在承担国家重大科研项目期间、合同订立时所依据的客观情况发生重大变化、甲方提出解除本合同且乙方同意解除等。此外,乙方在试用期内、考入普通高等院校、被录用或者选调为公务员、依法服兵役的情况下也可以随时单方面解除合同。如果乙方提出解除合同未能与甲方协商一致,乙方应当坚持正常工作,继续履行合同;6个月后再次提出解除合同仍未能与甲方协商一致的,即可单方面解除合同。'

このようにして、ReAct のプロセスを簡単に完了でき、実際にソースから答えを取得できます。LangChain を使用すると、簡潔なコードを使用してこのような複雑なタスクを完了でき、プロンプトを作成する必要がないため、ビジネス ロジックにさらに集中できます。

おすすめ

転載: blog.csdn.net/chenjambo/article/details/131908114