欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ChatGLM-6B+LangChain環(huán)境部署與使用實戰(zhàn)

 更新時間:2023年07月17日 09:17:54   作者:stay_foolish12  
這篇文章主要介紹了ChatGLM-6B+LangChain環(huán)境部署與使用方法,結(jié)合實例形式詳細分析了ChatGLM-6B+LangChain環(huán)境部署相關(guān)步驟、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下

目標:原始使用ChatGLM-6B可接受的文字長度有限,打算結(jié)合LangChain實現(xiàn)長文本生成摘要.方法:step1:自定義一個GLM繼承LangChain中的langchain.llms.base.LLM,load自己的模型.step2:使用LangChain的mapreduce的方法,對文本分塊,做摘要,輸出結(jié)果.使用的機器資源:T4顯卡(16G顯存)附參考資料:ChatGLM-6B:ModelScope: ChatGLM-6BLangChain:LangChain: summarizationLangChain: summarize notebook

  1. glm環(huán)境準備在指定的python環(huán)境下確定安裝好以下依賴:
# 安裝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. ChatGLM-6B + LangChain

2.1 繼承l(wèi)angchain.llms.base.LLM新建GLM類重寫_call方法:加載自己的模型,并限制只輸出結(jié)果(chatglm原輸出不是直接str,langchain中要求模型返回必須是str的結(jié)果:“”“LLM wrapper should take in a prompt and return a string.”“”)具體代碼:

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年政府工作報告_中國政府網(wǎng):https://www.gov.cn/zhuanti/2023lhzfgzbg/index.htm

2.4 輸出這篇文章介紹了中國在過去五年中的經(jīng)濟發(fā)展成就,政府采取多項措施應對有效需求不足的問題、支持汽車消費、推進保交樓穩(wěn)民生工作、加強環(huán)境保護和生態(tài)修復工作等。政府還出臺了增值稅留抵退稅額度、降低貸款利息等減輕企業(yè)負擔的措施。文章介紹了中國政府的宏觀經(jīng)濟政策目標,包括推進中國式現(xiàn)代化、實現(xiàn)經(jīng)濟發(fā)展質(zhì)量和數(shù)量的提升、改善民生、穩(wěn)定社會大局等。新冠疫情防控政策包括疫苗迭代升級和新藥研制、保障群眾就醫(yī)用藥需求、重點做好老年人、兒童、患基礎性疾病群體的疫情防控和醫(yī)療救治等。政府將著力擴大國內(nèi)需求、加快建設現(xiàn)代化產(chǎn)業(yè)體系、深化國資國企改革、保護民營企業(yè)產(chǎn)權(quán)和企業(yè)家權(quán)益,鼓勵支持民營經(jīng)濟和民營企業(yè)發(fā)展壯大,穩(wěn)定市場預期和提振市場信心。

實戰(zhàn)2框架地址:https://github.com/noobdawn/langchain_ChatGPT

langchain+ChatGLM-6B試用什么是langchainChatGLM-6B大家都知道了,是清華大學推出的有62億參數(shù)的開源大語言模型。那么langchain是什么?langchain是一個基于語言模型的應用程序開發(fā)框架,它具有以下特點

數(shù)據(jù)感知:將語言模型與其他數(shù)據(jù)源連接在一起自主性:允許語言模型與其環(huán)境進行交互langchain框架是基于以上原則設計的。

因為這些特點,langchain可以實現(xiàn)針對特定文件的問答、聊天機器人、評估、數(shù)據(jù)增強生成等工作。

如何部署github地址為:基于本地知識的 ChatGLM 應用實現(xiàn)

部署指南為:安裝

因為我換了新機器,我個人遇到了【build wheel for xxx時提示找不到cl.exe】的問題,解決方法是:

