
如何快速實現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
當(dāng)然我們今天的主角是他的開放平臺[2]:
注冊之后登錄進(jìn)入控制臺就可以看到模型、文檔、賬單等模塊:
查看?API Key?可以看到默認(rèn)的 API Key,直接拷貝使用,或者創(chuàng)建新的 API Key:
從控制臺的首頁點擊 API 文檔,進(jìn)入 API 的使用指南[3]:
快速安裝:pip install zhipuai
然后寫一個例子測試下:
import zhipuai
zhipuai.api_key = "xxx" # 你的 api key
def invoke_prompt(prompt):
response = zhipuai.model_api.invoke(
model="chatglm_turbo",
prompt=[
{"role": "user", "content": prompt},
],
top_p=0.7,
temperature=0.9,
)
if response['code'] == 200:
return response['data']['choices'][0]['content']
return 'LLM not worked'
if __name__ == '__main__':
response = invoke_prompt('簡單介紹下人工智能是什么')
print(response)
回答如下:
人工智能(Artificial Intelligence,簡稱AI)是一門研究、開發(fā)模擬、延伸和擴(kuò)展人類智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的新興技術(shù)科學(xué)。人工智能領(lǐng)域的研究涵蓋了多個方面,如機(jī)器人、語言識別、圖像識別、自然語言處理和專家系統(tǒng)等。其目標(biāo)是使計算機(jī)能夠模擬和實現(xiàn)人類智能的功能, 從而在某些領(lǐng)域達(dá)到甚至超過人類的智能水平。\n\n人工智能專業(yè)是一門多學(xué)科交叉的新興學(xué)科,旨在培養(yǎng)掌握人工智能基礎(chǔ)理論、 基本方法和應(yīng)用技術(shù)的人才。專業(yè)課程包括人工智能概論、認(rèn)知科學(xué)、機(jī)器學(xué)習(xí)、模式識別、深度學(xué)習(xí)、知識工程、數(shù)據(jù)挖掘、 物聯(lián)網(wǎng)等系列課程。\n\n人工智能的發(fā)展包括多個階段,如啟蒙、繁榮、低谷等。從20世紀(jì)50年代開始,人工智能逐漸成為一門獨立的學(xué)科。隨著計算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)和大數(shù)據(jù)技術(shù)的快速發(fā)展,人工智能進(jìn)入了一個新的黃金時期。在我國,人工智能專業(yè)的發(fā)展也得到了政府和企業(yè)的大力支持,被視為未來科技創(chuàng)新的重要驅(qū)動力。”
上面代碼我們注意到,prompt
參數(shù)是一個數(shù)組,其設(shè)計是天然針對對話、以及少樣本提示的。
比如:
prompt = [
{"role": "user", "content": '提問1'},
{"role": "assistant", "content": '回答1'},
{"role": "user", "content": '提問2'},
{"role": "assistant", "content": '回答2'},
{"role": "user", "content": prompt},
]
AI 會跟去前面的對話歷史,對最后的 prompt
進(jìn)行回答。
少樣本提示少樣本提示 雖然是提示工程中最簡單的一個技術(shù),但這種方法其實有很大的威力, 在一個優(yōu)秀的 LLM 之上進(jìn)行少樣本提示甚至可以在很多場景下代替模型微調(diào), 達(dá)到意想不到的效果。
好了,現(xiàn)在基本調(diào)用是可以了。我們再來實現(xiàn)一個 AI 的常用場景,知識庫檢索。
我們這次實現(xiàn)知識庫,已然使用?LlamaIndex[4], LlamaIndex 是一個簡單靈活且強(qiáng)大的數(shù)據(jù)框架,用于將自定義數(shù)據(jù)源連接到大型語言模型。感興趣的朋友可以去查看 LlmaIndex 文檔[5]?或者去我 LlamaIndex 的合集去了解更多信息。
先用 Pip 簡單安裝一下 Llama Index:
pip?install?llama-index
然后我們導(dǎo)入下測試是否安裝成功:
import llama_index
print(llama_index.__version__)
# 0.9.10
接下來讓 Llama Index 使用 智譜AI 作為大模型。
我們到 LlamaIndex 的文檔「Available LLM integrations[6]」看下它現(xiàn)在支持哪些大模型。
我們看到,雖然他支持了很多的商業(yè)模型和開源項目,但是并沒有 「智譜 AI」 以及國內(nèi)的一眾 AI 產(chǎn)品。
國產(chǎn)AI 崛起之路還真是任重而道遠(yuǎn)啊。
前面我們提到,Llama Index 是一個簡單靈活的數(shù)據(jù)框架,既然官方還沒有集成,我們就自己集成一下好了。
LlamaIndex 提供了一個叫做?CustomLLM
?的抽象類來讓我們方便的集成自己的大模型產(chǎn)品:
class CustomLLM(LLM):
"""Simple abstract base class for custom LLMs.
Subclasses must implement the __init__
, complete
,
stream_complete
, and metadata
methods.
"""
從注釋就能看到,實現(xiàn)一個自己的 LLM 其實很簡單,只需要實現(xiàn) __init__
, complete
, stream_complete
以及 metadata
這幾個方法即可。
什么是元數(shù)據(jù)元數(shù)據(jù)稍微正式的解釋是描述數(shù)據(jù)的數(shù)據(jù)。比較繞口,需要仔細(xì)體會。簡單說就是記錄的屬性、表的結(jié)構(gòu)、界面的布局、數(shù)據(jù)的特征、程序的參數(shù)。
上面四個方法中我們比較陌生的應(yīng)該是 metadata
了,metadata 翻譯一下就是元數(shù)據(jù), 而 LLM 的元數(shù)據(jù)是什么, 比較通用的有如下一些:
model_name: str = "chatglm_turbo"
top_p = 0.7
temperature = 0.9
num_output: int = 256
context_window: int = 3900
像「模型名稱」、「溫度」、「top p」這些參數(shù)\屬性大家想必已經(jīng)很了解了, 我們簡單實現(xiàn)一下:
class ZhipuLLM(CustomLLM):
model_name: str = "chatglm_turbo"
top_p = 0.7
temperature = 0.9
@property
def metadata(self) -> LLMMetadata:
"""Get LLM metadata."""
return LLMMetadata(
context_window=self.context_window,
num_output=self.num_output,
model_name=self.model_name,
)
因為 智譜AI 的API 也沒有太多的參數(shù),我們把?top_p
?和?temperature
?取一個比較合理的值, 直接放到調(diào)用程序里面,其實可以不需要設(shè)計 Metadata,實現(xiàn)一個空方法即可:
class ZhipuLLM(CustomLLM):
@property
def metadata(self) -> LLMMetadata:
return LLMMetadata()
接下來就是實現(xiàn)?complete
?方法,前面我們有一個?invoke_prompt
?方法來實現(xiàn) 智譜AI 的調(diào)用,這里直接拿來用, 也不去實例化或者過多設(shè)置參數(shù),越簡單越好:
@llm_completion_callback()
def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
response = invoke_prompt(prompt)
return CompletionResponse(text=response)
stream_complete流式返回官方也有例子,我這里就不實現(xiàn)了。
智譜 AI 也提供了文本嵌入接口,那我們當(dāng)然也是直接拿來用了,這樣子就徹底擺脫了了 OpenAI 和自己搭建模型了。
LlamaIndex 的嵌入式基于?BaseEmbedding
?實現(xiàn)的,我們也寫一個 智譜AI 的實現(xiàn),來不及做過多解釋了,直接看代碼:
class ZhipuEmbedding(BaseEmbedding):
_model: str = PrivateAttr()
_instruction: str = PrivateAttr()
def __init__(
self,
instructor_model_name: str = "text_embedding",
instruction: str = "Represent a document for semantic search:",
**kwargs: Any,
) -> None:
self._model = 'text_embedding'
self._instruction = instruction
super().__init__(**kwargs)
@classmethod
def class_name(cls) -> str:
return "zhipu_embeddings"
async def _aget_query_embedding(self, query: str) -> List[float]:
return self._get_query_embedding(query)
async def _aget_text_embedding(self, text: str) -> List[float]:
return self._get_text_embedding(text)
def _get_query_embedding(self, query: str) -> List[float]:
embeddings = invoke_embedding(query)
return embeddings
def _get_text_embedding(self, text: str) -> List[float]:
embeddings = invoke_embedding(text)
return embeddings
def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
return [self._get_text_embedding(text) for text in texts]
現(xiàn)在讓我們把前面的成果合在一起,寫一個簡單的程序看看,能不能行得通:
首先我們再目錄下放置一個文本文件,當(dāng)前 PDF、Excel、Docx 都行,我這里還是用之前亞運會獎牌設(shè)計的文案:
然后直接運行程序:
# define our LLM
llm = ZhipuLLM()
embed_model = ZhipuEmbedding()
service_context = ServiceContext.from_defaults(
llm=llm, embed_model=embed_model
)
# Load the your data
documents = SimpleDirectoryReader(doc_path).load_data()
index = VectorStoreIndex.from_documents(documents, service_context=service_context)
# Query and print response
query_engine = index.as_query_engine()
response = query_engine.query("杭州亞運會獎牌的工藝和設(shè)計理念?,請用中文回答。")
print(response)
來看下回答:
杭州亞運會獎牌的工藝和設(shè)計理念如下:
1. 工藝:獎牌采用了一系列復(fù)雜的工藝,包括壓印成型、
數(shù)銑外形及槽坑、修整刷拋、鍍金鍍銀、表面防護(hù)等。
綬帶采用織錦提花工藝、環(huán)保印花技術(shù),雙面手工縫合。
此外,獎牌正面采用了江南傳統(tǒng)工藝——打鏨雕,
將四種書法(真、草、隸、篆)的杭州與亞奧理事會
的英文縮寫有機(jī)結(jié)合。
2. 設(shè)計理念:獎牌設(shè)計融合了杭州三大世界文化遺產(chǎn)
——西湖、大運河、良渚古城遺址,
展現(xiàn)了杭州山水景觀和江南文化。
獎牌正面勾勒出“三面云山一面城”的杭城畫卷,
背面形似方形印章,寓意運動員在杭州亞運會上
留下美好印記。整體設(shè)計別具一格,
具有高度辨識度,體現(xiàn)了美美與共、和而不同的含義。
此外,獎牌設(shè)計還展現(xiàn)了杭州生態(tài)文明之都的氣質(zhì),
湖光山色,綠水青山,鑄就了金山銀山,
也體現(xiàn)了勇攀高峰的體育精神。
獎牌直徑70毫米,厚度6毫米,
正面圓形漸變色,背面采用杭州江南絲繡技藝呈現(xiàn)的篆刻圖案。
整體獎牌設(shè)計充滿東方意蘊之美,
將深厚底蘊的南宋文化與杭州地域特色相結(jié)合,
表達(dá)獨特的美學(xué)理念。
回答均來源于文案,但是進(jìn)行了重新組織,我只想說中文表達(dá)如此流暢!遠(yuǎn)勝我自己。
Llama Index 里使用大模型的地方主要是上面兩處。這兩個點對接之后,余下的各種玩法也均和使用 OpenAI 無異。更多的場景以及可落地的 AI 玩法,后面再和大家分享。
[1]
?智譜 AI:?https://www.zhipuai.cn/[2]
?開放平臺:?https://open.bigmodel.cn/[3]
?API 的使用指南:?https://open.bigmodel.cn/dev/api[4]
?LlamaIndex:?https://www.llamaindex.ai/[5]
?LlmaIndex 文檔:?https://docs.llamaindex.ai/en/stable/[6]
?Available LLM integrations:?https://docs.llamaindex.ai/en/stable/module_guides/models/llms/modules.html
文章轉(zhuǎn)自微信公眾號@數(shù)翼