11|省下錢買顯卡,如何利用開源模型節約成本?

不知道課程上到這里,你賬戶里免費的5美元的額度還剩下多少了?如果你嘗試著完成我給的幾個數據集里的思考題,相信這個額度應該是不太夠用的。而ChatCompletion的接口,又需要傳入大量的上下文信息,實際消耗的Token數量其實比我們感覺的要多。

而且,除了費用之外,還有一個問題是數據安全。因為每個國家的數據監管要求不同,并不是所有的數據,都適合通過OpenAI的API來處理的。所以,從這兩個角度出發,我們需要一個OpenAI以外的解決方案。那對于沒有足夠技術儲備的中小型公司來說,最可行的一個思路就是利用好開源的大語言模型。

在Colab里使用GPU

因為這一講我們要使用一些開源模型,但不是所有人的電腦里都有一個強勁的NVidia GPU的。所以,我建議你通過Colab來運行對應的Notebook,并且注意,要把對應的運行環境設置成GPU。

圖片

  1. 你先選擇菜單欄里的Runtime,然后點擊Change runtime type。

圖片

  1. 然后在彈出的對話框里,把Hardware accelerator換成GPU,然后點擊Save就可以了。

只要用得不是太多,Colab的GPU是可以免費使用的。

HuggingfaceEmbedding,你的開源伙伴

其實我們之前在 第 4 講 對比零樣本分類效果的時候,就已經使用過Google開源的模型T5了。那個模型的效果,雖然比OpenAI的API還是要差一些,但是其實90%的準確率也還算不錯了。那么聯想一下,上一講我們使用的llama-index向量搜索部分,是不是可以用開源模型的Embedding給替換掉呢?

當然是可以的,llama-index支持你自己直接定義一個定制化的Embedding,對應的代碼我放在了下面。

conda install -c conda-forge sentence-transformers

注:我們需要先安裝一下sentence-transformers這個庫。

import openai, os
import faiss
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTFaissIndex, ServiceContext
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from llama_index.node_parser import SimpleNodeParseropenai.api_key = ""text_splitter = CharacterTextSplitter(separator="\n\n", chunk_size=100, chunk_overlap=20)
parser = SimpleNodeParser(text_splitter=text_splitter)
documents = SimpleDirectoryReader('./data/faq/').load_data()
nodes = parser.get_nodes_from_documents(documents)embed_model = LangchainEmbedding(HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
))
service_context = ServiceContext.from_defaults(embed_model=embed_model)dimension = 768
faiss_index = faiss.IndexFlatIP(dimension)
index = GPTFaissIndex(nodes=nodes,faiss_index=faiss_index, service_context=service_context)

輸出結果:

INFO:sentence_transformers.SentenceTransformer:Load pretrained SentenceTransformer: sentence-transformers/paraphrase-multilingual-mpnet-base-v2
INFO:sentence_transformers.SentenceTransformer:Use pytorch device: cpu
WARNING:root:Created a chunk of size 130, which is longer than the specified 100
……
INFO:llama_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens
INFO:llama_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 3198 tokens

在這個例子里面,我們使用了一個面向電商的FAQ的純文本文件作為輸入。里面是一系列預設好的FAQ問答對。為了確保我們沒有使用OpenAI的API,我們先把openai.api_key給設成了一個空字符串。然后,我們定義了一個embeded_model,這個embeded_model里面,我們包裝的是一個HuggingFaceEmbeddings的類。

因為HuggingFace為基于transformers的模型定義了一個標準,所以大部分模型你只需要傳入一個模型名稱,HuggingFacebEmbedding這個類就會下載模型、加載模型,并通過模型來計算你輸入的文本的Embedding。使用HuggingFace的好處是,你可以通過一套代碼使用所有的transfomers類型的模型。

sentence-transformers 是目前效果最好的語義搜索類的模型,它在BERT的基礎上采用了對比學習的方式,來區分文本語義的相似度,它包括了一系列的預訓練模型。我們在這里,選用的是 sentence-transformers下面的 paraphrase-multilingual-mpnet-base-v2 模型。顧名思義,這個是一個支持多語言(multilingual)并且能把語句和段落(paraphrase)變成向量的一個模型。因為我們給的示例都是中文,所以選取了這個模型。你可以根據你要解決的實際問題,來選取一個適合自己的模型。

