| judul | pengarang | tanggal |
|---|---|---|
Mengembangkan Aplikasi Genai dengan Golang | Haimtrann | 25/03/2024 |
Apa yang sering kita lihat dalam produksi adalah variasi bahasa yang ditulis dalam go, java, .net, namun sebagian besar materi pembelajaran tentang membangun aplikasi genai (kecerdasan buatan generatif) saat ini berada di Python dan JavaScript. Lokakarya ini menunjukkan cara memulai dengan Amazon Bedrock di Go melalui menerapkan beberapa contoh dasar tanpa menggunakan kerangka kerja seperti Langchain, Streamlit atau React.
Contohnya termasuk:
Anda akan mengimplementasikan fitur -fitur ini hanya menggunakan konsep pemrograman dasar tanpa harus mempelajari kerangka kerja baru untuk membantu Anda benar -benar memahami dan menguasai konsep fundamental.
Arsitektur

Aplikasi sampel ini mengasumsikan bahwa Anda sudah menyiapkan
Harap ganti variabel di /bedrock/constants.go dengan milik Anda, misalnya
const BEDROCK_REGION = ""
const AOSS_REGION = ""
const KNOWLEDGE_BASE_REGION = ""
const KNOWLEDGE_BASE_ID = ""
const KNOWLEDGE_BASE_MODEL_ID = ""
const KNOWLEDGE_BASE_NUMBER_OF_RESULT = 6
const AOSS_ENDPOINT = ""
const AOSS_NOTE_APP_INDEX_NAME = "" Struktur proyek
| - - static
| - - aoss - index. html
| -- aoss - query. html
| -- claude - haiku. html
| -- image. html
| -- retrieve. html
| -- retrieve - generate. html
| -- bedrock
| -- aoss. go
| -- bedrock. go
| -- constants. go
| -- knowledge - based. go
| -- main. go
| -- go . mod
| -- go . sumMain.go menerapkan server http dan permintaan rute ke penangan. bedrock.go dan aoss.go adalah fungsi untuk memanggil Amazon Bedrock dan Amazon OpenSearch Serverless (AOSS), secara respecitif. Folder statis berisi frontend sederhana dengan javascript.
Penting
Untuk menggunakan AOSS, Anda perlu membuat koleksi OpenSearch dan memberikan titik akhir URL di Constants.go. Selain itu, Anda perlu mengatur akses data di lingkungan AOSS untuk waktu berjalan (profil EC2, peran ECS TAKS, peran lambda, .etc)
Ikuti dokumen resmi ini untuk menginstal Golang, lalu jalankan ApplicationN sebagai berikut
Penting
Harap instal GO Versi 1.21.5
cd developing - genai - applications - with - golang
go run main . go Pertama bagus untuk membuat beberapa data struct menurut format API Amazon Bedrock Claude3
type Content struct {
Type string `json:"type"`
Text string `json:"text"`
}
type Message struct {
Role string `json:"role"`
Content [] Content `json:"content"`
}
type Body struct {
MaxTokensToSample int `json:"max_tokens"`
Temperature float64 `json:"temperature,omitempty"`
AnthropicVersion string `json:"anthropic_version"`
Messages [] Message `json:"messages"`
}
// list of messages
messages := [] Message {{
Role : "user" ,
Content : [] Content {{ Type : "text" , Text : promt }},
}}
// form request body
payload := Body {
MaxTokensToSample : 2048 ,
Temperature : 0.9 ,
AnthropicVersion : "bedrock-2023-05-31" ,
Messages : messages ,
}Kemudian konversi payload ke byte dan memohon klien Bedrock
payload := Body {
MaxTokensToSample : 2048 ,
Temperature : 0.9 ,
AnthropicVersion : "bedrock-2023-05-31" ,
Messages : messages ,
}
// marshal payload to bytes
payloadBytes , err := json . Marshal ( payload )
if err != nil {
fmt . Println ( err )
return
}
// create request to bedrock
output , error := BedrockClient . InvokeModelWithResponseStream (
context . Background (),
& bedrockruntime. InvokeModelWithResponseStreamInput {
Body : payloadBytes ,
ModelId : aws . String ( "anthropic.claude-3-haiku-20240307-v1:0" ),
ContentType : aws . String ( "application/json" ),
Accept : aws . String ( "application/json" ),
},
)
if error != nil {
fmt . Println ( error )
return
}Akhirnya, parse streaming repons dan decode ke teks. Saat menggunakan pada server HTTP, kita perlu memodifikasi kode sedikit untuk mengalirkan setiap potongan respons ke klien. Misalnya di sini
output , error := BedrockClient . InvokeModelWithResponseStream (
context . Background (),
& bedrockruntime. InvokeModelWithResponseStreamInput {
Body : payloadBytes ,
ModelId : aws . String ( "anthropic.claude-3-haiku-20240307-v1:0" ),
ContentType : aws . String ( "application/json" ),
Accept : aws . String ( "application/json" ),
},
)
if error != nil {
fmt . Println ( error )
return
}
// parse response stream
for event := range output . GetStream (). Events () {
switch v := event .( type ) {
case * types. ResponseStreamMemberChunk :
//fmt.Println("payload", string(v.Value.Bytes))
var resp ResponseClaude3
err := json . NewDecoder ( bytes . NewReader ( v . Value . Bytes )). Decode ( & resp )
if err != nil {
fmt . Println ( err )
}
fmt . Println ( resp . Delta . Text )
case * types. UnknownUnionMember :
fmt . Println ( "unknown tag:" , v . Tag )
default :
fmt . Println ( "union is nil or unknown type" )
}
}Lokakarya ini tidak memberikan langkah demi langkah terperinci untuk menggunakan aplikasi. Sebaliknya, ia menyediakan arsitektur keseluruhan dan opsi penyebaran. Lacai Straightfoward untuk menggunakan aplikasi di Amazon ECS.

