LangChain 大規模モデル アプリケーションのランディング実践 (2): LLM モジュールを使用してカスタム大規模モデルにアクセスし、ChatGLM を例にします

angChain バージョン: 0.0.147; (予期せず、LangChain は 2 回目のアップデートで 147 に更新されました)

1. 国内外の大型モデルリリースの現状

図 1 大規模モデルのタイムライン (2023-arxiv-A 大規模言語モデルの調査)

モデル名 企業/大学 リリースタイム
ERNIE Bot (文心一言) 百度 2023年3月
チャットGLM 清華大学 2023年3月
桐前文 アリ 2023年4月
モス 復旦大学 2023年4月

図 1 からわかるように、大規模モデル時代の始まりは、2019 年に Google が発売した T5 大規模モデルにまで遡り、22 年末に ChatGPT が発売され、オープン後に爆発的に普及しました。 23年初めにテスト。この時点で、本格的に大型モデルの急速な開発の時代に入りました。

2023年4月、OpenAI APIにより国内ユーザーの利用がさらにブロックされ、私の周りの多くの友人のOpenAIアカウントがブロックされました。そのため、徐々に国産大型モデルに目が移っていきました。国内の大型言語モデルは主に上記の表にいくつか挙げられますが、その中でも清華大学がリリースした ChatGLM-6B は比較的民間向けの大型モデル版であり、一定の効果を確保することを前提としてシングルカード展開にも対応しています。実験、ベースライン。

ChatGLM Github の紹介から[ChatGLM-6B, Github]、そのハードウェア要件は RTX3090 によって満たされることがわかります。

量子化レベル 存在する最小 GPU (推論) 最小 GPU メモリ (効率的なパラメータ微調整)
FP16 13GB 14GB

2. OpenAI に接続された LLM

OpenAI API の使用はますます困難になってきましたが、私は今でもアクセスのこの部分を日常的に書いています。

OpenAI 公式 Web サイトに登録して、対応する API キーを取得します。

2.1 Python 環境の依存関係

pip install langchain==0.0.147
pip install openai==0.27.4

2.2 LangChain を使用した GPT の呼び出し

import os

from langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI


# global environment
os.environ["OPENAI_API_KEY"] = "sk-*********************************"

# llm initialization
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

while True:
    human_input = input("(human): ")
    human_input = [HumanMessage(content=human_input)]
    ai_output = llm(human_input)
    print(f"(ai): {ai_output.content}")

アクセスにプロキシが必要な場合は、openai パッケージを通じて設定できます。コードは次のとおりです。

import os

import openai

from langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI

openai.proxy = {
    "http": "{proxy_ip}:{port}"
}

# global environment
os.environ["OPENAI_API_KEY"] = "sk-*********************************"

# llm initialization
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)

while True:
    human_input = input("(human): ")
    human_input = [HumanMessage(content=human_input)]
    ai_output = llm(human_input)
    print(f"(ai): {ai_output.content}")

3. ChatGLM に接続された LLM

ChatGLM は清華大学のチームによって発表された民間の大型モデルであり、1 枚の RTX3090 カードで導入でき、コード ベースはオープン ソースであり、現在の大型モデルの最良の代替品です。

3.1 ChatGLM のローカル展開

開発環境の準備

要件.txt:

pip install -r requirements.txt

モデルファイルの準備

方法 1: ハグフェイス モデル リポジトリからモデル ファイルを直接プルします (最初にGit LFS をインストールする必要があります。プル速度は非常に遅いため、推奨されません)。

git clone https://huggingface.co/THUDM/chatglm-6b

