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:
- ChatGLMコードベースからrequirements.txtをコピーします。
- 参考:https://github.com/THUDM/ChatGLM-6B/blob/main/requirements.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,很高兴见到你,欢迎问我任何问题。
参照
- [ChatGLM-6B、Github] https://github.com/THUDM/ChatGLM-6B
- [LLM の調査、arxiv、2023] 大規模言語モデルの調査
一緒にAIを学び、私に注目してアップデートし続けてください