Amazon Q Developer의 코드 생성 시나리오 문제 해결 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Q Developer의 코드 생성 시나리오 문제 해결

Amazon Q Developer를 사용할 때 코드 생성 및 해결이 부정확한 다음과 같은 일반적인 시나리오가 발생할 수 있습니다.

빈 코드 생성

코드를 개발하는 동안 다음과 같은 문제가 발생할 수 있습니다.

  • Amazon Q는 제안을 제공하지 않습니다.

  • 'Amazon Q의 제안 없음' 메시지가 IDE에 나타납니다.

첫 번째 생각은 Amazon Q가 제대로 작동하지 않는 것일 수 있습니다. 그러나 이러한 문제의 근본 원인은 일반적으로 스크립트의 컨텍스트 또는 IDE 내의 열린 프로젝트와 관련이 있습니다.

Amazon Q Developer가 제안을 자동으로 제공하지 않는 경우 다음 바로 가기를 사용하여 Amazon Q 인라인 제안을 수동으로 실행할 수 있습니다.

  • PC - Alt+C

  • MacOS - Option+C

자세한 내용은 Amazon Q Developer 사용 설명서단축키 사용을 참조하세요.

대부분의 시나리오에서 Amazon Q는 제안을 생성합니다. Amazon Q가 "Amazon Q의 제안 사항 없음" 메시지를 반환하면이 문제에 대해 다음과 같은 일반적인 해결 방법을 검토합니다.

  • 부적절한 컨텍스트 - 해당 라이브러리가 있는지 확인합니다. 스크립트에 정의된 클래스 및 함수가 새 코드와 관련이 있는지 확인합니다.

  • 모호한 프롬프트 - 프롬프트가 혼란스럽거나 명확하지 않은 경우 인라인 코드 제안을 하면 Amazon Q의 성능이 저하됩니다. 이러한 시나리오에서는 코드와 설명에 더 구체적으로 명시하여 적절한 응답을 유도합니다.

멈춘 경우 최대한 코딩을 계속합니다. 일반적으로 Amazon Q는 의도를 인식하여 제안을 제공합니다. 또 다른 옵션은 Amazon Q 채팅에서 프롬프트 지침이 포함된 코드 조각을 보내는 것입니다. 자세한 내용은 Amazon Q Developer 사용 설명서의 Amazon Q로 코드 전송을 참조하세요.

지속적인 설명

주석을 사용하여 프롬프트를 작성하고 Amazon Q로부터 일반 또는 반복 주석 줄만 받을 수 있습니다.

입력:

// Kafka test

결과:

// Kafka test // Kafka test // Kafka test // Kafka test

일반적으로이 문제는 스크립트에 컨텍스트가 없거나 프롬프트 지침이 잘못되었기 때문입니다. 언어가 지정된 주석에는 표준 형식을 사용하는 것이 좋습니다. 이 예제에서 사용자는 설명 블록에를 사용하도록 프롬프트/* */ 를 변경했으며,이 변경으로 Amazon Q의 성능이 향상되었습니다.

입력:

/* * Create a unit test to push a message to a Kafka topic */

결과:

이 결과 사용자는 여러 제안을 순차적으로 수락했습니다.

/* * Create a unit test to push a message to a Kafka topic */ import org.junit.Test; import java.util.Properties; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import static org.junit.Assert.assertEquals; // create function for a Kafka test public class KafkaTest { @Test public void testKafka() { // create Kafka producer Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer"); KafkaProducer<String, String> producer = new KafkaProducer<>(props); // create Kafka topic String topic = "test"; // send message to Kafka topic producer.send(new ProducerRecord<>(topic, "key", "value")); // close Kafka producer producer.close(); // assert that message was sent successfully assertEquals("value", KafkaTest.consumer.poll().value()); } }

잘못된 인라인 코드 생성

경우에 따라 Amazon Q Developer 인라인 제안이 유용하지 않거나 프롬프트의 목표를 충족하지 못할 수 있습니다. 때때로 인라인 코드 제안은 간단한 Hello World 메서드와 유사한 일반 함수를 제공할 수 있습니다.

