| título | autor | data |
|---|---|---|
Desenvolvendo aplicativos Genai com Golang | Haimtrann | 25/03/2024 |
O que frequentemente vemos na produção é uma variedade de idiomas escritos em Go, Java, .NET, no entanto, a maioria do material de aprendizagem na construção de aplicativos Genai (Inteligência Artifical Generativa) está atualmente em Python e JavaScript. Este workshop mostra como começar com a Amazon Bedrock na implementação de poucos exemplos básicos sem usar estruturas como Langchain, Strylit ou React.
Exemplos incluem:
Você implementará esses recursos usando apenas conceitos básicos de programação sem precisar aprender uma nova estrutura para ajudá -lo a entender e dominar conceitos fundamentais.
Arquitetura

Este aplicativo de amostra assume que você já está configurado
Substitua variáveis em /bedrock/constants.go com a sua, por exemplo
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 = "" Estrutura do projeto
| - - 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 Implemente um servidor HTTP e uma solicitação de rota aos manipuladores. Bedrock.Go e Aoss.Go são funções para invocar a Amazon Bedrock e a Amazon OpenEnsearch Sem Server (AOSS), respectivamente. Pasta estática contém frontend simples com JavaScript.
Importante
Para usar o AOSS, você precisa criar uma coleção OpenSearch e fornecer seu endpoint de URL em constantes. Além disso, você precisa configurar o acesso de dados no AOSS para o ambiente de tempo de execução (perfil EC2, função do ECS Taks, papel lambda, .etc)
Siga este documento oficial para instalar o Golang e execute o aplicativon como o seguinte
Importante
Por favor, instale Go Versão 1.21.5
cd developing - genai - applications - with - golang
go run main . go Primeiro, é bom criar algumas estruturas de dados de acordo com o formato da API da 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 ,
}Em seguida, converta a carga útil em bytes e invocar o cliente 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
}Finalmente, analise a resposta de streaming e decodifique o texto. Ao implantar em um servidor HTTP, precisamos modificar um pouco o código para transmitir cada pedaço de resposta ao cliente. Por exemplo aqui
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" )
}
}Este workshop não fornece passo a passo detalhado para implantar o aplicativo. Em vez disso, fornece arquitetura geral e uma opção de implantação. É direto para implantar o aplicativo no 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" ]Função de tarefas do ECS
A função de tarefa precisa de permissões para
Aqui está uma amostra da política do IAM anexada à função de tarefa
{
"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 "
}
]
}Política de Acesso de Dados AOSS
Para permitir que a função de tarefa acesse a coleção AOSS, precisamos atualizar a política de acesso da coleção.