チャットGLM-6B+ラングチェーン戦闘

目的:もともとChatGLM-6Bを使用しており、許容できるテキスト長に制限があるため、LangChainを組み合わせて長文生成要約を実現する予定 方法:step1:LangChainでlangchain.llms.base.LLMを継承するようにGLMをカスタマイズし、
ロード
するstep2: LangChain
mapreduce メソッドを使用してテキストをブロックに分割し、要約を作成し、結果を出力します
使用したマシン リソース: T4 グラフィックス カード (16G ビデオ メモリ)
と参考資料:
ChatGLM-6B:
ModelScope: ChatGLM- 6B
LangChain:
LangChain:要約
LangChain: 要約ノートブック

  1. glm 環境の準備
    指定した Python 環境に次の依存関係を必ずインストールしてください。
# 安装pytorch
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia


# 安装modelscope
pip install modelscope==1.4.3 -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 安装transformers
pip install protobuf==3.20.0 transformers==4.26.1 icetk cpm_kernels
# 安装charset-normalizer
python -m pip install charset-normalizer==2.1.0
# 安装langchain
pip install langchain
模型文件下载到/data/THUDM/chatglm-6b/下
可以使用以下代码先下载到临时目录,然后mv到自定义目录下:
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
pipe = pipeline(task=Tasks.chat, model='ZhipuAI/ChatGLM-6B', model_revision='v1.0.7')
  1. チャットGLM-6B + ラングチェーン