我們還是使用Faiss這個庫來作為我們的向量索引庫,所以需要指定一下向量的維度,paraphrase-multilingual-mpnet-base-v2 這個模型的維度是768,所以我們就把維度定義成768維。

相應的對文檔的切分,我們使用的是CharacterTextSplitter,并且在參數上我們做了一些調整。

首先,我們把“\n\n”這樣兩個連續的換行符作為一段段文本的分隔符,因為我們的FAQ數據里,每一個問答對都有一個空行隔開,正好是連續兩個換行。

然后,我們把chunk_size設置得比較小,只有100。這是因為我們所使用的開源模型是個小模型,這樣我們才能在單機加載起來。它能夠支持的輸入長度有限,只有128個Token,超出的部分會進行截斷處理。如果我們不設置chunk_size,llama-index會自動合并多個chunk變成一個段落。

其次,我們還增加了一個小小的參數,叫做chunk_overlap。這個參數代表我們自動合并小的文本片段的時候,可以接受多大程度的重疊。它的默認值是200,超過了單段文檔的chunk_size,所以我們這里要把它設小一點,不然程序會報錯。

我們可以在對應的verbose日志里看到,這里的Embedding使用了3198個Token,不過這些Token都是我們通過sentence_transformers類型的開源模型計算的,不需要花錢。你的成本就節約下來了。

在創建完整個索引之后,我們就可以拿一些常見的電商類型的FAQ問題試一試。

問題1:

from llama_index import QueryModeopenai.api_key = os.environ.get("OPENAI_API_KEY")response = index.query("請問你們海南能發貨嗎?",mode=QueryMode.EMBEDDING,verbose=True,
)
print(response)

輸出結果:

> Got node text: Q: 支持哪些省份配送?
A: 我們支持全國大部分省份的配送,包括北京、上海、天津、重慶、河北、山西、遼寧、吉林、黑龍江、江蘇、浙江、安徽、福建、江西、山東、河南、湖北、湖南、廣東、海南、四川、貴州、云南、陜西、甘肅、青海、臺灣、內蒙古、廣西、西藏、寧夏和新疆...INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 341 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 24 tokens是的,我們支持海南省的配送。

問題2:

response = index.query("你們用哪些快遞公司送貨?",mode=QueryMode.EMBEDDING,verbose=True,
)
print(response)

輸出結果:

> Got node text: Q: 提供哪些快遞公司的服務?
A: 我們與順豐速運、圓通速遞、申通快遞、韻達快遞、中通快遞、百世快遞等多家知名快遞公司合作。...
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 281 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 27 tokens我們與順豐速運、圓通速遞、申通快遞、韻達快遞、中通快遞、百世快遞等多家知名快遞公司合作,用他們的服務送貨。

問題3:

response = index.query("你們的退貨政策是怎么樣的?",mode=QueryMode.EMBEDDING,verbose=True,
)
print(response)

輸出結果:

> Got node text: Q: 退貨政策是什么?
A: 自收到商品之日起7天內,如產品未使用、包裝完好,您可以申請退貨。某些特殊商品可能不支持退貨,請在購買前查看商品詳情頁面的退貨政策。...
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 393 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 27 tokens我們的退貨政策是自收到商品之日起7天內,如產品未使用、包裝完好,您可以申請退貨。某些特殊商品可能不支持退貨,請在購買前查看商品詳情頁面的退貨政策。

我們在問問題的時候,指定了query的mode是Embedding。通過三個常用的問題,我們可以看到,AI都給出了正確的回答,效果還是不錯的。

使用ChatGLM提供對話效果

通過上面的代碼,我們已經把生成Embedding以及利用Embedding的相似度進行搜索搞定了。但是,我們在實際問答的過程中,使用的還是OpenAI的Completion API。那么這一部分我們有沒有辦法也替換掉呢?

同樣的,我們尋求開源模型的幫助。在這里,我們就不妨來試一下來自清華大學的ChatGLM語言模型,看看中文的開源語言模型,是不是也有基本的知識理解和推理能力。

