| عنوان | مؤلف | تاريخ |
|---|---|---|
تطوير تطبيقات Genai مع Golang | حاييمتران | 25/03/2024 |
ما نراه غالبًا في الإنتاج هو مجموعة متنوعة على اللغات المكتوبة في Go و Java و .net ، ومع ذلك فإن غالبية المواد التعليمية في بناء تطبيقات Genai (الذكاء الفني التوليدي) موجودة حاليًا في Python و JavaScript. توضح ورشة العمل هذه كيفية البدء في صخور Amazon Bedrock من خلال تنفيذ بعض الأمثلة الأساسية دون استخدام أطر مثل Langchain أو SPEMONLIT أو 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 OpenSearch Serverless (AOSS) ، بشكل مستدير. يحتوي المجلد الثابت على واجهة أمامية بسيطة مع JavaScript.
مهم
لاستخدام AOSS ، تحتاج إلى إنشاء مجموعة OpenSearch وتوفير نقطة نهاية عنوان URL في Constants.go. بالإضافة إلى ذلك ، تحتاج إلى إعداد الوصول إلى البيانات في AOSS لبيئة وقت التشغيل (ملف تعريف EC2 ، دور ECS TAKS ، دور Lambda ، .etc)
اتبع هذا المستند الرسمي لتثبيت Golang ، ثم قم بتشغيل Applicationn على النحو التالي
مهم
يرجى تثبيت الإصدار 1.21.5
cd developing - genai - applications - with - golang
go run main . go أولاً ، من الجيد إنشاء بعض هياكل البيانات وفقًا لتنسيق Amazon Bedrock Claude3 API
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 ,
}ثم قم بتحويل الحمولة إلى بايت واستدعاء عميل الأساس
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 ، نحتاج إلى تحديث سياسة الوصول للمجموعة.