當(dāng)然我們今天的主角是他的開放平臺(tái)[2]

注冊(cè)之后登錄進(jìn)入控制臺(tái)就可以看到模型、文檔、賬單等模塊:

查看?API Key?可以看到默認(rèn)的 API Key,直接拷貝使用,或者創(chuàng)建新的 API Key:

API 使用

從控制臺(tái)的首頁點(diǎn)擊 API 文檔,進(jìn)入 API 的使用指南[3]

快速安裝:pip install zhipuai

然后寫一個(gè)例子測(cè)試下:

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)域的研究涵蓋了多個(gè)方面,如機(jī)器人、語言識(shí)別、圖像識(shí)別、自然語言處理和專家系統(tǒng)等。其目標(biāo)是使計(jì)算機(jī)能夠模擬和實(shí)現(xiàn)人類智能的功能, 從而在某些領(lǐng)域達(dá)到甚至超過人類的智能水平。\n\n人工智能專業(yè)是一門多學(xué)科交叉的新興學(xué)科,旨在培養(yǎng)掌握人工智能基礎(chǔ)理論、 基本方法和應(yīng)用技術(shù)的人才。專業(yè)課程包括人工智能概論、認(rèn)知科學(xué)、機(jī)器學(xué)習(xí)、模式識(shí)別、深度學(xué)習(xí)、知識(shí)工程、數(shù)據(jù)挖掘、 物聯(lián)網(wǎng)等系列課程。\n\n人工智能的發(fā)展包括多個(gè)階段,如啟蒙、繁榮、低谷等。從20世紀(jì)50年代開始,人工智能逐漸成為一門獨(dú)立的學(xué)科。隨著計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)和大數(shù)據(jù)技術(shù)的快速發(fā)展,人工智能進(jìn)入了一個(gè)新的黃金時(shí)期。在我國,人工智能專業(yè)的發(fā)展也得到了政府和企業(yè)的大力支持,被視為未來科技創(chuàng)新的重要驅(qū)動(dòng)力。”

智譜 AI 的提示參數(shù)

上面代碼我們注意到,prompt 參數(shù)是一個(gè)數(shù)組,其設(shè)計(jì)是天然針對(duì)對(duì)話、以及少樣本提示的。

比如:

prompt = [
{"role": "user", "content": '提問1'},
{"role": "assistant", "content": '回答1'},
{"role": "user", "content": '提問2'},
{"role": "assistant", "content": '回答2'},
{"role": "user", "content": prompt},
]

AI 會(huì)跟去前面的對(duì)話歷史,對(duì)最后的 prompt 進(jìn)行回答。

少樣本提示少樣本提示 雖然是提示工程中最簡單的一個(gè)技術(shù),但這種方法其實(shí)有很大的威力, 在一個(gè)優(yōu)秀的 LLM 之上進(jìn)行少樣本提示甚至可以在很多場景下代替模型微調(diào), 達(dá)到意想不到的效果。

好了,現(xiàn)在基本調(diào)用是可以了。我們?cè)賮韺?shí)現(xiàn)一個(gè) AI 的常用場景,知識(shí)庫檢索。

Llama Index

我們這次實(shí)現(xiàn)知識(shí)庫,已然使用?LlamaIndex[4]LlamaIndex 是一個(gè)簡單靈活且強(qiáng)大的數(shù)據(jù)框架,用于將自定義數(shù)據(jù)源連接到大型語言模型。感興趣的朋友可以去查看 LlmaIndex 文檔[5]?或者去我 LlamaIndex 的合集去了解更多信息。

安裝

先用 Pip 簡單安裝一下 Llama Index:

pip?install?llama-index

然后我們導(dǎo)入下測(cè)試是否安裝成功:

import llama_index
print(llama_index.__version__)
# 0.9.10

接下來讓 Llama Index 使用 智譜AI 作為大模型。

支持的 LLM

我們到 LlamaIndex 的文檔「Available LLM integrations[6]」看下它現(xiàn)在支持哪些大模型。

我們看到,雖然他支持了很多的商業(yè)模型和開源項(xiàng)目,但是并沒有 「智譜 AI」 以及國內(nèi)的一眾 AI 產(chǎn)品。

國產(chǎn)AI 崛起之路還真是任重而道遠(yuǎn)啊。

前面我們提到,Llama Index 是一個(gè)簡單靈活的數(shù)據(jù)框架,既然官方還沒有集成,我們就自己集成一下好了。

集成智譜AI

LlamaIndex 提供了一個(gè)叫做?CustomLLM?的抽象類來讓我們方便的集成自己的大模型產(chǎn)品:

class CustomLLM(LLM):
"""Simple abstract base class for custom LLMs.

Subclasses must implement the __init__, complete, stream_complete, and metadata methods. """

從注釋就能看到,實(shí)現(xiàn)一個(gè)自己的 LLM 其實(shí)很簡單,只需要實(shí)現(xiàn) __init__completestream_complete 以及 metadata 這幾個(gè)方法即可。

metadata 方法

什么是元數(shù)據(jù)元數(shù)據(jù)稍微正式的解釋是描述數(shù)據(jù)的數(shù)據(jù)。比較繞口,需要仔細(xì)體會(huì)。簡單說就是記錄的屬性、表的結(jié)構(gòu)、界面的布局、數(shù)據(jù)的特征、程序的參數(shù)。