인라인 코드 제안이 도움이 되지 않는 경우 다음 모범 사례를 시도해 보세요.

  • 스크립트의 컨텍스트를 검토합니다. 일반적으로 제공하는 컨텍스트가 많을수록 Amazon Q에서 더 나은 결과를 얻을 수 있습니다.

  • 컨텍스트가 다르거나 노이즈가 있는 경우 코드를 모듈화합니다. 동일한 스크립트 내에서 유사한 함수를 그룹화합니다. 목표에 따라 서로 다른 클래스와 함수를 구분합니다.

  • Amazon Q가 더 나은 추천을 제공할 수 있도록 클래스 및 함수 이름을 전술적으로 작성합니다.

이 예제에서 개발자는 하둡에 파일을 업로드하는 스크립트를 처음부터 작성하고 있습니다.

입력:

class MyFunction{ // create function to read data locally and upload to HDFS filesystem

결과:

class MyFunction{ // create function to read local data file path and upload to HDFS filesystem public void readAndUploadToHDFS(String inputPath, String outputPath) throws IOException { // read data from local file BufferedReader in = new BufferedReader(new FileReader(inputPath)); }

Amazon Q는 권장 사항을 제공했지만 개발자의 기대치를 충족하지 못했습니다. 성능을 개선하기 위해 개발자는 라이브러리를 가져오고 Hadoop 유틸리티를 나타내도록 클래스 이름을 변경합니다.

수정:

import java.io.BufferedReader; import java.io.IOException; import java.io.FileReader; // import applicable hadoop libraries for IO operations import org.apache.hadoop.fs.Path; class HadoopUtilities{ // create function to read local data file path and upload to HDFS filesystem }

결과:

이 결과 개발자는 여러 제안을 순차적으로 수락했습니다.

class HadoopUtilities{ // create function to read local data file path and upload to HDFS filesystem public static void uploadToHDFS(String localFilePath, String hdfsFilePath) throws IOException { // create HDFS file path object Path hdfsPath = new Path(hdfsFilePath); // create local file path object Path localPath = new Path(localFilePath); // create hadoop file system object org.apache.hadoop.fs.FileSystem hdfs = org.apache.hadoop.fs.FileSystem.get(new org.apache.hadoop.conf.Configuration()); // upload local file to HDFS hdfs.copyFromLocalFile(localPath, hdfsPath); // close HDFS file system hdfs.close(); System.out.println("File uploaded successfully!"); }

동일한 스크립트에서 개발자는 Amazon Simple Queue Service(Amazon HadoopUtilities SQS) 주제를 읽는 주석 프롬프트를 추가합니다.Amazon SQS

입력:

// read message from SQS

결과:

// read message from SQS public static void readMessageFromSQS(String message) { System.out.println("Received message from SQS: " + message);

Amazon Q는 Java 메서드를 사용하여 Amazon SQS 메시지를 읽는 대신 문자열 메서드 인쇄를 제안합니다. 그러나이 제안은 개발자의 원래 목표를 충족하지 않습니다.

이 경우 코드를 다시 모듈화하는 것이 좋습니다. 스크립트는 하둡 메서드에 중점을 둡니다. 따라서 SQS 작업 전용 유틸리티 스크립트를 생성하는 것이 더 나은 방법일 수 있습니다.

SQS 유틸리티에 대해 별도의 클래스를 생성하면 HadoopUtilities 스크립트에서 사용할 수 있는 인라인 제안이 개선됩니다.

입력:

// import function for SQS import com.amazonaws.services.sqs.AmazonSQS; import java.util.ArrayList; import java.util.List; class SQSUtils { // instantiate SQS client private AmazonSQS sqsClient; // load SQS object public SQSUtils(AmazonSQS sqsClient) { this.sqsClient = sqsClient; } // poll message from Amazon SQS given queue name }

결과:

// poll message from Amazon SQS given queue name public List<String> pollMessages(String queueName) { List<String> messages = new ArrayList<>(); // poll messages from queue receiveMessageResult = sqsClient.receiveMessage(new ReceiveMessageRequest(queueName)); for (Message message : receiveMessageResult.getMessages()) { messages.add(message.getBody()); } return messages;

인라인 제안이 여전히 예상 결과를 제공하지 않는 경우 채팅 세션에서 Amazon Q Developer에 코드를 생성하도록 요청합니다.

사용자:

Amazon SQS 대기열에서 메시지를 읽는 Java 함수 생성

Amazon Q:

다음은 Amazon SQS 대기열에서 메시지를 읽는 Java 함수의 예입니다.

import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.model.Message; import com.amazonaws.services.sqs.model.ReceiveMessageRequest; import com.amazonaws.services.sqs.model.ReceiveMessageResult; public class SQSMessageReader { private AmazonSQS sqsClient; private String queueUrl; public SQSMessageReader(AmazonSQS sqsClient, String queueUrl) { this.sqsClient = sqsClient; this.queueUrl = queueUrl; } public String readMessage() { ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl) .withMaxNumberOfMessages(1) .withWaitTimeSeconds(10); ReceiveMessageResult receiveMessageResult = sqsClient.receiveMessage(receiveMessageRequest); if (receiveMessageResult.getMessages().size() > 0) { Message message = receiveMessageResult.getMessages().get(0); String messageBody = message.getBody(); String receiptHandle = message.getReceiptHandle(); // Process the message System.out.println("Received message: " + messageBody); // Delete the message from the queue sqsClient.deleteMessage(queueUrl, receiptHandle); return messageBody; } else { return null; } }

이 코드는 AmazonSQS 클라이언트와 대기열 URL을 생성자 파라미터로 사용하는 SQSMessageReader 클래스를 생성합니다. readMessage() 메서드는 ReceiveMessageRequest를 사용하여 대기열에서 최대 1개의 메시지를 가져오고 최대 대기 시간은 10초입니다.

메시지가 수신되면 메시지 본문이 인쇄되고 DeleteMessageRequest를 사용하여 대기열에서 메시지가 삭제됩니다. 그러면 메시지 본문이 반환됩니다. 메시지가 수신되지 않으면 null이 반환됩니다.

코드 생성에 대한 Amazon Q 채팅 종료

채팅의 부적절한 결과

코드를 개발하는 동안 개발자는 Amazon Q에 공통 함수를 생성하거나, 권장 사항을 제공하거나, 코드를 설명하도록 요청할 수 있습니다. 경우에 따라 프롬프트(예: 질문 또는 코드 조각)가 주어지면 Amazon Q는 일반적인 피드백이나 기대치를 충족하지 않는 결과를 제공할 수 있습니다. 이러한 시나리오에서는 다음을 시도해 보세요.

  • 다양한 프롬프트로 실험하여 Amazon Q에서 얻은 코드 생성 결과를 개선합니다.

  • Amazon Q가 프롬프트 또는 질문에 대한 응답에 자주 제공하는 URLs을 따릅니다.

  • Amazon Q의 향후 성능을 개선하는 데 도움이 되는 피드백을 제공합니다.

예를 들어 개발자는 검색 증강 생성(RAG) 솔루션을 생성하고 있으며 문장 간의 의미 관계를 고려하여 문서를 청크해야 합니다. 개발자는 다음과 같이 Amazon Q와 채팅합니다.

사용자:

RAG 솔루션의 경우 의미 체계 청킹을 위한 코드 생성

Amazon Q:

LangChain 라이브러리를 Python 사용하여에서 검색 증강 생성(RAG) 솔루션에 대한 의미 체계 청킹을 구현하는 방법의 예는 다음과 같습니다.

from langchain.text_splitter import CharacterTextSplitter, TokenTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma # Initialize the text splitter text_splitter = TokenTextSplitter( chunk_size=500, chunk_overlap=50, length_function=len ) # Initialize the embeddings model embeddings = HuggingFaceEmbeddings() # Create the vector store vectorstore = Chroma( embedding_function=embeddings.embed_documents, persist_directory="./chroma-data" ) # Chunk the text using semantic similarity def semantic_chunk(text): chunks = text_splitter.split_text(text) embeddings = embeddings.embed_documents(chunks) vectorstore.add_texts(chunks, embeddings) return chunks

이 예제에서는 LangChainTokenTextSplitter의를 사용하여 입력 텍스트를 50자 겹치는 500자의 청크로 분할합니다. HuggingFaceEmbeddings 모델은 각 청크에 대한 임베딩을 생성하는 데 사용되며 Chroma 벡터 스토어는 청크와 해당 임베딩을 저장하는 데 사용됩니다.

semantic_chunk 함수는 입력 텍스트를 가져와 text_splitter를 사용하여 청크로 분할하고 임베딩 모델을 사용하여 각 청크에 대한 임베딩을 생성한 다음 청크와 임베딩을에 추가합니다vectorstore.

이 접근 방식을 사용하면 입력 텍스트를 의미 있는 청크로 분할할 수 있으며, 이는 RAG 솔루션에서 질문 답변 또는 요약과 같은 다양한 작업에 유용할 수 있습니다.

이는 기본 예제이며 특정 사용 사례 및 데이터를 기반으로 파라미터(예: chunk_size, chunk_overlap) 또는 텍스트 분할기 및 임베딩 모델 선택을 조정해야 할 수 있습니다.

RAG 솔루션에 대한 Amazon Q 채팅 종료

그러나이 접근 방식은 슬라이딩 윈도우 기술을 사용하여 문서를 청크하는 기본적인 방법만 제공합니다. 개발자는 임베딩 측정에 의존하는 고급 방법을 원합니다. 이러한 시나리오에서 개발자는 목표를 고려하여 프롬프트에 세부 정보를 추가해야 합니다. 개발자가 LangChain을 사용하여 알려진 AI21 텍스트 분할자 함수를 참조하면 다음 채팅과 같이 향상된 응답을 받습니다.

사용자:

위의 프롬프트는 청크당 토큰 크기와 관련된 분할에만 관련이 있습니다. AI21 의미 체계 텍스트 분할자를 사용하고 싶습니다. langchain을 사용하여 A121 의미 체계 텍스트 분할을 사용하여 함수를 생성합니다.

Amazon Q:

LangChain과 함께 AI21 의미 체계 텍스트 분할기를 사용하여 의미 체계 청킹을 구현해 보겠습니다. 예는 다음과 같습니다. [1]

from langchain.text_splitter import AI21SemanticTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma # Initialize the text splitter text_splitter = AI21SemanticTextSplitter() # Initialize the embeddings model embeddings = HuggingFaceEmbeddings() # Create the vector store vectorstore = Chroma( embedding_function=embeddings.embed_documents, persist_directory="./chroma-data" ) # Chunk the text using semantic similarity def semantic_chunk(text): chunks = text_splitter.split_text(text) embeddings = embeddings.embed_documents(chunks) vectorstore.add_texts(chunks, embeddings) return chunks

이 예제에서는 LangChain의 AI21SemanticTextSplitter를 사용하여 입력 텍스트를 의미 있는 청크로 분할합니다. HuggingFaceEmbeddings 모델은 각 청크에 대한 임베딩을 생성하는 데 사용되며 Chroma 벡터 스토어는 청크와 해당 임베딩을 저장하는 데 사용됩니다.

semantic_chunk 함수는 입력 텍스트를 가져와 text_splitter를 사용하여 청크로 분할하고 임베딩 모델을 사용하여 각 청크에 대한 임베딩을 생성한 다음 청크와 해당 임베딩을에 추가합니다vectorstore.

이 접근 방식을 사용하면 입력 텍스트를 의미 있는 청크로 분할할 수 있으며, 이는 RAG 솔루션에서 질문 답변 또는 요약과 같은 다양한 작업에 유용할 수 있습니다.

특정 사용 사례 및 데이터에 따라 파라미터 또는 임베딩 모델 선택을 조정해야 할 수 있습니다.

소스 [1] LangChain에서 텍스트 분할자를 사용하는 방법 알아보기

soosweb3.hashnode.dev > the-ultimate-langchain-series-text-splitters

RAG 솔루션에 대한 Amazon Q 채팅 종료(개선된 프롬프트 사용)

채팅 결과에 따라 개발자는 함수를 사용하고 정보 소스로 이동할 수 있습니다.

일반적으로 고급 주제 및 질문은 Amazon Q Developer와 채팅할 때 프롬프트 내에서 더 구체적인 컨텍스트가 필요합니다. 채팅 결과가 정확하지 않다고 생각되면 축소 아이콘을 사용하여 Amazon Q 응답에 대한 피드백을 제공합니다. Amazon Q Developer는 피드백을 지속적으로 사용하여 향후 릴리스를 개선합니다. 긍정적인 결과를 가져온 상호 작용의 경우 썸업 아이콘을 사용하여 피드백을 제공하는 것이 유용합니다.