最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)境部署相關步驟、實現(xià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)整知識相關度閾值,默認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無關的,它只是比對和匹配文本向量的相似性,檢出最相似的問句的上下文打包發(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

在這里插入圖片描述

相關文章

  • 淺談Python中函數(shù)的定義及其調(diào)用方法

    淺談Python中函數(shù)的定義及其調(diào)用方法

    今天小編就為大家分享一篇淺談Python中函數(shù)的定義及其調(diào)用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python openCV自制繪畫板

    python openCV自制繪畫板

    這篇文章主要為大家詳細介紹了python openCV自制繪畫板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 基于tensorflow __init__、build 和call的使用小結(jié)

    基于tensorflow __init__、build 和call的使用小結(jié)

    這篇文章主要介紹了基于tensorflow __init__、build 和call的使用小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Python中SQLite數(shù)據(jù)庫的使用

    Python中SQLite數(shù)據(jù)庫的使用

    SQLite是一種輕型關系型數(shù)據(jù)庫,常用于嵌入式設備和移動應用中。Python中內(nèi)置了SQLite模塊,可用于連接和操作SQLite數(shù)據(jù)庫。通過Python SQLite模塊,可以方便地創(chuàng)建、查詢和修改數(shù)據(jù)庫中的數(shù)據(jù),支持事務處理和數(shù)據(jù)庫操作的原子性保證
    2023-04-04
  • Python數(shù)據(jù)可視化編程通過Matplotlib創(chuàng)建散點圖代碼示例

    Python數(shù)據(jù)可視化編程通過Matplotlib創(chuàng)建散點圖代碼示例

    這篇文章主要介紹了Python數(shù)據(jù)可視化編程通過Matplotlib創(chuàng)建散點圖實例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • pycharm自動生成文件注釋和函數(shù)注釋

    pycharm自動生成文件注釋和函數(shù)注釋

    這篇文章主要介紹了pycharm自動生成文件注釋和函數(shù)注釋的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • python實現(xiàn)修改固定模式的字符串內(nèi)容操作示例

    python實現(xiàn)修改固定模式的字符串內(nèi)容操作示例

    這篇文章主要介紹了python實現(xiàn)修改固定模式的字符串內(nèi)容操作,結(jié)合實例形式詳細分析了Python修改固定模式字符串原理、實現(xiàn)方法及相關操作注意事項,需要的朋友可以參考下
    2019-12-12
  • Python使用XPath進行正則表達式匹配的實戰(zhàn)指南

    Python使用XPath進行正則表達式匹配的實戰(zhàn)指南

    在Web自動化測試和數(shù)據(jù)抓取中,我們經(jīng)常遇到動態(tài)生成的HTML屬性,傳統(tǒng)XPath定位方式容易因這些變化而失效,下面我們就來看看Python中如何運用XPath正則匹配吧
    2026-04-04
  • 一文詳解如何使用Python實現(xiàn)文件監(jiān)控自動化系統(tǒng)

    一文詳解如何使用Python實現(xiàn)文件監(jiān)控自動化系統(tǒng)

    這篇文章主要介紹了如何使用Python實現(xiàn)文件監(jiān)控自動化系統(tǒng),解決日常工作中的文件管理痛點,系統(tǒng)基于Watchdog庫實時監(jiān)控文件夾,支持文件自動分類(按類型/大小/日期)和微信通知提醒,文章詳細講解了核心代碼實現(xiàn),需要的朋友可以參考下
    2026-01-01
  • python中的隨機函數(shù)小結(jié)

    python中的隨機函數(shù)小結(jié)

    這篇文章主要介紹了python中的隨機函數(shù)小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

集贤县| 永靖县| 扎鲁特旗| 海城市| 濮阳县| 五指山市| 如东县| 水城县| 织金县| 湖南省| 温泉县| 海南省| 景洪市| 枝江市| 荔波县| 聊城市| 黄梅县| 揭阳市| 南岸区| 太仆寺旗| 江华| 喀什市| 西昌市| 托克托县| 永胜县| 金华市| 鸡西市| 美姑县| 佛教| 江阴市| 拉萨市| 乐山市| 东城区| 措美县| 元朗区| 安国市| 精河县| 郯城县| 澄迈县| 滨海县| 高台县|