首先我們還是要安裝一些依賴包,因為icetk我沒有找到Conda的源,所以我們這里通過pip來安裝,但是在Conda的包管理器里一樣能夠看到。

pip install icetk
pip install cpm_kernels

然后,我們還是先通過transformers來加載模型。 ChatGLM 最大的一個模型有1300億個參數。

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

輸出結果:

Explicitly passing a `revision` is encouraged when loading a model with custom code to ensure no malicious code has been contributed in a newer revision.
Explicitly passing a `revision` is encouraged when loading a configuration with custom code to ensure no malicious code has been contributed in a newer revision.
Explicitly passing a `revision` is encouraged when loading a model with custom code to ensure no malicious code has been contributed in a newer revision.
No compiled kernel found.
Compiling kernels : /root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4/dac03c3ac833dab2845a569a9b7f6ac4e8c5dc9b/quantization_kernels.c
Compiling gcc -O3 -fPIC -std=c99 /root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4/dac03c3ac833dab2845a569a9b7f6ac4e8c5dc9b/quantization_kernels.c -shared -o /root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4/dac03c3ac833dab2845a569a9b7f6ac4e8c5dc9b/quantization_kernels.so
Kernels compiled : /root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4/dac03c3ac833dab2845a569a9b7f6ac4e8c5dc9b/quantization_kernels.so
Load kernel : /root/.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4/dac03c3ac833dab2845a569a9b7f6ac4e8c5dc9b/quantization_kernels.so
Using quantization cache
Applying quantization to glm layers

但是這么大的模型,無論是你自己的電腦,還是Colab提供的GPU和TPU顯然都放不了。所以我們只能選用一個裁剪后的60億個參數的版本,并且我們還必須用int-4量化的方式,而不是用float16的浮點數。所以,這里我們的模型名字就叫做 chatglm-6b-int4,也就是 6B的參數量,通過int-4量化。然后,在這里,我們希望通過GPU進行模型的計算,所以加載模型的時候調用了.cuda()。

這里加載模型的時候,我們還設置了一個 trust_remote_code = true 的參數,這是因為ChatGLM的模型不是一個Huggingface官方發布的模型,而是由用戶貢獻的,所以需要你顯式確認你信任這個模型的代碼,它不會造成惡意的破壞。我們反正是在Colab里面運行這個代碼,所以倒是不用太擔心。

如果你想要用CPU運行,可以把模型加載的代碼換成下面這樣。

model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4",trust_remote_code=True).float()

不過,我不建議你這么做。你沒有GPU的話,還是直接使用Colab的GPU就好了。因為CPU在運行對話的時候非常慢。

在拿到模型之后我們就可以嘗試著通過這個模型來進行問答了。

問題1:

question = """
自收到商品之日起7天內,如產品未使用、包裝完好,您可以申請退貨。某些特殊商品可能不支持退貨,請在購買前查看商品詳情頁面的退貨政策。根據以上信息,請回答下面的問題:Q: 你們的退貨政策是怎么樣的?
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

輸出結果:

我們的退貨政策是在產品未使用、包裝完好的情況下,自收到商品之日起7天內可以退貨。請注意,某些特殊商品可能不支持退貨,在購買前請查看商品詳情頁面的退貨政策,以了解具體情況。

可以看到,ChatGLM的回答,的確是按照我們提示語里面有的上下文給出的。我們可以試著去掉提供的FAQ的內容,看看它的回答是怎樣的。

問題2:

question = """
Q: 你們的退貨政策是怎么樣的?
A:
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

輸出結果:

我們公司的政策是,如果您在購買后的7天內發現我們的產品不符合您的期望,可以申請退貨。退貨條件如下:
1. 符合退貨政策要求的產品;
2. 未使用或損壞的產品;
3. 符合退貨地點的要求,即退貨地址與購買地址相同;
4. 符合退貨流程的要求,即您需要提供有效的退貨單并完成退貨流程。
如果符合上述退貨政策要求,我們將盡快處理您的退貨申請,并為您退款。請注意,如果您已經使用了我們的產品,或者產品有損壞或變質等情況,我們將無法為您提供退貨服務。

可以看到,在沒有合適的上下文信息的時候,它編造出了一些原本沒有的要求,比如“退貨地址與購買地址相同”。