上面四個(gè)方法中我們比較陌生的應(yīng)該是 metadata 了,metadata 翻譯一下就是元數(shù)據(jù), 而 LLM 的元數(shù)據(jù)是什么, 比較通用的有如下一些:

像「模型名稱」、「溫度」、「top p」這些參數(shù)\屬性大家想必已經(jīng)很了解了, 我們簡單實(shí)現(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,
)

因?yàn)?智譜AI 的API 也沒有太多的參數(shù),我們把?top_p?和?temperature?取一個(gè)比較合理的值, 直接放到調(diào)用程序里面,其實(shí)可以不需要設(shè)計(jì) Metadata,實(shí)現(xiàn)一個(gè)空方法即可:

class ZhipuLLM(CustomLLM):
@property
def metadata(self) -> LLMMetadata:
return LLMMetadata()

complete 方法

接下來就是實(shí)現(xiàn)?complete?方法,前面我們有一個(gè)?invoke_prompt?方法來實(shí)現(xiàn) 智譜AI 的調(diào)用,這里直接拿來用, 也不去實(shí)例化或者過多設(shè)置參數(shù),越簡單越好:

@llm_completion_callback()
def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:
response = invoke_prompt(prompt)
return CompletionResponse(text=response)

stream_complete流式返回官方也有例子,我這里就不實(shí)現(xiàn)了。

文本嵌入 Embedding

智譜 AI 也提供了文本嵌入接口,那我們當(dāng)然也是直接拿來用了,這樣子就徹底擺脫了了 OpenAI 和自己搭建模型了。

LlamaIndex 的嵌入式基于?BaseEmbedding?實(shí)現(xiàn)的,我們也寫一個(gè) 智譜AI 的實(shí)現(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]

LlamaIndex 結(jié)合 智譜 AI

現(xiàn)在讓我們把前面的成果合在一起,寫一個(gè)簡單的程序看看,能不能行得通:

首先我們?cè)倌夸浵路胖靡粋€(gè)文本文件,當(dāng)前 PDF、Excel、Docx 都行,我這里還是用之前亞運(yùn)會(huì)獎(jiǎng)牌設(shè)計(jì)的文案:

然后直接運(yùn)行程序:

# 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("杭州亞運(yùn)會(huì)獎(jiǎng)牌的工藝和設(shè)計(jì)理念?,請(qǐng)用中文回答。")
print(response)

來看下回答:

杭州亞運(yùn)會(huì)獎(jiǎng)牌的工藝和設(shè)計(jì)理念如下:

1. 工藝:獎(jiǎng)牌采用了一系列復(fù)雜的工藝,包括壓印成型、
數(shù)銑外形及槽坑、修整刷拋、鍍金鍍銀、表面防護(hù)等。
綬帶采用織錦提花工藝、環(huán)保印花技術(shù),雙面手工縫合。
此外,獎(jiǎng)牌正面采用了江南傳統(tǒng)工藝——打鏨雕,
將四種書法(真、草、隸、篆)的杭州與亞奧理事會(huì)
的英文縮寫有機(jī)結(jié)合。

2. 設(shè)計(jì)理念:獎(jiǎng)牌設(shè)計(jì)融合了杭州三大世界文化遺產(chǎn)
——西湖、大運(yùn)河、良渚古城遺址,
展現(xiàn)了杭州山水景觀和江南文化。
獎(jiǎng)牌正面勾勒出“三面云山一面城”的杭城畫卷,
背面形似方形印章,寓意運(yùn)動(dòng)員在杭州亞運(yùn)會(huì)上
留下美好印記。整體設(shè)計(jì)別具一格,
具有高度辨識(shí)度,體現(xiàn)了美美與共、和而不同的含義。

此外,獎(jiǎng)牌設(shè)計(jì)還展現(xiàn)了杭州生態(tài)文明之都的氣質(zhì),
湖光山色,綠水青山,鑄就了金山銀山,
也體現(xiàn)了勇攀高峰的體育精神。
獎(jiǎng)牌直徑70毫米,厚度6毫米,
正面圓形漸變色,背面采用杭州江南絲繡技藝呈現(xiàn)的篆刻圖案。
整體獎(jiǎng)牌設(shè)計(jì)充滿東方意蘊(yùn)之美,
將深厚底蘊(yùn)的南宋文化與杭州地域特色相結(jié)合,
表達(dá)獨(dú)特的美學(xué)理念。

回答均來源于文案,但是進(jìn)行了重新組織,我只想說中文表達(dá)如此流暢!遠(yuǎn)勝我自己。

結(jié)語

Llama Index 里使用大模型的地方主要是上面兩處。這兩個(gè)點(diǎn)對(duì)接之后,余下的各種玩法也均和使用 OpenAI 無異。更多的場景以及可落地的 AI 玩法,后面再和大家分享。

引用鏈接

[1]?智譜 AI:?https://www.zhipuai.cn/
[2]?開放平臺(tái):?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)自微信公眾號(hào)@數(shù)翼

上一篇:

OpenAI Assistants API 極簡入門(附LangChain集成)

下一篇:

創(chuàng)建你的第一個(gè)使用 OpenAI ChatGPT API 的程序
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)