| 제목 | 작가 | 날짜 |
|---|---|---|
Golang과 함께 Genai 응용 프로그램 개발 | Haimtrann | 25/03/2024 |
우리가 생산에서 자주 보는 것은 Go, Java, .NET에 작성된 언어에 대한 다양성이지만 Genai (Generative Artifical Intelligence) 앱을 구축하는 데있어 대부분의 학습 자료는 현재 Python 및 JavaScript입니다. 이 워크샵은 Langchain, Streamlit 또는 React와 같은 프레임 워크를 사용하지 않고 몇 가지 기본 예제를 구현하는 Amazon Bedrock을 시작하는 방법을 보여줍니다.
예제는 다음과 같습니다.
기본 개념을 실제로 이해하고 마스터하는 데 도움이되는 새로운 프레임 워크를 배우지 않고도 기본 프로그래밍 개념 만 사용하여 이러한 기능을 구현하게됩니다.
건축학

이 샘플 응용 프로그램은 이미 설정한다고 가정합니다
예를 들어 /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 (ASS)를 호출하는 기능입니다. 정적 폴더에는 JavaScript가있는 간단한 프론트 엔드가 포함되어 있습니다.
중요한
AOSS를 사용하려면 OpenSearch 컬렉션을 만들고 Constants.go에서 URL 엔드 포인트를 제공해야합니다. 또한 러닝 타임 환경 (EC2 프로파일, ECS TAKS 역할, LAMBDA 역할, .ETC)에 대한 AOSS에서 데이터 액세스를 설정해야합니다.
이 공식 문서를 따라 Golang을 설치 한 다음 Application을 다음과 같이 실행하십시오.
중요한
Go 버전 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 컬렉션에 액세스 할 수 있도록하려면 컬렉션의 액세스 정책을 업데이트해야합니다.