2.1 langchain.llms.base.LLM を継承し、新しい GLM クラスを作成して
_call メソッドを書き換えます。独自のモデルをロードし、出力結果のみを制限します (chatglm の元の出力は直接 str ではなく、langchain ではモデルが str を返す必要があります) result は str: """ である必要があります。LLM ラッパーはプロンプトを受け取り、文字列を返す必要があります。" "")
具体的なコード:

from langchain import LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate
from langchain.llms.base import LLM
from transformers import AutoTokenizer, AutoModel, AutoConfig
from typing import Any, Dict, List, Mapping, Optional, Tuple, Union
from torch.mps import empty_cache
import torch

class GLM(LLM):
    max_token: int = 2048
    temperature: float = 0.8
    top_p = 0.9
    tokenizer: object = None
    model: object = None
    history_len: int = 1024
    
    def __init__(self):
        super().__init__()
        
    @property
    def _llm_type(self) -> str:
        return "GLM"
            
    def load_model(self, llm_device="gpu",model_name_or_path=None):
        model_config = AutoConfig.from_pretrained(model_name_or_path, trust_remote_code=True)
        self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path,trust_remote_code=True)
        self.model = AutoModel.from_pretrained(model_name_or_path, config=model_config, trust_remote_code=True).half().cuda()

    def _call(self,prompt:str,history:List[str] = [],stop: Optional[List[str]] = None):
        response, _ = self.model.chat(
                    self.tokenizer,prompt,
                    history=history[-self.history_len:] if self.history_len > 0 else [],
                    max_length=self.max_token,temperature=self.temperature,
                    top_p=self.top_p)
        return response

2.2 llm オブジェクトのインスタンス化とモデルのロード

import sys

modelpath = "/data/THUDM/chatglm-6b/"
sys.path.append(modelpath)
llm = GLM()
llm.load_model(model_name_or_path = modelpath)

2.3 langchain出力と連携する

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.docstore.document import Document
from langchain.chains.summarize import load_summarize_chain

with open("政府工作报告.txt") as f:
    report_2023 = f.read()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(report_2023)
docs = [Document(page_content=t) for t in texts]
prompt_template = """对下面的文字做精简的摘要:

    {
    
    text}

    """

PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
summ = chain({
    
    "input_documents": docs}, return_only_outputs=True)
print(summ['output_text'])

このうち、政府活動報告書.txt は 2023 年政府活動報告書_中国政府 Web サイトからのものです: https://www.gov.cn/zhuanti/2023lhzfgzbg/index.htm

2.4 成果
本稿では、中国政府が有効需要不足問題への対処、自動車消費の下支え、建物の確実な納入促進、民生安定化などの施策を講じてきた過去5年間の中国経済発展の成果を紹介する。生計、環境保護の強化、生態系の回復など。政府はまた、付加価値税還付額や融資利息の減額など、企業の負担を軽減する措置を導入した。記事は、中国式近代化の促進、経済発展の質と量の向上、人民生活の改善、社会情勢全体の安定など、中国政府のマクロ経済政策目標を紹介している。新しい王冠の流行予防・抑制政策には、ワクチンの反復改良と新薬の開発が含まれており、流行の予防・抑制と高齢者、子供、基礎疾患のある集団の医療に重点を置き、大衆の医療ニーズを確保する。病気。政府は内需の拡大、近代産業システムの構築の加速、国有資産と国有企業の改革の深化、民間企業の財産権と起業家の権利と利益の保護、奨励と支援に重点を置く。民間経済と民間企業の発展と成長、市場の期待を安定させ、市場の信頼を高める。

実戦2
フレームワークアドレス:https ://github.com/noobdawn/langchain_ChatGPT

Langchain+ChatGLM-6B トライアル

私たちは皆、langchain ChatGLM-6B とは何かを知っています。これは、清華大学によって開始された 62 億のパラメーターを備えたオープンソースの大規模言語モデルです。では、ラングチェーンとは何でしょうか? Langchain は言語モデルベースのアプリケーション開発フレームワークであり、次の特徴があります。

データ認識: 言語モデルを他のデータ ソースと接続します。
自律性: 言語モデルが環境と対話できるようにします。
ラングチェーン フレームワークは、上記の原則に基づいて設計されています。

これらの機能により、langchain は特定のファイルに対して Q&A、チャットボット、評価、データ拡張生成などを実装できます。

github アドレスのデプロイ方法
:ローカルの知識に基づいた ChatGLM アプリケーションの実装

導入ガイドは次のとおりです。インストール

新しいマシンに変更したため、個人的に [xxx のホイールをビルドするときに cl.exe が見つからないというメッセージが表示される] という問題に遭遇しました。

Visual Studio をインストールし、Visual Studio インストーラーでコンポーネント [MSVC v142 - VS 2019 C++ x64/x86 ビルド ツール] をインストールします。
以前に MSVC v143 をインストールしたところ、ビルドでエラーが報告されたため、このバージョンを選択する場合は注意してください。
インストールが完了して再起動した後もこのエラーが報告される場合は、cl.exe が配置されているディレクトリを見つけて、それを環境変数 Path に追加します。このディレクトリは大まかに次のようなものです: D:\VS\2019\VC\Tools\ MSVC\14.29. 30133\bin\Hostx64\x64
の使用方法
インストールが完了したら、python webui.py を実行して使用を開始し、ローカルの 127.0.0.1:7860 にアクセスして Web バージョンのインターフェイスを使用します。

  1. まず、モデル構成を入力し、LLM モデルと埋め込みモデルを選択します。設定済みのchatglm-6bは使用可能ですが、精度はほぼカットされています。埋め込みモデルは主にテキストからベクターへのモデルですが、私はあまり勉強していません。

  2. 次に、ナレッジ ベース テスト インターフェイスにアクセスし、まず新しいナレッジ ベースを作成し、ドキュメントまたはドキュメントが配置されているフォルダーをアップロードします。プログラムがテキスト コンテキストをベクトルに分割して解析し、保存するのを待ってから、問題をテストします。 。このステップは主に知識の関連性のしきい値を調整するためのもので、デフォルトのスコア = 0 では、取得した知識のすべてのソースが応答されますが、これは明らかに不正確です。

  3. しきい値を決定したら、model_config で変更します。ちなみに、ここでプロンプト テンプレートを変更し、プログラムを再起動してそれを有効にすることもできます。

  4. L ダイアログでは、データベースの設定後に質問することができます。

欠点
たとえば、次のようなQ&Aを書きました。

如何进行性能优化?
使用Unity的FrameDebugger查看每帧的DrawCall和使用到的模型。

しかし、ChatGLM-6B に餌を与えた後に得られる答えは次のようになります。

如何进行性能优化?
1. 了解业务需求:明确优化的目标和范围
2. 设计测试用例:针对目标场景进行性能模拟,以确定系统的性能表现

等々。
ここに画像の説明を挿入

この図からわかるように、このフレームワークの本体は LLM とは何の関係もなく、単にテキスト ベクトルの類似性を比較して照合し、最も類似した質問のコンテキストが検出され、洗練されるために LLM に送信されます。

私の理解では、これは実際にはローカル データを独自のモデルに更新するものではありません。質問するたびに、考えられる回答のコンテキストをプロンプトとして送信するだけです。ここでは、model_config.py にあります。プロンプト_テンプレート。

したがって、次のような疑問が生じます。

1 質問が「ユニーク」でない場合、例に示されている回答が混在します。コンテキストをパッケージ化した後、磨きをかけるために LLM に送信されるため、LLM が理解する「パフォーマンスの最適化」が普遍的な答えを指していることは明らかです。LLM は、独自のコーパス トレーニングの結果と、プロジェクトの独自の結果を自発的に組み合わせます。地元の知識ベース。混合して何か怪しいものを入手しました。
2 ナレッジ ベース内の質問が繰り返し多い場合、または質問の範囲が広すぎてヒット数が多すぎる場合、ローカルのナレッジ ベースにも回答が混在します。このとき、質問と各テキストベクトルの類似性が非常に高く、例えば「パフォーマンスを最適化する方法」を尋ねた後、「パフォーマンスの最適化を確認する方法」も一緒に返されるなど、回答が混在することになります。 「パフォーマンス最適化の指標は何ですか」などに答えます。
3 コンテキストはパッケージ化され、編集のために LLM に送信されるため、この「パッケージ」では回答が切り詰められたり、この質問に対する回答ではないコンテキストが含まれたりする可能性があり、その結果、回答が混合または不完全になる可能性があります。

簡単に言うと、私の場合、有用な情報を抽出するためにコーパスを洗練する必要はありません。なぜなら、私が提供した文書が最良の答えだからです。そのため、必要なのは正確な検索です。LLM に送信されるこの切り詰められたコンテキストの構造には、私が耐えられない 3 つの欠陥があります。

  1. 本当に必要な知識はコンテキスト内にあり、コンテキストはプロンプトの形で埋め込まれているため、ローカル知識ベースの介入では十分ではありません。その結果、一意性が不十分になり、大規模モデルによって答えが得られるという問題が発生します。コーパストレーニングの結果に非常に偏ることになります。
  2. ChatGLM-6B の中国語能力は低すぎ、論理能力も低すぎ、2 つの類似した問題の違いを区別できない場合があります。
  3. コンテキストの切り捨てはあまりにも粗雑であり、長い回答には十分に対応できません。
    langchain+ChatGPT
    のその他の試み
    その後、私は気が変わり、LLM モデルにリアルタイムで質問に回答させるのはやめましたが、質問が一貫しているかどうかをリアルタイムで LLM に判断させ、同義の質問には同じ回答を照合させます。そこで、私は自宅で langchain+ChatGLM-6B のローカル知識対話モデルを個人的に構築しましたが、このモデルと前のモデルの違いは、質問と回答のペアを書くことです。
Q:你是谁?
A:我是弱智小助理。

「あなたは誰ですか」と尋ねると、内部で LLM モデルが使用され、この文と各質問と回答のペアの質問部分が同じ意味であるかどうかが比較されます。ここでは、「あなたは誰ですか」と「あなたは誰ですか」を比較します。 「同じ意味ですか?」プロンプトは次のように記述されます。

f"{original_question}\n{input_question}\n上の 2 つの文が同じ意味であるかどうかを判断してください。そうである場合は 1 と答え、そうでない場合は 0 と答えてください。" ここでも ChatGLM-6B の弱点が露呈しており、明らかに要求されています
。 「はい、この 2 つの文は同じ意味です。」と言うのは多くの場合不必要であり、また、後で説明する同義文の判断にも大きな問題があります。

そこで、再び方法を変更しました。形式に従って回答する必要はありません。さらにいくつかの同義語の文を直接生成できます。テキスト ベクトルを使用して、最も近い距離に従ってそれらを照合します。
ここに画像の説明を挿入

Judge はちょっと難しいかなと思っていたので、generate で問題ないのではないかと思っていましたが、それでも結果には驚きました。
ここに画像の説明を挿入

実際、私が見たいのは次のような文です。

  1. パフォーマンス最適化プロセスを開始するにはどうすればよいですか?
  2. パフォーマンス最適化のプロセスとは何ですか?
  3. パフォーマンス最適化プロセスを開始するにはどうすればよいですか?
  4. パフォーマンス最適化プロセスはどのように開始されますか?

ここに画像の説明を挿入

(何について話しているのか見てみたいですか?.jpg

コードの生成に ChatGPT を使用しているため、ChatGPT をテストしたところ、ChatGPT によって生成された同義語は実際には悪くないことがわかりました。ただし、「パフォーマンスの最適化をどのように開始できますか」など、人称代名詞が含まれる場合があります。

事実は、ChatGPT の後、LLM の全員が ChatGPT-3 の勇気を持っていることを証明していますが、ChatGPT を使用するのは非常に簡単です。

OpenAI API エントリの使用方法
:はじめに - OpenAI API

各 ChatGPT Plus ユーザーには月額 5 ドルの無料使用割り当てがあり、料金は使用する GPT モデルによって異なります。

モデル クイック バージョン (1,000 トークンあたり) フル バージョン (1,000 トークンあたり)
GPT-4 8K コンテキスト 0.03$ 0.06$
GPT-4 32K コンテキスト 0.06$ 0.12$
GPT-3.5-Turbo 0.002$ -
GPT-3.5 を使用することを選択した理由決して安くはありませんが (本当です)、高速で会話に最適化されているからです。同義文の生成には多くの知識や専門的な内容は必要ないので、そのまま使用してください。

使用される方法は非常に簡単です。

p

rompt_base_templet = """请为下面这段文字生成至少5个的意思完全相同的中文问句,句子之间用回车分隔开:{
    
    question}"""
gpt_engine = "text-davinci-003"
max_tokens = 300
temperature = 0# 获取同义问句
def get_synonymous_question(question : str) -> list:
    openai.api_key = api_key
    prompt = prompt_base_templet + question
    response = openai.Completion.create(
        engine=gpt_engine,
        prompt=prompt,
        max_tokens=max_tokens,
        temperature=temperature,
        n = output_num
    )
    generate_text = response.choices[0].text.strip()
    return generate_text.split('\n')

基本的に1文は60トークンを超えないと思うので、中国語5問でざっと300トークンということになります。答えが発散しすぎるのを防ぐために、温度は 0 に設定されます。

フレームワーク
フレームワークは、gradio を使用して webui などを作成する方法を含む、imClumsyPanda/langchain-ChatGLM の実装全体を指しますが、LLM を埋め込む必要がないため、はるかに軽量です。質問を分割する必要があります (すべての

このフレームワークを実行した結果は次のようになります。

  1. 質問と回答のペアを読む
  2. 質問を整理し、OpenAI API に送信して同義語を生成します
  3. 同義の文をドキュメントに変換し、回答と元の質問をメタデータにまとめます
  4. 埋め込みモデルを使用して同義文をベクトルに変換する
  5. FAISS を使用して、入力に最もよく一致する質問を照合します。
  6. 結果内のメタデータを一度スクリーニングし、同義語文によって生成された回答をマージします
  7. マージフィルター後に答えを返す
    ここに画像の説明を挿入

この方法ではデータ セキュリティの半分しか達成できず、問題をサーバーに送信する必要があることに注意してください。したがって、機密性が必要な場合でも、同義語辞書を手動で作成してデータベースを構築する必要があります。

向上

允许上传图片和链接
允许使用不经过OpenAI的同义句字典
允许下载本地知识和字典

個人的な考え
したがって、LLM はリアルタイムの入力側には参加せず、ローカルの知識がアップロードされた後にオフラインで参加するため、本質的には、このソリューションを「対話」システムとみなすことはできません。

書き終わった後、これとCtrl-Fの違いを考えていたのですが、Ctrl+Fで「パフォーマンスの最適化」を直接検索すれば欲しいものが見つかる可能性はあるでしょうか?では、これは誤った命題なのでしょうか?

後で考えてみると、知識ベースが小さく、問題が単一である場合、これは確かに当てはまります。しかし、知識ベースの増加に伴い、質問のキーワードも増加し、単一のキーワードに対応する回答内容が急増し始めます。

使用RenderDoc怎么指导性能优化?
怎么用Unity Frame Debugger优化性能?
如何优化冗余的资源实现性能提升?
……

この場合、Ctrl+F の実用性は大幅に低下します。また、キーワードも変更される可能性があり、例えば「パフォーマンスの最適化」であれば「○○のパフォーマンスを最適化してください」ということもできるので、このソリューションはまだまだ活用の余地があると思います。
ローカル知識に基づく質問応答ロボット langchain-ChatGLM
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/stay_foolish12/article/details/131704827