我們再來看一個例子,看看它能不能擁有簡單的推理能力。我們的上下文里只說了可以送到海南,沒有說是否支持三亞這個城市,看看這個時候AI能不能回答對這個問題。

問題3:

question = """
我們支持全國大部分省份的配送,包括北京、上海、天津、重慶、河北、山西、遼寧、吉林、黑龍江、江蘇、浙江、安徽、福建、江西、山東、河南、湖北、湖南、廣東、海南、四川、貴州、云南、陜西、甘肅、青海、臺灣、內蒙古、廣西、西藏、寧夏和新疆.根據以上信息,請回答下面的問題:Q: 你們能配送到三亞嗎?
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

輸出結果:

是的,我們支持全國大部分省份的配送,包括三亞市。

可以看到,ChatGLM知道是可以配送到三亞的。不過萬一是巧合呢?我們再看看在上下文里面,去掉了東三省,然后問問它能不能送到哈爾濱。

問題4:

question = """
我們支持全國大部分省份的配送,包括北京、上海、天津、重慶、河北、山西、江蘇、浙江、安徽、福建、江西、山東、河南、湖北、湖南、廣東、海南、四川、貴州、云南、陜西、甘肅、青海、臺灣、內蒙古、廣西、西藏、寧夏和新疆.但是不能配送到東三省根據以上信息,請回答下面的問題:Q: 你們能配送到哈爾濱嗎?
"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

回答:

很抱歉,我們目前不能配送到哈爾濱。

結果也是正確的,這個時候,ChatGLM會回答我們是送不到哈爾濱的。既然ChatGLM能夠正確回答這個問題,那我們的FAQ問答就可以用ChatGLM來搞定了。

將ChatGLM封裝成LLM

不過上面的代碼里面,我們用的還是原始的ChatGLM的模型代碼,還不能直接通過query來訪問llama-index直接得到答案。要做到這一點倒也不難,我們把它封裝成一個LLM類,讓我們的index使用這個指定的大語言模型就好了。對應的 llama-index 的文檔,你也可以自己去看一下。

import openai, os
import faiss
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTFaissIndex, ServiceContext
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from llama_index.node_parser import SimpleNodeParserfrom langchain.llms.base import LLM
from llama_index import LLMPredictor
from typing import Optional, List, Mapping, Anyclass CustomLLM(LLM):def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:response, history = model.chat(tokenizer, prompt, history=[])return response@propertydef _identifying_params(self) -> Mapping[str, Any]:return {"name_of_model": "chatglm-6b-int4"}@propertydef _llm_type(self) -> str:return "custom"

我們把這個CustomLLM對象,傳入index的構造函數里,重新運行一下我們的問題,看看效果是怎樣的。

from langchain.text_splitter import SpacyTextSplitterllm_predictor = LLMPredictor(llm=CustomLLM())text_splitter = CharacterTextSplitter(separator="\n\n", chunk_size=100, chunk_overlap=20)
parser = SimpleNodeParser(text_splitter=text_splitter)
documents = SimpleDirectoryReader('./drive/MyDrive/colab_data/faq/').load_data()
nodes = parser.get_nodes_from_documents(documents)embed_model = LangchainEmbedding(HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
))
service_context = ServiceContext.from_defaults(embed_model=embed_model, llm_predictor=llm_predictor)dimension = 768
faiss_index = faiss.IndexFlatIP(dimension)
index = GPTFaissIndex(nodes=nodes, faiss_index=faiss_index, service_context=service_context)
from llama_index import QuestionAnswerPrompt
from llama_index import QueryModeQA_PROMPT_TMPL = ("{context_str}""\n\n""根據以上信息,請回答下面的問題:\n""Q: {query_str}\n")
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)response = index.query("請問你們海南能發貨嗎?",mode=QueryMode.EMBEDDING,text_qa_template=QA_PROMPT,verbose=True,
)
print(response)

輸出結果:

> Got node text: Q: 支持哪些省份配送?
A: 我們支持全國大部分省份的配送,包括北京、上海、天津、重慶、河北、山西、遼寧、吉林、黑龍江、江蘇、浙江、安徽、福建、江西、山東、河南、湖北、湖南、廣東、海南、四川、貴州、云南、陜西、甘肅、青海、臺灣、內蒙古、廣西、西藏、寧夏和新疆...海南能發貨。

