👋

【AI_32日目_2回目】大規模言語モデル1冊目

2024/11/21に公開

こんにちは投資ロウトです。

背景

大規模言語モデルを利用したプロトタイプの作成は完了しました。
ただまだまだ改良の余地や理解しなければならないことも多いので、引き続き学習していきます。

Data connection

・Data connection・・・LLMと外部のデータを接続するための機能

LLMの学習されている情報までしか理解することができないので、contextなどに含めばそれを踏まえた上での回答はできますが、LLMにはトークン数の最大値の制限があるという制約もあるとのことで、入力に関係する文書を検索してcontextに含める手法があるとのことでした(RAG)。

Data connectionではVector storeを使って、文書をベクトル化して保存し、それをcontextに含めるような方法をLang Chainが提供しているとのことです。

Data connectionで提供していること
・ドキュメントを読み込む
・ドキュメントの変換をかける
・ドキュメントのベクトル化
・ベクトル化したものを保存しておく
・入力テキストを検索する

DocumentLoaderが読めるもの
・テキスト
・パワポ
・HTML
・PDF
・画像
・ディレクトリ
・Webサイト
・サイトマップ
・S3
・BigQuery
・Google Drive
・confluence
・Notion
・Slack
・Hugging Face Hub
※他にも色々種類があるとのことでした。

・Document transformers・・・文書などをチャンクなどで分割など何らかの変換をかけること

できることの例
・HTML→プレーンテキスト
・類似するものを除外
・ドキュメントを翻訳
・ドキュメントからQ&Aの作成

・Text embedding models・・・テキストをベクトル化する

・Vector stores・・・保存先
※chromaというオープンソースがあるとのこと。

・Retrievers・・・テキストに関するドキュメントを得るインタフェースとのこと。

・RetrievalQA・・・chatbotのように、ユーザーが何か入力を入れてドキュメントを返却するためのインタフェース

Agents

・Agentsを使うと、必要に応じて様々なツールを使いながら、LLMに動作してもらうことが可能。

サンプルのエラー内容

ValueError: terminal is a dangerous tool.
You cannot use it without opting in by setting allow_dangerous_tools to True.
Most tools have some inherit risk to them merely
because they are allowed to interact with the "real world".Please refer to LangChain security guidelines to
https://python.langchain.com/docs/security.Some tools have been
designated as dangerous because they pose risk that is notintuitively obvious.
For example, a tool that allows an agent to make requests to the web,
can also be used to make requests to a server that is only accessible
from the server hosting the code.Again,
all tools carry some risk, and it's your responsibility to
understand which tools you're using and the risks associated with them.

エラー原因はterminalツールが危険と見なされているため、「allow_dangerous_tools=True」を設定する必要があるとのことです。

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.chat_models import ChatOpenAI

chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
tools = load_tools(["terminal"], allow_dangerous_tools=True) # オプションを追加
agent_chain = initialize_agent(
    tools,
    chat,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)

result = agent_chain.run("sample_dataディレクトリにあるファイル一覧を教えて")
print(result)

今度もエラー

ModuleNotFoundError: No module named 'langchain_experimental'

During handling of the above exception, another exception occurred:

ImportError: BashProcess has been moved to langchain experimental.To use this tool, install langchain-experimental with `pip install langchain-experimental`.

どうやら一部の機能がlangchain-experimentalに移動されたよう。
結構昔の記事ですが、理由も記載してくれていますね。

https://qiita.com/yoshidashingo/items/ddc98900a782bff83d2d

!pip install langchain_experimental

先ほどのソースを再度実行すると、成功しました。

terminal・・・Bashなどのシェルが実行できるツールとのことです。確かに危険極まりないので、trueのフラグを入れるのも理解できますね。

Agentsのツール例
・terminal・・・シェルを使わせる
・Python_REPL・・・pythonを使わせる
・google_search・・・ググれる
・Wikipedia・・・wikiから調べれる
・human・・・人間に入れさせる

また以下のサイトに記載のあるように、今時はおそらくLangGraphを使うようです。まだまだ先に進んでいかないとダメなようですね。

https://python.langchain.com/docs/concepts/agents/

・HumanApprovalCallbackHandler・・・Human-in-the-loopを導入するためにLangChainが用意したもの

ignore_agent・・・エージェントのコールバックを無視するかどうか。

ignore_chain・・・チェーンコールバックを無視するかどうか。

ignore_chat_model・・・チャット モデルのコールバックを無視するかどうか。

ignore_custom_event・・・カスタムイベントを無視します。

ignore_llm・・・LLM コールバックを無視するかどうか。

ignore_retriever・・・リトリーバーのコールバックを無視するかどうか。

ignore_retry・・・再試行コールバックを無視するかどうか。

raise_error・・・例外が発生した場合にエラーを発生させるかどうか。

run_inline・・・コールバックをインラインで実行するかどうか。

https://api.python.langchain.com/en/latest/community/callbacks/langchain_community.callbacks.human.HumanApprovalCallbackHandler.html

・Toolkits・・・同時に使うツール

https://python.langchain.com/v0.1/docs/integrations/toolkits/

例として
・Azureの機能
・Gmailのメール検索や送信
・OpenAPIの各種API操作
・SQL等の実行
・ベクターストアの検索
などなど行えるそうです。

・DuckDuckGoの利用処理を実行するとエラーが発生

エラー内容

/usr/local/lib/python3.10/dist-packages/duckduckgo_search/duckduckgo_search.py in _get_url(self, method, url, params, content, data)
    130         self._exception_event.set()
    131         if resp.status_code in (202, 301, 403):
--> 132             raise RatelimitException(f"{resp.url} {resp.status_code} Ratelimit")
    133         raise DuckDuckGoSearchException(f"{resp.url} return None. {params=} {content=} {data=}")
    134 

RatelimitException: https://links.duckduckgo.com/d.js?q=%E5%A4%A7%E9%98%AA%E3%81%AE%E5%A4%A9%E6%B0%97&kl=wt-wt&l=wt-wt&p=&s=0&df=y&vqd=4-71110336825093689288152065431522455765&bing_market=wt-WT&ex=-1 202 Ratelimit

エラー起きたソース

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.chat_models import ChatOpenAI

chat = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
tools = load_tools(["ddg-search"])
agent_chain = initialize_agent(
    tools,
    chat,
    agent=AgentType.OPENAI_MULTI_FUNCTIONS
)

result = agent_chain.run("東京と大阪の天気を教えて")
print(result)

以下で同じようなエラーの解説あり

https://github.com/crewAIInc/crewAI/issues/136

上記のリンクにあるように、以下をして、colabを再起動すると、上手くいくようになりました。
※処理は特に変えなくてもよかったです。

pip install --upgrade --quiet duckduckgo-search

おそらくにはなりますが、「OPENAI_MULTI_FUNCTIONS」が2回以上実行するものとのことで、それがDuckDuckgoに影響をしたのかもしれませんね。

LLMのアプリケーション

デモを簡単に作ることはできるそうですが、本番レベルにすると評価という課題が発生するとのことでした。

また評価に関してはLangSmithでやるのがググると一般的なように見えました。

https://zenn.dev/umi_mori/books/prompt-engineer/viewer/langchain_evaluations

https://python.langchain.com/v0.1/docs/guides/productionization/evaluation/

と一旦以上で区切りがいいので、区切りたいと思います。ご精読頂きましてありがとうございました。焦らずコツコツ自分のペースで頑張っていきたいと思います。

Discussion