裝個Visual Studio,然后在Visual Studio Installer里安裝組件【MSVC v142 - VS 2019 C++ x64/x86生成工具】。注意要選擇這個版本,像我之前就裝了MSVC v143結(jié)果build報錯了。安裝完成重啟之后如果還報這個錯,就找到cl.exe所在的目錄,把它添加到環(huán)境變量Path里,這個目錄大致是這樣的:D:\VS\2019\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64如何使用安裝完成后,執(zhí)行python webui.py即可開始使用,訪問本地的127.0.0.1:7860即可使用web版的界面。

  1. 首先,進入模型配置,選一個LLM模型和Embedding模型。配置好的可以用chatglm-6b,差點的就要砍精度了。Embedding模型主要是文本轉(zhuǎn)向量的模型,這個我研究不多。

  2. 然后來到知識庫測試界面,先新建知識庫,并為其上傳文檔或者文檔所在文件夾,等待程序?qū)⑽谋旧舷挛姆指畈⒔馕鰹橄蛄恐筮M行保存好后,測試問題。這一步主要是調(diào)整知識相關(guān)度閾值,默認Score=0會回復所有檢索到的知識出處,這顯然是不精準的。

  3. 確定好閾值后,在model_config里進行修改,這里還可以順便修改一下prompt模板,重啟程序以令其生效;

  4. L 在對話中,配置好數(shù)據(jù)庫之后提問即可。

缺陷舉例而言,我寫了這樣一個Q&A:

如何進行性能優(yōu)化?
使用Unity的FrameDebugger查看每幀的DrawCall和使用到的模型。

但是喂給ChatGLM-6B后提供的回答會類似于:

如何進行性能優(yōu)化?
1. 了解業(yè)務需求:明確優(yōu)化的目標和范圍
2. 設計測試用例:針對目標場景進行性能模擬,以確定系統(tǒng)的性能表現(xiàn)

云云。在這里插入圖片描述

通過這張圖可以看到,這個框架的主體其實是跟LLM無關(guān)的,它只是比對和匹配文本向量的相似性,檢出最相似的問句的上下文打包發(fā)給LLM進行潤色。

在我的理解里,這個玩意兒不會真的把本地的數(shù)據(jù)更新進自己的模型內(nèi)部,只是每次提問的時候,預先把可能存在答案的上下文作為prompt一起提交了而已,這里在model_config.py的PROMPT_TEMPLATE里也能看到。

所以它會觸發(fā)以下問題:

1 當這個問題并不“獨特”的時候,就會出現(xiàn)例子中所示的答案的雜糅。因為是打包上下文之后發(fā)給LLM潤色,顯然LLM理解的“性能優(yōu)化”指的是一種普適性的答案,它自發(fā)的把自身語料訓練出來的結(jié)果與本地知識庫中項目所獨有的結(jié)果進行混合,得到了似是而非的東西。2 當知識庫中的問題重復度很高的時候,或者問題過于寬泛導致命中過多,也會出現(xiàn)本地知識庫答案的雜糅。此時問題和各個文本向量的相似性很高,回答會串味,例如,詢問“如何進行性能優(yōu)化”之后,就會連同“性能優(yōu)化怎么查看”、“性能優(yōu)化的指標是多少”等等一塊返回進行回答。3 因為是打包上下文發(fā)給LLM潤色,所以這個“打包”可能會把答案截斷,或者囊括了并非本問題的答案的上下文,會造成回答串味或不全。

簡單的說,對于我來說我并不需要什么語料的潤色、幫助我提取有用信息,因為我給的文檔本身就是最好的答案,所以我需要的是精確的檢索。這種截斷上下文發(fā)給LLM的架構(gòu)的三個缺陷是我無法忍受的:

  1. 本地知識庫干預力度不夠,由于真正需要的知識在上下文中,而上下文是以Prompt的形式嵌入其中的,導致獨特性不夠的問題,大模型給出的答案會非常偏向語料訓練結(jié)果。
  2. ChatGLM-6B的中文能力過于羸弱,邏輯能力過于差勁,有時候無法判別出兩個相似問題的區(qū)別。
  3. 上下文截斷過于粗暴,對于長答案支持不佳。langchain+ChatGPT其他嘗試之后我轉(zhuǎn)變思維,不再嘗試讓LLM模型去即時回答問題,而是讓LLM即時判定問句是否一致,再針對同義問句匹配相同的回答。因此我個人在家又搭建了一個langchain+ChatGLM-6B的本地知識對話模型,但這個模型跟前一個模型的區(qū)別在于,我會寫好一個問題答案對:
Q:你是誰?
A:我是弱智小助理。

當我提問“你是什么人”的時候,內(nèi)部會使用LLM模型去一個個比對這句話和各個問題答案對中的問題部分是否屬于同一個意思,此處它就會比對“你是誰”和“你是什么人”是不是同一個意思。Prompt會寫成這個樣子:

f"{original_question}\n{input_question}\n判斷上述兩句話是不是一個意思,如果是,則回答1;反之回答0。"這里再次暴露了ChatGLM-6B的羸弱,明明要求回答0或者1即可,往往會畫蛇添足地說“是的,這兩句是一個意思”,此外它對同義句的判定也有極大的問題,這里我們后面說。

然后我又換了個方式,好吧,不要求你按格式回答了,你直接生成多幾個同義句,我用文本向量按最近距離匹配好了。在這里插入圖片描述

我尋思Judge可能確實有點難為它了,那么generate應該沒問題吧,結(jié)果還是讓我大跌眼鏡,對于“如何進行性能優(yōu)化的流程”的問題,ChatGLM-6B給出的回復是:在這里插入圖片描述

事實上,我想看到的是這樣的句子:

  1. 怎么發(fā)起性能優(yōu)化流程?
  2. 性能優(yōu)化的流程是怎么樣的?
  3. 我該如何啟動性能優(yōu)化流程?
  4. 性能優(yōu)化流程是如何發(fā)起的?

在這里插入圖片描述