可以看到,這樣處理之后,我們就可以直接使用ChatGLM的模型,來進行我們的FAQ的問答了。

現在,我們有了一個通過paraphrase-multilingual-mpnet-base-v2模型來計算Embeddding并進行語義搜索,然后通過chatglm-6b-int4的模型來進行問答的解決方案了。而且這兩個模型,可以跑在一塊家用級別的顯卡上。是不是很厲害?

開源模型的不足之處

看起來,我們這個本機就能運行的小模型似乎已經完成了。數據安全,又不用擔心花費。但顯然,事情沒有那么簡單。因為剛才我們處理的電商FAQ問題比較簡單,我們再拿一個稍微復雜一點的問題來看看效果。

text_splitter = SpacyTextSplitter(pipeline="zh_core_web_sm", chunk_size = 128, chunk_overlap=32)
parser = SimpleNodeParser(text_splitter=text_splitter)
documents = SimpleDirectoryReader('./drive/MyDrive/colab_data/zhaohuaxishi/').load_data()
nodes = parser.get_nodes_from_documents(documents)embed_model = LangchainEmbedding(HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2"
))
service_context = ServiceContext.from_defaults(embed_model=embed_model, llm_predictor=llm_predictor)dimension = 768
faiss_index = faiss.IndexFlatIP(dimension)
index = GPTFaissIndex(nodes=nodes, faiss_index=faiss_index, service_context=service_context)

輸出結果:

INFO:sentence_transformers.SentenceTransformer:Load pretrained SentenceTransformer: sentence-transformers/paraphrase-multilingual-mpnet-base-v2
INFO:sentence_transformers.SentenceTransformer:Use pytorch device: cpu
……
INFO:llama_index.token_counter.token_counter:> [build_index_from_documents] Total LLM token usage: 0 tokens
INFO:llama_index.token_counter.token_counter:> [build_index_from_documents] Total embedding token usage: 91882 tokens

這一次,我們輸入索引起來的數據,是魯迅先生整套《朝花夕拾》的散文集。選用這個是因為對應作品的版權已經過了保護期。我們來看看,在這套文集的內容里面,使用我們上面的純開源方案,效果會是怎樣的。

對應的模型和索引加載的代碼基本一致,只有一個小小的區別,就是在文本分割的時候,我們用了上一講介紹過的SpacyTextSplitter,因為這里都是散文的內容,而不是確定好格式的QA對。所以通過SpacyTextSplitter來分句,并在允許的時候合并小的片段是有意義的。

然后,我們試著問一下上一講我們問過的問題,看看效果怎么樣。

問題1:

# query will use the same embed_model
from llama_index import QueryMode
from llama_index import QuestionAnswerPromptopenai.api_key = os.environ.get("OPENAI_API_KEY")QA_PROMPT_TMPL = ("下面的內容來自魯迅先生的散文集《朝花夕拾》,很多內容是以第一人稱寫的 \n""---------------------\n""{context_str}""\n---------------------\n""根據這些信息,請回答問題: {query_str}\n""如果您不知道的話,請回答不知道\n"
)
QA_PROMPT = QuestionAnswerPrompt(QA_PROMPT_TMPL)response = index.query("魯迅先生在日本學習醫學的老師是誰?",mode=QueryMode.EMBEDDING,similarity_top_k = 1,text_qa_template=QA_PROMPT,verbose=True,
)
print(response)

輸出結果:

> Got node text: 一將書放在講臺上,便用了緩慢而很有頓挫的聲調,向學生介紹自己道:——“我就是叫作藤野嚴九郎的……。”后面有幾個人笑起來了。
他接著便講述解剖學在日本發達的歷史,那些大大小小的書,便是從最初到現今關于這一門學問的著作。...魯迅先生在日本學習醫學的老師是藤野嚴九郎。

問題2:

response = index.query("魯迅先生是在日本的哪個城市學習醫學的?",mode=QueryMode.EMBEDDING,similarity_top_k = 1,text_qa_template=QA_PROMPT,verbose=True,
)
print(response)

