| заголовок | автор | дата |
|---|---|---|
Разработка приложений Genai с Golang | Хаймтранн | 25/03/2024 |
То, что мы часто видим в производстве, - это разнообразие языков, написанных в Go, Java, .net, однако большинство учебных материалов по созданию приложений Genai (Generative Artifical Intelligence) в настоящее время находится в Python и Javascript. Этот семинар показывает, как начать работу с Amazon Bedrock в реализации нескольких основных примеров без использования платформ, таких как Langchain, Streamlit или React.
Примеры включают:
Вы будете реализовать эти функции, используя только базовые концепции программирования без необходимости выучить новую структуру, чтобы помочь вам по -настоящему понять и освоить фундаментальные концепции.
Архитектура

В этом примере приложения предполагается, что вы уже настроили
Пожалуйста, замените переменные в /бедрок /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, лямбда -роль, .etc)
Следуйте этому официальному документу, чтобы установить Golang, затем запустите приложение в качестве следующего
Важный
Пожалуйста, установите версию 1.21.5
cd developing - genai - applications - with - golang
go run main . go Сначала хорошо создать некоторые структуры данных в соответствии с форматом API Amazon 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 ,
}Затем преобразуйте полезную нагрузку в байты и вызовите клиента Bendrock
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, нам необходимо обновить политику доступа коллекции.