譯者 | 朱先忠
審校 | 重樓
簡介
在本文中,我們將從基礎(chǔ)設(shè)施供應(yīng)到配置管理和部署等各個(gè)環(huán)節(jié)來全方位探討大型語言模型(LLM)是否適合應(yīng)用于實(shí)際應(yīng)用程序的生命周期開發(fā)。這項(xiàng)工作產(chǎn)生的源代碼工程已經(jīng)在GitHub上公開([參考資料11])。基礎(chǔ)設(shè)施即代碼(IaC:Infrastructure as Code)解決方案通過代碼而不是手動(dòng)流程來促進(jìn)應(yīng)用程序基礎(chǔ)設(shè)施的管理和供應(yīng)([參考資料1])。
當(dāng)下,這種技術(shù)的應(yīng)用越來越普遍,一些主流的云提供商已經(jīng)實(shí)現(xiàn)了他們自己風(fēng)格的IaC解決方案,用于與他們所提供的服務(wù)進(jìn)行交互。在這方面,亞馬遜CloudFormation、谷歌的云部署管理器和微軟的Azure資源管理器模板都成功簡化了云服務(wù)端的供應(yīng),消除了IT運(yùn)營人員手動(dòng)啟動(dòng)服務(wù)器、數(shù)據(jù)庫和網(wǎng)絡(luò)的需要。然而,這許多的可能性也導(dǎo)致了供應(yīng)商鎖定的風(fēng)險(xiǎn),因?yàn)榻o定云提供商所需IaC的定義是不可移植的,并且如果需要不同的云提供商的話,則需要在它們之間進(jìn)行轉(zhuǎn)換。
值得欣慰的是,在這方面,像Terraform([參考資料2])或Pulumi([參考資料3])這樣的工具提供了對不同云提供商的各種實(shí)現(xiàn)的抽象,并促進(jìn)了便攜式部署的開發(fā)。通過這種方式,供應(yīng)商鎖定的風(fēng)險(xiǎn)大大降低,應(yīng)用機(jī)構(gòu)就可以對其需求做出動(dòng)態(tài)反應(yīng),而不會(huì)產(chǎn)生顯著的實(shí)施成本。除此之外,IaC技術(shù)還帶來了許多好處([參考資料4]):
- 一致性:通過實(shí)現(xiàn)可重復(fù)的部署,實(shí)現(xiàn)了基礎(chǔ)設(shè)施供應(yīng)的自動(dòng)化。
- 降低風(fēng)險(xiǎn):促進(jìn)了對基礎(chǔ)設(shè)施管理的不易出錯(cuò)的近似,因?yàn)槭謩?dòng)干預(yù)被最小化。
- 成本優(yōu)化:可以更容易地識(shí)別不必要的資源,有利于在云提供商之間更快地遷移以應(yīng)對計(jì)費(fèi)變化。
- 改進(jìn)的協(xié)作:可以把腳本集成到版本控制工具中,從而促進(jìn)個(gè)人和團(tuán)隊(duì)之間的協(xié)作。但是,這樣一來,應(yīng)用程序的生命周期超出了基礎(chǔ)架構(gòu)資源調(diào)配的范圍。下圖顯示了使用不同IaC技術(shù)支持的應(yīng)用程序生命周期([參考資料5])。
“基礎(chǔ)結(jié)構(gòu)即代碼(IaC)”技術(shù)支持的應(yīng)用程序生命周期。|資料來源:Josu Diaz de Arcaya等人([參考資料5])。
在這種情況下,IaC技術(shù)的目標(biāo)不僅僅是提供基礎(chǔ)設(shè)施資源。在啟動(dòng)必要的基礎(chǔ)設(shè)施之后,配置管理階段可確保所有需求都得到適當(dāng)?shù)陌惭b。此階段通常使用Ansible([參考資料6])、Chef([參考資料7])、Puppet([參考資料8])等工具來完成。最后,應(yīng)用程序部署通過各種基礎(chǔ)設(shè)施設(shè)備來監(jiān)督應(yīng)用程序的協(xié)調(diào)性。
認(rèn)識(shí)LLM
大型語言模型(LLM)是指一類人工智能模型,旨在根據(jù)提供給它們的輸入來理解和生成類似人類的文本。這些模型以其大量的參數(shù)而聞名,這些參數(shù)使它們能夠捕捉語言中的復(fù)雜模式和細(xì)微差別([參考資料9])。
- 文本生成:LLM創(chuàng)建的文本可以具有凝聚力,并與其周圍環(huán)境相關(guān)。這些技術(shù)可以用來完成文本、制作材料,甚至進(jìn)行創(chuàng)造性寫作等活動(dòng)。
- 自然語言理解:LLM能夠理解和提取文本中的信息。它們能夠進(jìn)行態(tài)度分析、文本分類和信息檢索。
- 翻譯:LLM可以將文本從一種語言翻譯成另一種語言。這對機(jī)器翻譯應(yīng)用非常有益。
- 回答問題:LLM可以根據(jù)給定的上下文回答問題。它們經(jīng)常被應(yīng)用于聊天機(jī)器人和虛擬助理,以回答用戶的查詢。
- 文本摘要:LLM可以將長段落的文本總結(jié)為更短、更連貫的摘要。這對于濃縮信息以便快速利用的領(lǐng)域需求非常有用。在上述諸多功能中,我們將專注于文本生成方面的討論。特別是,在基于輸入提示生成正確的IaC代碼的能力方面,大型語言模型(LLM)在自然語言處理領(lǐng)域取得了重大進(jìn)展,但也提出了一些挑戰(zhàn)和令人擔(dān)憂的問題。目前情況下,與LLM相關(guān)的一些關(guān)鍵問題和關(guān)注點(diǎn)包括:
- 偏見和公平性:LLM可以學(xué)習(xí)它們所訓(xùn)練的數(shù)據(jù)中存在的偏見信息,由此可能導(dǎo)致存在偏見或不公平的結(jié)果。
- 錯(cuò)誤信息和虛假信息:LLM可能產(chǎn)生虛假或誤導(dǎo)性信息,這可能會(huì)導(dǎo)致錯(cuò)誤信息在網(wǎng)上的傳播。這些模型有可能創(chuàng)造出看似可信但事實(shí)上不正確的內(nèi)容。
- 安全和隱私:LLM可能被濫用來生成惡意內(nèi)容,如深度偽造文本、假新聞或釣魚性質(zhì)的電子郵件等。
下表展示了各種LLM之間的比較情況。
使用大型語言模型生成IaC
為了測試當(dāng)前LLM工具在IaC領(lǐng)域的性能,我們設(shè)計(jì)了一個(gè)測試性質(zhì)的應(yīng)用程序。此案例的最終目標(biāo)是使用基于Python的服務(wù)器端FastAPI框架在虛擬機(jī)中構(gòu)建一個(gè)API,該框架允許客戶端使用HTTP方法在Elasticsearch集群中執(zhí)行搜索和刪除任務(wù)。
此集群將由三個(gè)節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都位于自己的虛擬機(jī)中;在另一臺(tái)機(jī)器中安裝Kibana,這是一個(gè)支持可視化的集群管理工具。當(dāng)然,此實(shí)驗(yàn)案例設(shè)計(jì)的一切都必須安裝在AWS云環(huán)境中。下圖顯示了此案例的體系結(jié)構(gòu):
設(shè)計(jì)用于測試LLM生成IaC的可行性的應(yīng)用案例
開發(fā)過程中,具有挑戰(zhàn)性的任務(wù)在于使用LLM工具成功完成以下三項(xiàng)任務(wù)。在本文中,我們使用了OpenAI公司的ChatGPT模型。
- 編寫Terraform聲明式編碼,以便在AWS云平臺(tái)中使用五個(gè)虛擬機(jī)構(gòu)建基礎(chǔ)設(shè)施。
- 編寫FastAPI應(yīng)用程序的源代碼,通過基于API的HTTP方法執(zhí)行文檔搜索和刪除操作。
- 編寫Ansible自動(dòng)化管理代碼,用于在三個(gè)節(jié)點(diǎn)上部署和安裝Elasticsearch集群、在另一個(gè)節(jié)點(diǎn)上安裝Kibana以及在其余節(jié)點(diǎn)上安裝FastAPI應(yīng)用程序的可靠代碼。
挑戰(zhàn)任務(wù)#1
對于上面的挑戰(zhàn)1,我們針對ChatGPT模型使用了英文提示,翻譯成中文后大致意思是:
“我需要通過Terraform在您想使用的公共云提供商處創(chuàng)建五個(gè)虛擬機(jī)。這些虛擬機(jī)的用途如下:其中三個(gè)用于部署Elasticsearch集群,該集群每天將接收2G的數(shù)據(jù);另一個(gè)是Kibana;最后一個(gè)是部署FastAPI應(yīng)用程序。您應(yīng)該為每個(gè)虛擬機(jī)選擇硬件,并為每個(gè)虛擬機(jī)器選擇云提供商。對于您不知道的變量,使用變量作為占位符即可。最后,請推薦使用廉價(jià)的應(yīng)用實(shí)例。”
ChatGPT模型最初的響應(yīng)很好,但是我們需要不斷迭代。例如,我們希望在一個(gè)單獨(dú)的文件中定義所有變量,這導(dǎo)致了下面的配置代碼。
variable "region" {
description = "Region where the resources will be provisioned"
default = "us-west-1"
}
variable "instance_type_elasticsearch" {
description = "Instance type for Elasticsearch nodes"
default = "t2.micro"
}
variable "instance_type_kibana" {
description = "Instance type for Kibana"
default = "t2.micro"
}
variable "instance_type_fastapi" {
description = "Instance type for FastAPI application"
default = "t2.micro"
}
variable "ami" {
description = "AMI ID for the virtual machines"
default = "ami-0f8e81a3da6e2510a"
}
variable "my_ip" {
description = "Your public IP address"
default = "0.0.0.0/0"
}
variable "ssh_port" {
description = "Port for SSH access"
default = 22
}
variable "http_port" {
description = "Port for HTTP access"
default = 80
}
variable "https_port" {
description = "Port for HTTPS access"
default = 443
}
variable "key_name" {
description = "Name of the SSH key pair"
default = "my-key-pair"
}
文件variables.tf的部分代碼摘錄,其中包含要配置的變量
同樣,我們希望知道部署的IP地址,并且我們希望此配置位于一個(gè)單獨(dú)的文件中。
output "elasticsearch_ips" {
value = aws_instance.elasticsearch.*.public_ip
}
output "kibana_ip" {
value = aws_instance.kibana.*.public_ip
}
output "fastapi_ip" {
value = aws_instance.fastapi.*.public_ip
}
文件output.tf的代碼摘錄,包含新提供的虛擬機(jī)的IP地址
人工智能在描述我們想要的實(shí)例方面做得很好,并為每個(gè)實(shí)例配置了所需的安全組。
resource "aws_instance" "elasticsearch" {
count = 3
ami = var.ami
instance_type = var.instance_type_elasticsearch
security_groups = [aws_security_group.ssh_sg.name]
key_name = aws_key_pair.ssh_key.key_name
}
resource "aws_instance" "kibana" {
count = 1
ami = var.ami
instance_type = var.instance_type_kibana
security_groups = [aws_security_group.ssh_sg.name]
key_name = aws_key_pair.ssh_key.key_name
}
resource "aws_instance" "fastapi" {
count = 1
ami = var.ami
instance_type = var.instance_type_fastapi
security_groups = [aws_security_group.ssh_sg.name]
key_name = aws_key_pair.ssh_key.key_name
}
resource "aws_security_group" "ssh_sg" {
ingress {
from_port = var.ssh_port
to_port = var.ssh_port
protocol = "tcp"
cidr_blocks = [var.my_ip]
}
}
resource "aws_security_group" "http_sg" {
ingress {
from_port = var.http_port
to_port = var.https_port
protocol = "tcp"
cidr_blocks = [var.my_ip]
}
}
resource "aws_key_pair" "ssh_key" {
key_name = var.key_name
public_key = file("~/.ssh/id_rsa.pub") # Provide the path to your public key file
}
文件main.tf的代碼摘錄,其中包含要配置的虛擬機(jī)
它還為我們想要的安全組創(chuàng)建了必要的資源,并在將各種端口定義為變量時(shí)使用占位符。請參考前面文件main.tf中與使用的安全組部分相關(guān)的代碼。
總的來說,ChatGPT在完成這項(xiàng)任務(wù)方面做得很好。然而,我們花了一段時(shí)間才獲得可行的配置,并保證網(wǎng)絡(luò)配置是正確的。例如,我們希望連接到每個(gè)已配置的虛擬機(jī),并通過進(jìn)一步的提示詞來提出對這方面的要求,翻譯成中文的大致意思是:
我希望通過ssh從我的筆記本電腦訪問所有這些實(shí)例,而且,Kibana實(shí)例需要從我的手提電腦上以http和https兩種方式進(jìn)行訪問。
上面的提示產(chǎn)生了一個(gè)幾乎正確的代碼,出現(xiàn)小問題的原因是AI與入口和出口策略混淆了。然而,這很容易發(fā)現(xiàn)并修復(fù)。
在能夠訪問虛擬機(jī)之后,由于缺乏權(quán)限,我們遇到了無法連接到它們的問題。這導(dǎo)致了與ChatGPT更長的對話,最終我們自己也通過很容易地添加少量修改內(nèi)容解決了問題。
挑戰(zhàn)任務(wù)#2
對于上面的挑戰(zhàn)2,我們針對ChatGPT使用了以下提示,翻譯成中文后的大致意思是:
“我需要?jiǎng)?chuàng)建一個(gè)FastAPI應(yīng)用程序。這些API的目的是提供在Elasticsearch集群中存儲(chǔ)單個(gè)Json文檔、存儲(chǔ)多個(gè)文檔并刪除它們的方法。Elasticsearch集群部署在3個(gè)節(jié)點(diǎn)中,具有用戶“tecnalia”和密碼“iac-llm”的基本身份驗(yàn)證?!?/span>
這一提示的結(jié)果非常成功。該應(yīng)用程序使用Elasticsearch Python包,與Elasticsearch集群進(jìn)行交互,而且經(jīng)測試是完全有效的。只是我們必須記住,我們需要更改部署集群的節(jié)點(diǎn)的IP地址。在下圖中,創(chuàng)建了第一個(gè)方法,用于在Elasticsearch中插入單個(gè)文檔。
from fastapi import FastAPI, HTTPException
from elasticsearch import Elasticsearch
app = FastAPI()
# 使用集群節(jié)點(diǎn)初始化Elasticsearch客戶端
es = Elasticsearch(
['node1:9200', 'node2:9200', 'node3:9200'],
http_auth=('tecnalia', 'iac-llm'))
@app.post("/store-single-document/")
async def store_single_document(document: dict):
try:
# Index a single document into Elasticsearch
response = es.index(index='your_index_name', body=document)
return response
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
存儲(chǔ)單個(gè)文檔方法的代碼摘錄
然后,第二個(gè)方法用于在單個(gè)調(diào)用中創(chuàng)建各種文檔的大容量插入。
@app.post("/store-multiple-documents/")
async def store_multiple_documents(documents: list):
try:
#將多個(gè)文檔批量插入Elasticsearch
actions = [{"_op_type": "index", "_index": 'your_index_name', "_source": doc} for doc in documents]
response = es.bulk(actions)
return response
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
存儲(chǔ)多個(gè)文檔方法的代碼摘錄
最后的一種方法可以用于從Elasticsearch集群中刪除單個(gè)文檔。
@app.delete("/delete-document/{document_id}")
async def delete_document(document_id: str):
try:
#按文檔ID刪除文檔
response = es.delete(index='your_index_name', id=document_id)
return response
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
刪除文檔方法的代碼摘錄
我們認(rèn)為這個(gè)實(shí)驗(yàn)非常成功,因?yàn)樗_地選擇了一個(gè)合適的庫來完成任務(wù)。然而,要將這些代碼轉(zhuǎn)化為可用于生產(chǎn)環(huán)境的軟件的話,還需要進(jìn)一步的手動(dòng)改進(jìn)。
挑戰(zhàn)任務(wù)#3
對于上面的挑戰(zhàn)3,我們使用了以下提示,翻譯成中文后的大致意思是:
“生成Ansible配置代碼,用于在三個(gè)節(jié)點(diǎn)上安裝Elasticsearch集群。還請?zhí)砑右粋€(gè)連接到集群的Kibana節(jié)點(diǎn)?!?/span>
這個(gè)提示在生成所需的Ansible腳本方面做得很好。它在將源代碼組織成各種文件方面做得很好。首先,包含所有節(jié)點(diǎn)詳細(xì)信息的清單。請記住,此文件需要使用任務(wù)#1中生成的正確IP地址進(jìn)行調(diào)整。
[elasticsearch]
node1 ansible_host=192.168.56.101
node2 ansible_host=192.168.56.102
node3 ansible_host=192.168.56.103
[elasticsearch:vars]
ansible_user=vagrant
文件inventory.ini的代碼摘錄
然后,下面顯示了安裝Elasticsearch的主要腳本。這是它的摘錄,完整的示例可以在Github存儲(chǔ)庫([參考資料11])中找到。
---
- name: Install Elasticsearch Cluster
hosts: elasticsearch
become: yes
tasks:
- name: Add Elasticsearch GPG Key
apt_key:
url: https://artifacts.elastic.co/GPG-KEY-elasticsearch
state: present
- name: Add Elasticsearch APT Repository
apt_repository:
repo: "deb https://artifacts.elastic.co/packages/7.x/apt stable main"
state: present
filename: "elastic-7.x"
- name: Update apt cache
apt:
update_cache: yes
- name: Install OpenJDK
apt:
name: openjdk-11-jdk
state: present
- name: Install Elasticsearch
apt:
name: elasticsearch
state: present
- name: Configure Elasticsearch Cluster
template:
src: elasticsearch.yml.j2
dest: /etc/elasticsearch/elasticsearch.yml
notify:
- Restart Elasticsearch
handlers:
- name: Restart Elasticsearch
systemd:
name: elasticsearch
enabled: yes
state: restarted
Elasticsearch_playbook.yml的代碼摘錄
另一方面,每個(gè)Elasticsearch節(jié)點(diǎn)的必要配置已方便地生成為Jinja文件。在這種情況下,我們不得不手動(dòng)添加path.logs和path.data配置,因?yàn)镋lasticsearch由于權(quán)限問題無法啟動(dòng)。
cluster.name: your_cluster_name
node.name: "{{ ansible_hostname }}"
network.host: 0.0.0.0
discovery.seed_hosts:
- 192.168.56.101
- 192.168.56.102
- 192.168.56.103
cluster.initial_master_nodes:
- 192.168.56.101
path.logs: /var/log/elasticsearch
path.data: /var/lib/elasticsearch
elasticsearch.yml.j2的代碼摘錄
類似地,ChatGPT能夠?yàn)镵ibana實(shí)例生成類似的配置。但是,在這種情況下,為了方便起見,我們手動(dòng)將配置分離到一個(gè)單獨(dú)的.yml文件中。
類似地,引用Kibana實(shí)例的Jinja文件看起來也非常不錯(cuò),盡管IP地址最好參數(shù)化。
總的來說,我們發(fā)現(xiàn)ChatGPT非常擅長制作項(xiàng)目的框架。然而,要將該框架轉(zhuǎn)化為生產(chǎn)級(jí)應(yīng)用程序,仍然需要執(zhí)行大量操作。在這方面,需要對所使用的技術(shù)有深入的專業(yè)知識(shí),以便更好地細(xì)化項(xiàng)目。
結(jié)論
本文介紹了使用ChatGPT這種大型語言模型來監(jiān)督應(yīng)用程序的生命周期的完整過程。接下來,簡要討論一下這種工作方式的利弊。
優(yōu)點(diǎn)
- 使用LLM來支持應(yīng)用程序生命周期的各個(gè)階段對啟動(dòng)項(xiàng)目特別有益,尤其是在眾所周知的技術(shù)中。
- 最初的框架結(jié)構(gòu)良好,這種技術(shù)提供了開發(fā)團(tuán)隊(duì)原本可能不會(huì)使用的結(jié)構(gòu)和方法。
不足
- LLM存在與人工智能解決方案的使用相關(guān)的偏見風(fēng)險(xiǎn);在本文實(shí)例中,ChatGPT選擇了AWS云平臺(tái),而不是類似的方案選項(xiàng)。
- 將項(xiàng)目打磨為真正可用的生產(chǎn)環(huán)境項(xiàng)目可能會(huì)很麻煩,而且有時(shí)手動(dòng)調(diào)整代碼更容易,這需要對所使用的技術(shù)有廣泛的了解。
鳴謝
這項(xiàng)工作由巴斯克政府的SIIRSE Elkartek項(xiàng)目資助(適用于Industry 5.0的穩(wěn)健、安全和合乎道德的智能工業(yè)系統(tǒng):一個(gè)規(guī)范、設(shè)計(jì)、評(píng)估和監(jiān)控的先進(jìn)范例,Elkartek 2022 KK-2022/00007)。
作者貢獻(xiàn)
本文概念化、分析、調(diào)查和最終成稿是Juan Lopez de Armentia、Ana Torre和Gorka Zárate三人共同努力的結(jié)果。
參考資料
- What is Infrastructure as Code (IaC)? (2022). https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac
- Terraform by HashiCorp. (n.d.). Retrieved October 5, 2023, from https://www.terraform.io
- Pulumi — Universal Infrastructure as Code. (n.d.). Retrieved October 5, 2023, from https://www.pulumi.com/
- The 7 Biggest Benefits of Infrastructure as Code — DevOps. (n.d.). Retrieved October 5, 2023, from https://duplocloud.com/blog/infrastructure-as-code-benefits/
- Diaz-De-Arcaya, J., Lobo, J. L., Alonso, J., Almeida, A., Osaba, E., Benguria, G., Etxaniz, I., & Torre-Bastida, A. I. (2023). IEM: A Unified Lifecycle Orchestrator for Multilingual IaC Deployments ACM Reference Format. https://doi.org/10.1145/3578245.3584938
- Ansible is Simple IT Automation. (n.d.). Retrieved October 5, 2023, from https://www.ansible.com/
- Chef Software DevOps Automation Solutions | Chef. (n.d.). Retrieved October 5, 2023, from https://www.chef.io/
- Puppet Infrastructure & IT Automation at Scale | Puppet by Perforce. (n.d.). Retrieved October 5, 2023, from https://www.puppet.com/
- Kerner, S. M. (n.d.). What are Large Language Models? | Definition from TechTarget. Retrieved October 5, 2023, from https://www.techtarget.com/whatis/definition/large-language-model-LLM
- Sha, A. (2023). 12 Best Large Language Models (LLMs) in 2023 | Beebom. https://beebom.com/best-large-language-models-llms/
- Diaz-de-Arcaya, J., Lopez de Armentia, J., & Zarate, G. (n.d.). iac-llms GitHub. Retrieved October 5, 2023, from https://github.com/josu-arcaya/iac-llms
- Elastic Client Library Maintainers. (2023). elasticsearch · PyPI. https://pypi.org/project/elasticsearch/
譯者介紹
朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。
原文標(biāo)題:Mastering the Future: Evaluating LLM-Generated Data Architectures leveraging IaC technologies,作者:Josu Diaz de Arcaya