Dockerfile
# syntax = docker / dockerfile : 1
# Build the application from source
FROM golang : 1.21 . 5 AS build - stage
WORKDIR / app
COPY go . mod go . sum . /
RUN go mod download
COPY * . go . /
COPY bedrock . / bedrock
RUN CGO_ENABLED = 0 GOOS = linux go build - o / genaiapp
# Run the tests in the container
FROM build - stage AS run - test - stage
# Deploy the application binary into a lean image
FROM gcr . io / distroless / base - debian11 AS build - release - stage
WORKDIR /
COPY -- from = build - stage / genai - go - app / genaiapp
COPY static . / static
EXPOSE 3000
USER nonroot : nonroot
ENTRYPOINT [ "/genaiapp" ]Peran tugas ECS
Peran tugas membutuhkan izin
Berikut adalah contoh kebijakan IAM yang melekat pada peran tugas
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Action" : [
" bedrock:InvokeModel " ,
" bedrock:InvokeModelWithResponseStream " ,
" bedrock:InvokeAgent "
],
"Resource" : [
" arn:aws:bedrock:<REGION>::foundation-model/anthropic.claude-3-haiku-20240307-v1:0 " ,
" arn:aws:bedrock:<REGION>::foundation-model/amazon.titan-embed-text-v1 "
],
"Effect" : " Allow "
},
{
"Action" : [ " s3:GetObject " , " s3:PutObject " ],
"Resource" : [
" arn:aws:s3:::<BUCKET_NAME> " ,
" arn:aws:s3:::<BUCKET_NAME>/* "
],
"Effect" : " Allow "
},
{
"Action" : " aoss:APIAccessAll " ,
"Resource" : [
" arn:aws:aoss:<REGION>:<ACCOUNT_ID>:collection/<COLLECTION_ID> "
],
"Effect" : " Allow "
}
]
}Kebijakan Akses Data AOSS
Untuk mengizinkan peran tugas untuk mengakses koleksi AOSS, kita perlu memperbarui kebijakan akses koleksi.