【Python】搭建屬于自己 AI 機器人

目錄

前言

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 實現了一個本地的定制機器人,感覺如何?

文章如有疏漏,歡迎提出!如果對你有幫助的話,別忘?點贊收藏👍

下期再見!

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

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

相關文章

在線調試網絡接口的免費網站

免費接口網站 GET接口 https://httpbin.org/get https://httpbin.org/ip https://publicobject.com/helloworld.txt POST接口 https://httpbin.org/post 調試網站 Postman需要下載安裝,還要登錄賬號。對于簡單測試,麻煩! http://coolaf.…

西門子1200高速計數器編碼器的應用 接線 組態 編程 調試 測距測速

編碼器的應用、接線、組態、博途1200編程與調試:高速計數器,用于給PLC發高速脈沖,接I點 用來例如:檢測電機轉速,皮帶輸送機運行的距離 (粗略定位) 360:代表轉一圈會對外發360個脈沖&…

系統化學習 H264視頻編碼(02) I幀 P幀 B幀 引入及相關概念解讀

說明:我們參考黃金圈學習法(什么是黃金圈法則?->模型 黃金圈法則,本文使用:why-what)來學習音H264視頻編碼。本系列文章側重于理解視頻編碼的知識體系和實踐方法,理論方面會更多地講清楚 音視頻中概念的…

Python類實例的json

web開發中有這么一個場景,我們從數據庫中查詢某一數據的時候,往往需要對數據進行一些轉化之后才能傳給前端。 當然我們可以根據查詢出來的實例對象,構建一個dict返回,這樣會導致我們的代碼非常的臃腫。但是這也確實是一種最直接的…

網絡空間測繪是什么?

網絡空間測繪是一種技術過程,用于探測、分析和可視化互聯網及其他網絡環境中的各種資源和連接。這個概念在2016年開始廣泛使用,它涉及到收集有關網絡節點(如服務器、路由器、個人電腦和其他設備)的信息,并建立這些節點…

C++ STL 多線程庫用法介紹

目錄 一:Atomic: 二:Thread 1. 創建線程 2. 小心移動(std::move)線程 3. 如何創建帶參數的線程 4. 線程參數是引用類型時,要小心謹慎。 5. 獲取線程ID 6. jthread 7. 如何在線程中使用中斷 stop_token 三:如何解決數據競爭 1.有問題的代碼 2.使用互斥 3.預防…

Vue3+.NET6前后端分離式管理后臺實戰(二十八)

1,Vue3.NET6前后端分離式管理后臺實戰(二十八)

【Linux進階】文件系統6——理解文件操作

目錄 1.文件的讀取 1.1.目錄 1.2.文件 1.3.目錄樹讀取 1.4.文件系統大小與磁盤讀取性能 2.增添文件 2.1.數據的不一致(Inconsistent)狀態 2.2.日志式文件系統(Journaling filesystem) 3.Linux文件系統的運行 4、文件的刪…

動態規劃算法-以中學排班管理系統為例

1.動態規劃算法介紹 1.算法思路 動態規劃算法通常用于求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每一個解都對應于一個值,我們希望找到具有最優值的解。動態規劃算法與分治法類似,其基本思想也是將待求解問題分解成若…

干貨 | 2024大模型場景下智算平臺的設計與優化實踐(免費下載)

誠摯邀請您微信掃描以下二維碼加入方案驛站知識星球,獲取上萬份PPT/WORD解決方案!!!感謝支持!!!

android pdf框架-11,查看圖片

前10篇文章,9章關于pdf的,pdf解析后,里面也是有各種圖片,于是利用pdf的view來展示圖片,似乎也是個不錯的想法. android手機中的圖片查看功能,有的可以展示,有的不能.比如華為,榮耀對大體積的png是可以顯示的,小米是不顯示,只有縮略圖. 一張png50m大,比如清明上河圖,原圖是tif…

【C++】string的底層原理及實現

文章目錄 string類的存儲結構默認成員函數構造函數析構函數拷貝構造函數賦值重載 容量操作size()capacity()reserve()resize()clear() 遍歷與訪問operator[ ]迭代器范圍與for 增刪查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成員函數op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何實現了IEnumerable<T>的集合&#xff09;的Select和SelectMany擴展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于對集合中的元素進行查詢和轉換。 盡管它們的作用有些相…

Virtualbox和ubuntu之間的關系

1、什么是ubuntu Ubuntu 是一個類似于 Windows 的操作系統&#xff0c;但它是基于 Linux 內核開發的開源操作系統 2、什么是Virtualbox VirtualBox 是一款虛擬機軟件&#xff0c;使我們可以物理機上創建和運行虛擬機 也就是說,VirtualBox 提供了一個可以安裝和運行其他操作系…

力扣考研經典題 反轉鏈表

核心思想 頭插法&#xff1a; 不斷的將cur指針所指向的節點放到頭節點之前&#xff0c;然后頭節點指向cur節點&#xff0c;因為最后返回的是head.next 。 解題思路 1.如果頭節點是空的&#xff0c;或者是只有一個節點&#xff0c;只需要返回head節點即可。 if (head null …

算法訓練營day70

題目1&#xff1a;108. 冗余連接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…

Echarts中的熱力圖和漏斗圖(在Vue中使用熱力圖和漏斗圖)

熱力圖 (Heatmap) Echarts的熱力圖用于展示兩個維度數據矩陣中的值分布情況。它通過在平面上劃分成多個矩形區域&#xff0c;并用不同的顏色填充這些區域來表示數據的大小或強度。顏色漸變從淺到深通常映射著數值從小到大&#xff0c;從而直觀展示數據的集中程度和分布模式。熱…

Mojolicious測試驅動開發:單元與集成測試的藝術

標題&#xff1a;Mojolicious測試驅動開發&#xff1a;單元與集成測試的藝術 Mojolicious是一個現代化的Perl Web開發框架&#xff0c;它不僅提供了強大的Web應用開發能力&#xff0c;還內置了豐富的測試工具來支持單元測試和集成測試。本文將深入探討如何在Mojolicious中進行…

人工智能期末復習簡答題

簡答: 子句集的化簡(1).消去連接詞”—>”和”<—>” (2)減少否定符號的轄域 (3)對變元標準化 (4)化為前束范式 (5)消去存在量詞 (6)化為Skolem標準形 (7)消去全稱量詞 (8)消去合取詞 (9)更換變元名稱 2.在狀態空間搜索中,Open表與Close…

半同步主從復制

半同步主從復制的概念 半同步主從復制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL數據庫中的一種數據復制方式&#xff0c;它在異步復制的基礎上增加了一定程度的同步性&#xff0c;旨在提高數據安全性&#xff0c;減少數據丟失的風險。 半同步主從復制…