(你要不看看你在說什么?.jpg

因為我一直在用ChatGPT幫助生成代碼,所以我測試了一下ChatGPT,發(fā)現(xiàn)ChatGPT生成的同義句居然還不錯,雖然有時候會帶上人稱,比如”你如何才能啟動性能優(yōu)化“。

事實證明,盡管ChatGPT之后,LLM人人均有不下ChatGPT-3之勇,但真用起來,那還是ChatGPT好使。

如何使用OpenAI API入口:Introduction - OpenAI API

每個ChatGPT Plus用戶每月有5刀的免費使用額度,而根據(jù)使用的GPT模型不同,收費也不同:

模型 迅速版(每千token) 完整版(每千token)GPT-4 8K Context 0.03$ 0.06$GPT-4 32K Context 0.06$ 0.12$GPT-3.5-Turbo 0.002$ -選擇使用GPT-3.5的原因絕對不是便宜(迫真),而是因為它速度快,且為對話專門優(yōu)化過。而同義句的生成就也不涉及大量的知識和專業(yè)性內(nèi)容,所以直接用它。

使用的方法就很簡單:

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')

感覺一句話基本大約不會超過60token,所以5個中文問句大致就是300個token。temperature設為0是為了防止回答過于發(fā)散。

框架框架整體參考了imClumsyPanda/langchain-ChatGLM 的實現(xiàn),包括怎么用gradio創(chuàng)建webui之類的,但輕量化了很多,因為我并不需要內(nèi)嵌LLM,也不需要對問句進行分詞(都整句話直接轉(zhuǎn)換成向量了)。

這個框架的運行結(jié)果是:

  1. 讀取問題答案對
  2. 把問題整理出來發(fā)給OpenAI API生成同義句
  3. 把同義句轉(zhuǎn)換為Document,把答案和原問句編制到metadata里
  4. 用embedding model將同義句轉(zhuǎn)化為向量
  5. 用FAISS匹配最符合輸入的問句
  6. 把結(jié)果中的metadata篩一次,合并同義句產(chǎn)生的答案
  7. 返回合并篩選之后的答案在這里插入圖片描述

值得注意的是,該方法只實現(xiàn)了一半的數(shù)據(jù)安全,其問題還是要提交到服務器上的。所以如果有涉密需求,還是得手動編寫同義句字典進行搭建數(shù)據(jù)庫。

改進

允許上傳圖片和鏈接
允許使用不經(jīng)過OpenAI的同義句字典
允許下載本地知識和字典

一些個人的想法故,本質(zhì)上而言,該方案并不能算“對話”系統(tǒng),因為LLM并沒有在即時輸入端參與,而是在本地知識上傳后離線參與。

寫完之后我在思索,這玩意兒和Ctrl-F有什么區(qū)別,有沒有一種可能,我直接Ctrl+F搜索“性能優(yōu)化”也能找到我要的內(nèi)容呢?所以這是個偽命題?

后面想了想,如果知識庫很少,問題單一的情況下確實是這樣的沒錯。但隨著知識庫的增大,問題的keyword也在增多,單個keyword對應的答案內(nèi)容開始急劇上升,假如后面有這些問題:

使用RenderDoc怎么指導性能優(yōu)化?
怎么用Unity Frame Debugger優(yōu)化性能?
如何優(yōu)化冗余的資源實現(xiàn)性能提升?
……

這樣的話,Ctrl+F的實用性就大打折扣了。此外,keyword也可能會改頭換面,例如“性能優(yōu)化”實際上可以這樣問“優(yōu)化XX的性能表現(xiàn)”,因此我認為這個方案仍有有較大的用武之地。基于本地知識的問答機器人langchain-ChatGLM

在這里插入圖片描述

相關(guān)文章

  • python 列表降維的實例講解

    python 列表降維的實例講解

    今天小編就為大家分享一篇python 列表降維的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Windows 64位下python3安裝nltk模塊

    Windows 64位下python3安裝nltk模塊

    這篇文章主要為大家詳細介紹了Windows 64位下python3安裝nltk模塊,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python實現(xiàn)密碼薄文件讀寫操作

    Python實現(xiàn)密碼薄文件讀寫操作

    這篇文章主要介紹了Python實現(xiàn)密碼薄文件讀寫操作,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 使用PyInstaller?打包配置文件

    使用PyInstaller?打包配置文件

    這篇文章主要介紹了使用PyInstaller?打包配置文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解Python requests 超時和重試的方法

    詳解Python requests 超時和重試的方法

    這篇文章主要介紹了詳解Python requests 超時和重試的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • pandas分區(qū)間,算頻率的實例

    pandas分區(qū)間,算頻率的實例

    今天小編就為大家分享一篇pandas分區(qū)間,算頻率的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python+PuLP實現(xiàn)線性規(guī)劃的求解

    Python+PuLP實現(xiàn)線性規(guī)劃的求解

    線性規(guī)劃(Linear?programming),在線性等式或不等式約束條件下求解線性目標函數(shù)的極值問題,常用于解決資源分配、生產(chǎn)調(diào)度和混合問題。本文將利用PuLP實現(xiàn)線性規(guī)劃的求解,需要的可以參考一下
    2022-04-04
  • Python3使用TCP編寫一個簡易的文件下載器功能

    Python3使用TCP編寫一個簡易的文件下載器功能

    這篇文章主要介紹了Python3使用TCP編寫一個簡易的文件下載器功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 圖文詳解在Anaconda安裝Pytorch的詳細步驟

    圖文詳解在Anaconda安裝Pytorch的詳細步驟

    Anaconda指的是一個開源的Python發(fā)行版本,其包含了conda、Python等180多個科學包及其依賴項,下面這篇文章主要給大家介紹了關(guān)于在Anaconda安裝Pytorch的詳細步驟,需要的朋友可以參考下
    2022-07-07
  • 將python代碼打包成.exe文件直接運行的具體步驟

    將python代碼打包成.exe文件直接運行的具體步驟

    小編最近收到了一個小伙伴的問題,就是那么多有趣的代碼,怎么發(fā)給別人,讓沒有python環(huán)境的小伙伴也可以使用呢,本文小編將帶著大家探索如何將自己的python代碼打包成.exe可執(zhí)行文件,一起來看看吧
    2024-02-02

最新評論