不知道課程上到這里,你賬戶里免費的5美元的額度還剩下多少了?如果你嘗試著完成我給的幾個數據集里的思考題,相信這個額度應該是不太夠用的。而ChatCompletion的接口,又需要傳入大量的上下文信息,實際消耗的Token數量其實比我們感覺的要多。
而且,除了費用之外,還有一個問題是數據安全。因為每個國家的數據監管要求不同,并不是所有的數據,都適合通過OpenAI的API來處理的。所以,從這兩個角度出發,我們需要一個OpenAI以外的解決方案。那對于沒有足夠技術儲備的中小型公司來說,最可行的一個思路就是利用好開源的大語言模型。
在Colab里使用GPU
因為這一講我們要使用一些開源模型,但不是所有人的電腦里都有一個強勁的NVidia GPU的。所以,我建議你通過Colab來運行對應的Notebook,并且注意,要把對應的運行環境設置成GPU。
- 你先選擇菜單欄里的Runtime,然后點擊Change runtime type。
- 然后在彈出的對話框里,把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行業工程師面試簡歷模板分享