目錄
前言
1 準備工作
1.1 環境搭建
1.2 獲取 API KEY
2 寫代碼
2.1 引用庫
2.2 創建用戶
2.3 創建對話
2.4 輸出內容
2.5 調試
2.6 全部代碼
2.7?簡短的總結
3 優化代碼
3.1 規范代碼
3.1.1 引用庫
3.1.2 創建提示詞
3.1.3 創建模型
3.1.4 規范輸出(非必須)
3.2 用戶輸入
3.3 連接步驟
3.4 循環輸入
3.5 全部代碼
4 總結
前言
現在,AI 已經進入了人們生活的每個角落,而 AI 大模型更是大火,諸如文心一言、Chatgpt、Kimi、清譜智言等等。
那為什么不能擁有一個自己的 AI 呢?于是我稍微研究了一下,本篇文章就將介紹如何搭建一個屬于自己的 AI 機器人。話不多說,正片開始——
1 準備工作
1.1 環境搭建
自己訓練一個 AI 機器人費時費力又費錢,所以搭建 AI 用的肯定是 API 接口。
本文我用的是月之暗面的 Kimi AI 做演示(當然,清譜智言或其他也可以,但是注意,文心一言的API要錢!)
至于寫代碼的依賴庫,如下:
python-dotenv
openai
langchain
langchain_openai
1.2 獲取 API KEY
獲取 API key 其實很簡單,這里用 Kimi 舉例,其他平臺也大同小異。
首先訪問?Moonshot AI - 開放平臺?(前提是你要先登錄)
點擊 新建
?名字隨便輸
接著它會顯示密鑰,復制好,別告訴別人。
?
接著,在項目文件夾中新建一個.venv文件,如圖,把 api key 復制進去:
在打碼的地方填寫 api key
OK,準備工作完成啦!
2 寫代碼
2.1 引用庫
from dotenv import load_dotenv # 虛擬環境
from openai import OpenAI # 調用 API
2.2 創建用戶
其中 load_dotenv() 就是獲取 .venv 中的信息。
下面的函數中,base_url 就是你想調用的 AI 它的接口網址,一般都能在開發文檔中找到。
load_dotenv()client = OpenAI(base_url="https://api.moonshot.cn/v1"
)
2.3 創建對話
這是最重要的一步!
先看代碼:
ask = "南京鹽水鴨怎么樣?"completion = client.chat.completions.create(model="moonshot-v1-32k",messages=[{"role": "system", "content": "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞。"},{"role": "user", "content": ask},],max_tokens=500,temperature=0.7,
)
接下來請看講解:
- model:這個就是大模型的名稱,一般也能在開發文檔中找到;
- messages:AI 接收的信息一般分為 3 個來源:系統(system)、用戶(user)、AI(assistant)。這些信息中包括系統對 AI 的指示,用于確定 AI 的身份、用處,以及用戶所說的話,還有之前的所有對話。在代碼中,用一個字典組成的列表來儲存;
- max_tokens:這個參數用于限定 AI 輸出的內容最大值,一個 token 表示一個詞語;
- temperature:這個參數用于規定 AI 輸出內容的確定性,設成 0.7 就行了;
像這個程序中,我設置的功能就是讓 AI 為美食寫點評詞,你當然也可以按照自己的需要修改。
2.4 輸出內容
激動人心的時刻!?
print(completion.choices[0].message.content)
這個程序輸出的內容:
南京鹽水鴨,是金陵古城的美食瑰寶,承載著六朝古都深厚的文化底蘊。這道佳肴以其獨特的制作工藝和絕妙的風味,在眾多美食中獨樹一幟。選材講究,選用的是肉質細嫩、肥而不膩的南京本地麻鴨。經過精細的宰殺、清洗、腌制等工序,使得鴨肉的每一寸肌理都滲透著獨特的風味。腌制過程中,恰到好處的鹽分與鴨肉的鮮美完美融合,使鴨肉更加鮮嫩可口。烹飪技藝更是令人贊嘆。將腌制好的鴨肉放入特制的鹵水中,用文火慢燉,使鴨肉在不斷吸收鹵水精華的同時,保持了肉質的嫩滑。鹵水中的香料與鴨肉的鮮美相互交融,形成了一種獨特的香氣,令人垂涎三尺。成品的南京鹽水鴨,色澤金黃,皮脆肉嫩,鮮美可口。輕輕一咬,鴨肉的鮮嫩與鹵水的香味瞬間在口腔中爆發,讓人回味無窮。鴨肉的鮮美與鹵水的香料,形成了一種絕妙的平衡,既不會過于咸膩,也不會過于清淡,恰到好處地滿足了味蕾的需求。 品嘗南京鹽水鴨,就像是在品味一段歷史,感受一種文化,讓人在享受美味的同時,也能感受到南京這座城市的韻味。
2.5 調試
嘶~
AI 輸出的內容好像有點太長了,于是我們需要為它所以點調試。(畢竟任何程序都要調試)
比如把它的要求改一下,限定一下字數。
messages=[{"role": "system", "content": "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞,精簡一點,100字以內。"},{"role": "user", "content": ask},
],
看看結果:
南京鹽水鴨,傳統佳肴。鴨肉鮮嫩爽口,咸香適中,令人回味無窮。腌制工藝獨特,肉質細膩,皮薄肉厚,食之不膩。每一口都是對南京風味的深刻體驗。
果然好多了。
2.6 全部代碼
from dotenv import load_dotenv
from openai import OpenAIload_dotenv()client = OpenAI(base_url="https://api.moonshot.cn/v1"
)ask = "南京鹽水鴨怎么樣?"completion = client.chat.completions.create(model="moonshot-v1-32k",messages=[{"role": "system", "content": "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞,精簡一點,100字以內。"},{"role": "user", "content": ask},],max_tokens=500,temperature=0.7,
)print(completion.choices[0].message.content)
2.7?簡短的總結
我們現在已經有了一個簡單的 AI,但是還有一些問題:
- 代碼流程不夠規范
- 只能通過修改代碼來實現問題的修改
- 只能實現一輪對話
接下來就來解決這些問題吧!
3 優化代碼
3.1 規范代碼
這里,就要隆重請出:langchain 第三方庫!
它可以幫我們很好的流程化這段代碼。
可以新建一個代碼文件,因為代碼要大改
3.1.1 引用庫
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplateload_dotenv()
3.1.2 創建提示詞
其實就是修改了之前的 創建用戶?中的代碼。
注意:這里用戶的名字從user變為了human
prompt_template = ChatPromptTemplate.from_messages([("system", "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞,精簡一點,100字以內。"),("human", "南京鹽水鴨怎么樣?")]
)
3.1.3 創建模型
修改了原來的 創建對話。
model = ChatOpenAI(model="moonshot-v1-32k",openai_api_base="https://api.moonshot.cn/v1",max_tokens=500,temperature=0.7,
)
3.1.4 規范輸出(非必須)
一般會用另一個大模型來規范前一個大模型的輸出,但并非必要。
def output_parser(output: str):parser_model = ChatOpenAI(model = 'moonshot-v1-32k',temperature=0.8,openai_api_base = "https://api.moonshot.cn/v1")message = "你需要潤色這段文字:`{text}`"return parser_model.invoke(message.format(text=output))
3.2 用戶輸入
先把問題中的輸入部分修改即可:
prompt_template = ChatPromptTemplate.from_messages([("system", "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞,精簡一點,100字以內。"),("human", "{food}怎么樣?")]
)
3.3 連接步驟
用 langchain 連接步驟非常簡單,用 | 符號就行了:
chain = prompt_template | model# 若加入規范輸出的部分,代碼如下
# chain = prompt_template | model | output_parser
3.4 循環輸入
利用 while True 進行用戶循環輸入,非常簡單不是嗎?
while True:food = input("你想點評什么:")answer = chain.invoke(input = {'food': food})print(answer.content)
這下再來看看結果吧!
真的是太 NICE 了!
3.5 全部代碼
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplateload_dotenv()prompt_template = ChatPromptTemplate.from_messages([("system", "你是一個美食家,你要為用戶說的美食寫一段有文采的點評詞,精簡一點,100字以內。"),("human", "{food}怎么樣?")]
)model = ChatOpenAI(model="moonshot-v1-32k",openai_api_base="https://api.moonshot.cn/v1",max_tokens=500,temperature=0.7,
)chain = prompt_template | model
while True:food = input("你想點評什么:")answer = chain.invoke(input = {'food': food})print(answer.content)
4 總結
我們成功通過調用 API 實現了一個本地的定制機器人,感覺如何?
文章如有疏漏,歡迎提出!如果對你有幫助的話,別忘?點贊收藏👍
下期再見!