輸出結果:

> Got node text: 有時我常常想:他的對于我的熱心的希望,不倦的教誨,小而言之,是為中國,就是希望中國有新的醫學;大而言之,是為學術,就是希望新的醫學傳到中國去。...根據這些信息,無法得出魯迅先生是在日本的哪個城市學習醫學的答案。

可以看到,有些問題在這個模式下,定位到的文本片段是正確的。但是有些問題,雖然定位的還算是一個相關的片段,但是的確無法得出答案。

在這個過程中,我們可以觀察到這樣一個問題: 那就是單機的開源小模型能夠承載的文本輸入的長度問題。在我們使用OpenAI的gpt-3.5-turbo模型的時候,我們最長支持4096個Token,也就是一個文本片段可以放上上千字在里面。但是我們這里單機用的paraphrase-multilingual-mpnet-base-v2模型,只能支持128個Token的輸入,雖然對應的Tokenizer不一樣,但是就算一個字一個Token,也就100個字而已。這使得我們檢索出來的內容的上下文太少了,很多時候沒有足夠的信息,讓語言模型去回答。

當然,這個問題并不是無法彌補的。我們可以通過把更大規模的模型,部署到云端來解決。這個內容,我們課程的第三部分專門有一講會講解。

不過,有一個更難解決的問題,就是模型的推理能力問題。比如,我們可以再試試 第 1 講 里給商品總結英文名稱和賣點的例子。

question = """Consideration proudct : 工廠現貨PVC充氣青蛙夜市地攤熱賣充氣玩具發光蛙兒童水上玩具1. Compose human readale product title used on Amazon in english within 20 words.
2. Write 5 selling points for the products in Amazon.
3. Evaluate a price range for this product in U.S.Output the result in json format with three properties called title, selling_points and price_range"""
response, history = model.chat(tokenizer, question, history=[])
print(response)

輸出結果:

1. title: 充氣玩具青蛙夜市地攤賣
2. selling_points:- 工廠現貨:保證產品質量- PVC充氣:環保耐用- 夜市地攤:方便銷售- 熱賣:最受歡迎產品- 兒童水上玩具:適合各種年齡段兒童
3. price_range: (in USD)- low:   $1.99- high:   $5.99

可以看到,雖然這個結果不算太離譜,多少和問題還是有些關系的。但是無論是翻譯成英文,還是使用JSON返回,模型都沒有做到。給到的賣點也沒有任何“推理出來”的性質,都是簡單地對標題的重復描述。即使你部署一個更大版本的模型到云端,也好不到哪里去。

這也是ChatGPT讓人震撼的原因,的確目前它的效果還是要遠遠超出任何一個競爭對手和開源項目的。

小結

好了,最后我們來回顧一下。這一講里,我們一起嘗試用開源模型來代替ChatGPT。我們通過sentence_transfomers類型的模型,生成了文本分片的Embedding,并且基于這個Embedding來進行語義檢索。我們通過 ChatGLM 這個開源模型,實現了基于上下文提示語的問答。在簡單的電商QA這樣的場景里,效果也還是不錯的。即使我們使用的都是單機小模型,它也能正確回答出來。這些方法,也能節約我們的成本。不用把錢都交給OpenAI,可以攢著買顯卡來訓練自己的模型。

但是,當我們需要解決更加復雜的問題時,比如需要更長的上下文信息,或者需要模型本身更強的推理能力的時候,這樣的小模型就遠遠不夠用了。更長的上下文信息檢索,我們還能夠通過在云端部署更大規模的模型,解決部分問題。但是模型的推理能力,目前的確沒有好的解決方案。

所以不得不佩服,OpenAI的在AGI這個目標上耕耘多年后震驚世人的效果。

