| ชื่อ | ผู้เขียน | วันที่ |
|---|---|---|
การพัฒนาแอพพลิเคชั่น Genai ด้วย Golang | Haimtrann | 25/03/2024 |
สิ่งที่เรามักจะเห็นในการผลิตคือความหลากหลายในภาษาที่เขียนใน Go, Java, .NET อย่างไรก็ตามเนื้อหาการเรียนรู้ส่วนใหญ่ในการสร้างแอพ Genai (Generative Artifical Intelligence) ในปัจจุบันอยู่ใน Python และ JavaScript เวิร์กช็อปนี้แสดงวิธีการเริ่มต้นด้วยอเมซอนบดผ่านการใช้ตัวอย่างพื้นฐานบางอย่างโดยไม่ต้องใช้เฟรมเวิร์กเช่น Langchain, Streamlit หรือ React
ตัวอย่าง ได้แก่ :
คุณจะใช้คุณสมบัติเหล่านี้โดยใช้แนวคิดการเขียนโปรแกรมพื้นฐานโดยไม่ต้องเรียนรู้กรอบใหม่เพื่อช่วยให้คุณเข้าใจและแนวคิดพื้นฐานหลัก
สถาปัตยกรรม

แอปพลิเคชันตัวอย่างนี้จะสันนิษฐานว่าคุณตั้งค่าแล้ว
โปรดแทนที่ตัวแปรใน /bedrock/constants.go กับคุณเช่น
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 = "" โครงสร้างโครงการ
| - - 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 ใช้เซิร์ฟเวอร์ HTTP และคำขอเส้นทางไปยังตัวจัดการ bedrock.go และ aoss.go เป็นฟังก์ชั่นในการเรียกใช้ Amazon Bedrock และ Amazon เปิด Serverless (AOSS) อย่างไม่หยุดยั้ง โฟลเดอร์แบบคงที่มีส่วนหน้าอย่างง่ายด้วย JavaScript
สำคัญ
ในการใช้ AOSS คุณต้องสร้างคอลเลกชัน OpenSearch และให้จุดสิ้นสุด URL ในค่าคงที่ นอกจากนี้คุณต้องตั้งค่าการเข้าถึงข้อมูลใน AOSS สำหรับสภาพแวดล้อมเวลาทำงาน (โปรไฟล์ EC2, บทบาท ECS TAKS, บทบาท LAMBDA, .ETC)
ทำตามเอกสารอย่างเป็นทางการนี้เพื่อติดตั้ง Golang จากนั้นเรียกใช้ ApplicationN ดังต่อไปนี้
สำคัญ
กรุณาติดตั้ง GO เวอร์ชัน 1.21.5
cd developing - genai - applications - with - golang
go run main . go ก่อนอื่นเป็นการดีที่จะสร้างโครงสร้างข้อมูลบางอย่างตามรูปแบบ 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 ,
}จากนั้นแปลงน้ำหนักบรรทุกเป็นไบต์และเรียกใช้ Bedrock Client
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
}ในที่สุดแยกวิเคราะห์การสตรีมซ้ำและถอดรหัสเป็นข้อความ เมื่อปรับใช้บนเซิร์ฟเวอร์ HTTP เราจำเป็นต้องแก้ไขรหัสเล็กน้อยเพื่อสตรีมการตอบสนองแต่ละครั้งกับไคลเอนต์ ตัวอย่างเช่นที่นี่
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" )
}
}การประชุมเชิงปฏิบัติการนี้ไม่ได้ให้รายละเอียดทีละขั้นตอนเพื่อปรับใช้แอปพลิเคชัน แต่จะมีสถาปัตยกรรมโดยรวมและตัวเลือกการปรับใช้ มันเป็นแบบตรงไปตรงมาที่จะปรับใช้แอปพลิเคชันใน 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" ]บทบาทงาน ECS
บทบาทงานจำเป็นต้องได้รับอนุญาต
นี่คือตัวอย่างของนโยบาย IAM ที่แนบมากับบทบาทงาน
{
"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 "
}
]
}นโยบายการเข้าถึงข้อมูล AOSS
เพื่อให้บทบาทงานในการเข้าถึงคอลเลกชัน AOSS เราจำเป็นต้องอัปเดตนโยบายการเข้าถึงของคอลเลกชัน