方法 2: ハグフェイス モデルからモデル実装を徹底的にプルし、清華倉庫からモデル パラメータ ファイルをダウンロードして、それを chatglm-6b フォルダに置き換えます。

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b
# 下载模型参数文件...
mv chatglm-6b/* THUDM/chatglm-6b/

方法 3:いいね + お気に入り + フォロー、コメント、モデル ファイルの Baidu クラウド ディスク リンクを非公開で共有します。

市内通話のモデル化

すべての準備ができたら、次のコードを使用してローカルで ChatGLM をテストできます (実際の状況に応じて使用されるグラフィック カード パラメータを忘れずに変更してください: CUDA_VISIBLE_DEVICES)

import os

from transformers import AutoTokenizer, AutoModel

os.environ["CUDA_VISIBLE_DEVICES"] = "2"

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()
human_input = "你好"
response, history = model.chat(tokenizer, human_input, history=[])

print(f"Human: {human_input}")
print(f"AI: {response}")

実行後、モデルの次の出力を取得できます。

Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████| 8/8 [00:07<00:00,  1.07it/s]
AI: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。

モデルサービスコール (Flask に基づく)

モデルサービスコードは次のとおりです

import os
import json

from flask import Flask
from flask import request 
from transformers import AutoTokenizer, AutoModel

# system params
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model.eval()

app = Flask(__name__)

@app.route("/", methods=["POST", "GET"])
def root():
    """root
    """
    return "Welcome to chatglm model."

@app.route("/chat", methods=["POST"])
def chat():
    """chat
    """
    data_seq = request.get_data()
    data_dict = json.loads(data_seq)
    human_input = data_dict["human_input"]

    response, _ = model.chat(tokenizer, human_input, history=[])

    result_dict = {
        "response": response
    }
    result_seq = json.dumps(result_dict, ensure_ascii=False)
    return result_seq

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8595, debug=False)

サービス開始後に次のログを取得できます。

Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 8/8 [00:07<00:00,  1.03it/s]
 * Serving Flask app 'chatglm_server'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8595
 * Running on http://10.158.99.12:8595
Press CTRL+C to quit

POST を使用して Flask サービスをリクエストすると、次の戻り値が得られます。

$ curl -d '{"human_input": "你好"}' http://127.0.0.1:8595/chat
{"response": "你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"}

3.2 LangChain を使用して ChatGLM を呼び出す

セクション 2.1 では、LangChain が OpenAI インターフェイスを直接呼び出す例を見てきましたが、このセクションでは、独自の大規模な言語モデルがある場合に、後で LangChain の他のモジュールと連携するために、LangChain にアクセスする方法を紹介します。

答えは、LLM モジュールです。

LLM モジュールを使用して ChatGLM をカプセル化し、モデル サービスをリクエストし、主に 2 つの関数をリファクタリングします。

  • _call: モデル呼び出しのメイン ロジック。ユーザー文字列を入力し、モデルによって生成された文字列を出力します。
  • _identifying_params: モデルの説明情報を返します。通常は、モデルの主要パラメータを含む辞書を返します。
import time
import logging
import requests
from typing import Optional, List, Dict, Mapping, Any

import langchain
from langchain.llms.base import LLM
from langchain.cache import InMemoryCache

logging.basicConfig(level=logging.INFO)
# 启动llm的缓存
langchain.llm_cache = InMemoryCache()

class ChatGLM(LLM):
    
    # 模型服务url
    url = "http://127.0.0.1:8595/chat"

    @property
    def _llm_type(self) -> str:
        return "chatglm"

    def _construct_query(self, prompt: str) -> Dict:
        """构造请求体
        """
        query = {
            "human_input": prompt
        }
        return query

    @classmethod
    def _post(cls, url: str,
        query: Dict) -> Any:
        """POST请求
        """
        _headers = {"Content_Type": "application/json"}
        with requests.session() as sess:
            resp = sess.post(url, 
                json=query, 
                headers=_headers, 
                timeout=60)
        return resp

    
    def _call(self, prompt: str, 
        stop: Optional[List[str]] = None) -> str:
        """_call
        """
        # construct query
        query = self._construct_query(prompt=prompt)

        # post
        resp = self._post(url=self.url,
            query=query)
        
        if resp.status_code == 200:
            resp_json = resp.json()
            predictions = resp_json["response"]
            return predictions
        else:
            return "请求模型" 
    
    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """Get the identifying parameters.
        """
        _param_dict = {
            "url": self.url
        }
        return _param_dict

if __name__ == "__main__":
    llm = ChatGLM()
    while True:
        human_input = input("Human: ")

        begin_time = time.time() * 1000
        # 请求模型
        response = llm(human_input, stop=["you"])
        end_time = time.time() * 1000
        used_time = round(end_time - begin_time, 3)
        logging.info(f"chatGLM process time: {used_time}ms")

        print(f"ChatGLM: {response}")

LLM モジュールを使用してモデル インターフェイスをカプセル化する利点の 1 つは、LangChain の他のモジュールとのその後の連携が容易になることです。これは LangChain キャッシュの例です。LangChain は LLM モジュールのキャッシュを構成します。同じ質問が 2 回目に行われた場合、モデルはすぐに答えを与えることができます。

Cache を開始するには、次の 2 行のコードをスクリプトに追加する必要があります。

from langchain.cache import InMemoryCache

# 启动llm的缓存
langchain.llm_cache = InMemoryCache()

キャッシュを開始した後の ChatGLM のアクセス効果は次のとおりです。モジュールが同じ質問に対して 2 回目にリクエストされたとき、モジュールがユーザーの質問を処理するのにかかる時間は 1 桁短縮されます。

Human: 你好
INFO:root:chatGLM process time: 993.685ms
ChatGLM: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
Human: 你好
INFO:root:chatGLM process time: 0.116ms
ChatGLM: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。

参照

一緒にAIを学び、私に注目してアップデートし続けてください

 

おすすめ

転載: blog.csdn.net/zhaomengsen/article/details/130585397