🔥運維干貨分享

  • 軟考高級系統架構設計師備考學習資料
  • 軟考中級數據庫系統工程師學習資料
  • 軟考高級網絡規劃設計師備考學習資料
  • Kubernetes CKA認證學習資料分享
  • AI大模型學習資料合集
  • 免費文檔翻譯工具(支持word、pdf、ppt、excel)
  • PuTTY中文版安裝包
  • MobaXterm中文版安裝包
  • pinginfoview網絡診斷工具中文版
  • Xshell、Xsftp、Xmanager中文版安裝包
  • Typora簡單易用的Markdown編輯器
  • Window進程監控工具,能自動重啟進程和卡死檢測
  • Spring 源碼學習資料分享
  • 畢業設計高質量畢業答辯 PPT 模板分享
  • IT行業工程師面試簡歷模板分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文章代碼|皮層/表皮特異性轉錄因子 bZIP89 的自然變異決定了玉米側根發育和抗旱能力

數據和材料可用性:評估本文結論所需的所有數據都包含在論文和/或補充材料中。本研究中的大量 RNA-seq 讀數存放在 NCBI 序列讀取檔案 (www.ncbi.nlm.nih.gov/sra) 中,登錄代碼為 SRP446501/PRJNA980895。scRNA-seq、DAP-seq 和 DN…

鎧大師:讓用戶暢享多元應用,助力鴻蒙生態發展

在全球信息技術產業格局加速重構的背景下,中國科技力量正以開放包容的姿態重塑操作系統生態范式。 5月19日,華為在成都舉辦的nova14系列及鴻蒙電腦新品發布會上,正式對外發布搭載了鴻蒙系統的筆記本電腦HUAWEI MateBook Pro與HUAWEI MateBoo…

初學Transformer架構和注意力機制

文章目錄 說明一 LLM 簡介二 Transformer 架構2.1 Transformer的架構組成2.1.1 輸入嵌入 (Input Embedding)2.1.2 編碼器 (Encoder) 的結構解碼器 (Decoder) 的結構2.1.3 輸出層 (Output Layer)結構 2.2 編碼和解碼器的獨立輸入理解 三 注意力機制 說明 本文適合初學者&#x…

基于PySide6與pycatia的CATIA幾何陣列生成器開發實踐

引言:參數化設計的工業價值 在航空航天、汽車制造等領域,復雜幾何圖案的批量生成是模具設計與機械加工的核心需求。傳統手動建模方式存在效率低下、參數調整困難等問題。本文基于PySide6+pycatia技術棧,實現了一套支持??動態參數配置??、??智能幾何陣列生成??的自動…

PDF 編輯批量拆分合并OCR 識別

各位辦公小能手們!你們有沒有過被PDF文件折磨得死去活來的經歷?反正我是有,每次要編輯PDF,那叫一個費勁啊!不過呢,今天我要給大家介紹一款神器——WPS PDF to Word,有了它,PDF編輯那…

棒球比賽暗號百科·棒球1號位

關于棒球比賽暗號百科介紹,涵蓋基本概念、歷史演變、常見類型及經典案例: 棒球比賽暗號百科 一、定義與作用 棒球暗號是球員、教練團隊通過手勢、動作、語言或道具傳遞戰術指令的密碼系統,旨在隱蔽溝通攻防策略,避免對手破解。其…

Python實現基于線性回歸的空氣質量預測系統并達到目標指標

為了實現基于線性回歸的空氣質量預測系統并達到目標指標,以下是完整的Python代碼實現: import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScal…

236.二叉樹的最近公共祖先

在樹結構中,祖先指的是一個節點的父節點或更高層級的父節點。公共祖先是指同時為節點p和q的祖先的節點。最近公共祖先(LCA)則是指在所有公共祖先中,距離p和q最近的那個節點。尋找LCA的方法可以按以下情況進行分析: 當…

面試題總結一

