譯者 | 朱先忠
審校 | 重樓
簡介
在本文中,我們將從基礎(chǔ)設(shè)施供應到配置管理和部署等各個環(huán)節(jié)來全方位探討大型語言模型(LLM)是否適合應用于實際應用程序的生命周期開發(fā)。這項工作產(chǎn)生的源代碼工程已經(jīng)在GitHub上公開([參考資料11])。基礎(chǔ)設(shè)施即代碼(IaC:Infrastructure as Code)解決方案通過代碼而不是手動流程來促進應用程序基礎(chǔ)設(shè)施的管理和供應([參考資料1])。
當下,這種技術(shù)的應用越來越普遍,一些主流的云提供商已經(jīng)實現(xiàn)了他們自己風格的IaC解決方案,用于與他們所提供的服務進行交互。在這方面,亞馬遜CloudFormation、谷歌的云部署管理器和微軟的Azure資源管理器模板都成功簡化了云服務端的供應,消除了IT運營人員手動啟動服務器、數(shù)據(jù)庫和網(wǎng)絡的需要。然而,這許多的可能性也導致了供應商鎖定的風險,因為給定云提供商所需IaC的定義是不可移植的,并且如果需要不同的云提供商的話,則需要在它們之間進行轉(zhuǎn)換。
值得欣慰的是,在這方面,像Terraform([參考資料2])或Pulumi([參考資料3])這樣的工具提供了對不同云提供商的各種實現(xiàn)的抽象,并促進了便攜式部署的開發(fā)。通過這種方式,供應商鎖定的風險大大降低,應用機構(gòu)就可以對其需求做出動態(tài)反應,而不會產(chǎn)生顯著的實施成本。除此之外,IaC技術(shù)還帶來了許多好處([參考資料4]):
- 一致性:通過實現(xiàn)可重復的部署,實現(xiàn)了基礎(chǔ)設(shè)施供應的自動化。
- 降低風險:促進了對基礎(chǔ)設(shè)施管理的不易出錯的近似,因為手動干預被最小化。
- 成本優(yōu)化:可以更容易地識別不必要的資源,有利于在云提供商之間更快地遷移以應對計費變化。
- 改進的協(xié)作:可以把腳本集成到版本控制工具中,從而促進個人和團隊之間的協(xié)作。但是,這樣一來,應用程序的生命周期超出了基礎(chǔ)架構(gòu)資源調(diào)配的范圍。下圖顯示了使用不同IaC技術(shù)支持的應用程序生命周期([參考資料5])。
“基礎(chǔ)結(jié)構(gòu)即代碼(IaC)”技術(shù)支持的應用程序生命周期。|資料來源:Josu Diaz de Arcaya等人([參考資料5])。
在這種情況下,IaC技術(shù)的目標不僅僅是提供基礎(chǔ)設(shè)施資源。在啟動必要的基礎(chǔ)設(shè)施之后,配置管理階段可確保所有需求都得到適當?shù)陌惭b。此階段通常使用Ansible([參考資料6])、Chef([參考資料7])、Puppet([參考資料8])等工具來完成。最后,應用程序部署通過各種基礎(chǔ)設(shè)施設(shè)備來監(jiān)督應用程序的協(xié)調(diào)性。
認識LLM
大型語言模型(LLM)是指一類人工智能模型,旨在根據(jù)提供給它們的輸入來理解和生成類似人類的文本。這些模型以其大量的參數(shù)而聞名,這些參數(shù)使它們能夠捕捉語言中的復雜模式和細微差別([參考資料9])。
- 文本生成:LLM創(chuàng)建的文本可以具有凝聚力,并與其周圍環(huán)境相關(guān)。這些技術(shù)可以用來完成文本、制作材料,甚至進行創(chuàng)造性寫作等活動。
- 自然語言理解:LLM能夠理解和提取文本中的信息。它們能夠進行態(tài)度分析、文本分類和信息檢索。
- 翻譯:LLM可以將文本從一種語言翻譯成另一種語言。這對機器翻譯應用非常有益。
- 回答問題:LLM可以根據(jù)給定的上下文回答問題。它們經(jīng)常被應用于聊天機器人和虛擬助理,以回答用戶的查詢。
- 文本摘要:LLM可以將長段落的文本總結(jié)為更短、更連貫的摘要。這對于濃縮信息以便快速利用的領(lǐng)域需求非常有用。在上述諸多功能中,我們將專注于文本生成方面的討論。特別是,在基于輸入提示生成正確的IaC代碼的能力方面,大型語言模型(LLM)在自然語言處理領(lǐng)域取得了重大進展,但也提出了一些挑戰(zhàn)和令人擔憂的問題。目前情況下,與LLM相關(guān)的一些關(guān)鍵問題和關(guān)注點包括:
- 偏見和公平性:LLM可以學習它們所訓練的數(shù)據(jù)中存在的偏見信息,由此可能導致存在偏見或不公平的結(jié)果。
- 錯誤信息和虛假信息:LLM可能產(chǎn)生虛假或誤導性信息,這可能會導致錯誤信息在網(wǎng)上的傳播。這些模型有可能創(chuàng)造出看似可信但事實上不正確的內(nèi)容。
- 安全和隱私:LLM可能被濫用來生成惡意內(nèi)容,如深度偽造文本、假新聞或釣魚性質(zhì)的電子郵件等。
下表展示了各種LLM之間的比較情況。
使用大型語言模型生成IaC
為了測試當前LLM工具在IaC領(lǐng)域的性能,我們設(shè)計了一個測試性質(zhì)的應用程序。此案例的最終目標是使用基于Python的服務器端FastAPI框架在虛擬機中構(gòu)建一個API,該框架允許客戶端使用HTTP方法在Elasticsearch集群中執(zhí)行搜索和刪除任務。
此集群將由三個節(jié)點組成,每個節(jié)點都位于自己的虛擬機中;在另一臺機器中安裝Kibana,這是一個支持可視化的集群管理工具。當然,此實驗案例設(shè)計的一切都必須安裝在AWS云環(huán)境中。下圖顯示了此案例的體系結(jié)構(gòu):
設(shè)計用于測試LLM生成IaC的可行性的應用案例
開發(fā)過程中,具有挑戰(zhàn)性的任務在于使用LLM工具成功完成以下三項任務。在本文中,我們使用了OpenAI公司的ChatGPT模型。
- 編寫Terraform聲明式編碼,以便在AWS云平臺中使用五個虛擬機構(gòu)建基礎(chǔ)設(shè)施。
- 編寫FastAPI應用程序的源代碼,通過基于API的HTTP方法執(zhí)行文檔搜索和刪除操作。
- 編寫Ansible自動化管理代碼,用于在三個節(jié)點上部署和安裝Elasticsearch集群、在另一個節(jié)點上安裝Kibana以及在其余節(jié)點上安裝FastAPI應用程序的可靠代碼。
挑戰(zhàn)任務#1
對于上面的挑戰(zhàn)1,我們針對ChatGPT模型使用了英文提示,翻譯成中文后大致意思是:
“我需要通過Terraform在您想使用的公共云提供商處創(chuàng)建五個虛擬機。這些虛擬機的用途如下:其中三個用于部署Elasticsearch集群,該集群每天將接收2G的數(shù)據(jù);另一個是Kibana;最后一個是部署FastAPI應用程序。您應該為每個虛擬機選擇硬件,并為每個虛擬機器選擇云提供商。對于您不知道的變量,使用變量作為占位符即可。最后,請推薦使用廉價的應用實例。”
ChatGPT模型最初的響應很好,但是我們需要不斷迭代。例如,我們希望在一個單獨的文件中定義所有變量,這導致了下面的配置代碼。
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地址,并且我們希望此配置位于一個單獨的文件中。
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的代碼摘錄,包含新提供的虛擬機的IP地址
人工智能在描述我們想要的實例方面做得很好,并為每個實例配置了所需的安全組。
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的代碼摘錄,其中包含要配置的虛擬機
它還為我們想要的安全組創(chuàng)建了必要的資源,并在將各種端口定義為變量時使用占位符。請參考前面文件main.tf中與使用的安全組部分相關(guān)的代碼。
總的來說,ChatGPT在完成這項任務方面做得很好。然而,我們花了一段時間才獲得可行的配置,并保證網(wǎng)絡配置是正確的。例如,我們希望連接到每個已配置的虛擬機,并通過進一步的提示詞來提出對這方面的要求,翻譯成中文的大致意思是:
我希望通過ssh從我的筆記本電腦訪問所有這些實例,而且,Kibana實例需要從我的手提電腦上以http和https兩種方式進行訪問。
上面的提示產(chǎn)生了一個幾乎正確的代碼,出現(xiàn)小問題的原因是AI與入口和出口策略混淆了。然而,這很容易發(fā)現(xiàn)并修復。
在能夠訪問虛擬機之后,由于缺乏權(quán)限,我們遇到了無法連接到它們的問題。這導致了與ChatGPT更長的對話,最終我們自己也通過很容易地添加少量修改內(nèi)容解決了問題。
挑戰(zhàn)任務#2
對于上面的挑戰(zhàn)2,我們針對ChatGPT使用了以下提示,翻譯成中文后的大致意思是:
“我需要創(chuàng)建一個FastAPI應用程序。這些API的目的是提供在Elasticsearch集群中存儲單個Json文檔、存儲多個文檔并刪除它們的方法。Elasticsearch集群部署在3個節(jié)點中,具有用戶“tecnalia”和密碼“iac-llm”的基本身份驗證。”
這一提示的結(jié)果非常成功。該應用程序使用Elasticsearch Python包,與Elasticsearch集群進行交互,而且經(jīng)測試是完全有效的。只是我們必須記住,我們需要更改部署集群的節(jié)點的IP地址。在下圖中,創(chuàng)建了第一個方法,用于在Elasticsearch中插入單個文檔。
from fastapi import FastAPI, HTTPException
from elasticsearch import Elasticsearch
app = FastAPI()
# 使用集群節(jié)點初始化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))
存儲單個文檔方法的代碼摘錄
然后,第二個方法用于在單個調(diào)用中創(chuàng)建各種文檔的大容量插入。
@app.post("/store-multiple-documents/")
async def store_multiple_documents(documents: list):
try:
#將多個文檔批量插入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))
存儲多個文檔方法的代碼摘錄
最后的一種方法可以用于從Elasticsearch集群中刪除單個文檔。
@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))
刪除文檔方法的代碼摘錄
我們認為這個實驗非常成功,因為它正確地選擇了一個合適的庫來完成任務。然而,要將這些代碼轉(zhuǎn)化為可用于生產(chǎn)環(huán)境的軟件的話,還需要進一步的手動改進。
挑戰(zhàn)任務#3
對于上面的挑戰(zhàn)3,我們使用了以下提示,翻譯成中文后的大致意思是:
“生成Ansible配置代碼,用于在三個節(jié)點上安裝Elasticsearch集群。還請?zhí)砑右粋€連接到集群的Kibana節(jié)點。”
這個提示在生成所需的Ansible腳本方面做得很好。它在將源代碼組織成各種文件方面做得很好。首先,包含所有節(jié)點詳細信息的清單。請記住,此文件需要使用任務#1中生成的正確IP地址進行調(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存儲庫([參考資料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的代碼摘錄
另一方面,每個Elasticsearch節(jié)點的必要配置已方便地生成為Jinja文件。在這種情況下,我們不得不手動添加path.logs和path.data配置,因為Elasticsearch由于權(quán)限問題無法啟動。
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能夠為Kibana實例生成類似的配置。但是,在這種情況下,為了方便起見,我們手動將配置分離到一個單獨的.yml文件中。
類似地,引用Kibana實例的Jinja文件看起來也非常不錯,盡管IP地址最好參數(shù)化。
總的來說,我們發(fā)現(xiàn)ChatGPT非常擅長制作項目的框架。然而,要將該框架轉(zhuǎn)化為生產(chǎn)級應用程序,仍然需要執(zhí)行大量操作。在這方面,需要對所使用的技術(shù)有深入的專業(yè)知識,以便更好地細化項目。
結(jié)論
本文介紹了使用ChatGPT這種大型語言模型來監(jiān)督應用程序的生命周期的完整過程。接下來,簡要討論一下這種工作方式的利弊。
優(yōu)點
- 使用LLM來支持應用程序生命周期的各個階段對啟動項目特別有益,尤其是在眾所周知的技術(shù)中。
- 最初的框架結(jié)構(gòu)良好,這種技術(shù)提供了開發(fā)團隊原本可能不會使用的結(jié)構(gòu)和方法。
不足
- LLM存在與人工智能解決方案的使用相關(guān)的偏見風險;在本文實例中,ChatGPT選擇了AWS云平臺,而不是類似的方案選項。
- 將項目打磨為真正可用的生產(chǎn)環(huán)境項目可能會很麻煩,而且有時手動調(diào)整代碼更容易,這需要對所使用的技術(shù)有廣泛的了解。
鳴謝
這項工作由巴斯克政府的SIIRSE Elkartek項目資助(適用于Industry 5.0的穩(wěn)健、安全和合乎道德的智能工業(yè)系統(tǒng):一個規(guī)范、設(shè)計、評估和監(jiān)控的先進范例,Elkartek 2022 KK-2022/00007)。
作者貢獻
本文概念化、分析、調(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專家博客、講師,濰坊一所高校計算機教師,自由編程界老兵一枚。
原文標題:Mastering the Future: Evaluating LLM-Generated Data Architectures leveraging IaC technologies,作者:Josu Diaz de Arcaya