第一天 1. 快速排序 public class QuickSort {public static void quickSort(int[] arr, int low, int high) {if (low < high) {// 分區操作&#xff0c;獲取基準元素的最終位置int pivotIndex partition(arr, low, high);// 遞歸排序基準元素左邊的部分quickSort(arr, …

Stable Diffusion底模對應的VAE推薦

以下是主流Stable Diffusion底模對應的VAE推薦表格&#xff1a; 底模版本推薦VAE類型說明SD1.5SD1.5專用VAE通常使用vae-ft-mse-840000-ema-pruned.safetensorsSD2.0SD1.5兼容VAE或SD2專用VAE部分SD2模型需配套512-ema-only.vae.ptSD3內置VAESD3系列模型通常自帶集成VAE無需額…

北斗導航 | 基于matlab的多波束技術的衛星通信系統性能仿真

基于多波束技術的低軌(LEO)衛星通信系統 **1. 仿真場景建模**1.1 LEO衛星軌道參數設置1.2 地面終端分布**2. 多波束天線模型**2.1 波束方向圖生成2.2 頻率復用方案**3. 鏈路預算與干擾分析**3.1 自由空間路徑損耗3.2 信噪比(SNR)計算**4. 動態資源調度算法**4.1 基于流量需…

uni-app學習筆記十--vu3 computed的運用(一)

vue官方推薦使用計算屬性來描述依賴響應式狀態的復雜邏輯&#xff0c;computed具有緩存的作用&#xff0c;一個計算屬性僅會在其響應式依賴更新時才重新計算&#xff0c;這意味著只要 相關值 不改變&#xff0c;無論多少次訪問 都會立即返回先前的計算結果&#xff0c;從而在一…

多模態大模型詳解

首先&#xff0c;得明確多模態大模型的定義和核心能力&#xff0c;比如處理文本、圖像、音頻、視頻等多種數據模態。 其次是技術架構&#xff0c;可能需要分模塊描述&#xff0c;比如感知層、特征提取、融合策略等&#xff0c;還有技術趨勢如模型輕量化、開源生態。 應用場景…

如何通過UI設計提高用戶留存率?

在競爭激烈的移動應用市場中&#xff0c;提高用戶留存率是開發者的關鍵目標。UI 設計在實現這一目標中起著舉足輕重的作用。精心設計的 UI 不僅能夠吸引新用戶&#xff0c;還能促使現有用戶持續使用。以下是通過 UI 設計提升用戶留存率的幾種關鍵方法。 優化用戶體驗 用戶體驗…

Linux(6)——第一個小程序(進度條)

目錄 一、行緩沖區的概念 二、\r與\n 三、進度條代碼書寫與展示 1.如何表示進度條是在加載的 2.整體框架 3.書寫 3.1makefile: 3.2process.h: 3.3process.c: 3.4main.c&#xff1a; 3.5美化 一、行緩沖區的概念 首先&#xff0c;我們來見一見行緩沖區&#xff0c;…

51頁 @《人工智能生命體 新啟點》中國龍 原創連載

《 人工智能生命體 新啟點 》一書&#xff0c;以建立意識來建立起生命體&#xff0c;讓其成為獨立、自主的活動個體&#xff1b;也就可以理解為建立生命體的思想指導。 讓我們能夠賦予他靈魂&#xff01;

微軟全新開源命令行文本編輯器:Edit — 致敬經典,擁抱現代

名人說:博觀而約取,厚積而薄發。——蘇軾《稼說送張琥》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、引言:命令行的新利器二、Edit:致敬經典,擁抱現代1. 命令行的“新升級”2. 為什么要有 Edit?三、核心功能與特性一覽1. 完全開源、MIT 許可證…

使用MybatisPlus實現sql日志打印優化

背景&#xff1a; 在排查無憂行后臺服務日志時&#xff0c;一個請求可能會包含多個執行的sql&#xff0c;經常會遇到SQL語句與對應參數不連續顯示&#xff0c;或者參數較多需要逐個匹配的情況。這種情況下&#xff0c;如果需要還原完整SQL語句就會比較耗時。因此&#xff0c;我…

go多線程壓測監控

實現了 go多協程壓力測試實現了Monitor&#xff0c;異步統計qps、時延、cpu(client端)等指標&#xff0c;周期printStat。只需要把單條執行func傳給Monitor即可命令行傳參ctrlc之后正常退出(mock cpu 占用) 代碼見 https://gitee.com/bbjg001/golearning/tree/master/others/…

安卓無障礙腳本開發全教程

文章目錄 第一部分&#xff1a;無障礙服務基礎1.1 無障礙服務概述核心功能&#xff1a; 1.2 基本原理與架構1.3 開發環境配置所需工具&#xff1a;關鍵依賴&#xff1a; 第二部分&#xff1a;創建基礎無障礙服務2.1 服務聲明配置2.2 服務配置文件關鍵屬性說明&#xff1a; 2.3 …