

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Q Developer でのコード生成シナリオのトラブルシューティング
<a name="troubleshooting"></a>

Amazon Q Developer を使用すると、コードの生成と解決が不正確になる一般的なシナリオとして、次のようなものがあります。
+ [空のコード生成](#suggestions-troubleshooting)
+ [継続的なコメント](#comments-troubleshooting)
+ [インラインコード生成が正しくない](#code-generation-troubleshooting)
+ [チャットの結果が不十分](#chat-results-troubleshooting)

## 空のコード生成
<a name="suggestions-troubleshooting"></a>

コードの開発中に、次の問題が発生することがあります。
+ Amazon Q は提案を提供しません。
+ IDE に「Amazon Q からの提案なし」というメッセージが表示されます。

まず、Amazon Q が正しく動作していない可能性があります。ただし、これらの問題の根本原因は通常、スクリプト内のコンテキストまたは IDE 内のオープンプロジェクトに関連付けられます。

Amazon Q Developer が自動的に提案を提供しない場合は、次のショートカットを使用して Amazon Q インライン提案を手動で実行できます。
+ PC** **- **Alt\+C**
+ MacOS - **Option\+C**

詳細については、*「Amazon Q Developer* [ユーザーガイド」の「ショートカットキー](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/actions-and-shortcuts.html)の使用」を参照してください。

ほとんどのシナリオでは、Amazon Q が提案を生成します。Amazon Q が「Amazon Q からの提案なし」メッセージを返す場合は、この問題に関する次の一般的な解決策を確認してください。
+ **不適切なコンテキスト** — 該当するライブラリが存在することを確認します。スクリプトで定義されたクラスと関数が新しいコードに関連していることを確認してください。
+ **あいまいなプロンプト** – プロンプトがわかりにくい、または不明確である場合、Amazon Q はインラインコード提案を行うとパフォーマンスが低下します。これらのシナリオでは、適切なレスポンスを引き出すために、コードとコメントをより具体的に記述してください。

行き詰まった場合は、可能な限りコーディングを続けます。通常、Amazon Q はユーザーの意図を認識し、提案をトリガーします。もう 1 つのオプションは、Amazon Q チャットでプロンプト指示を含むコードスニペットを送信することです。詳細については、[「Amazon Q Developer User Guide」の「Send code to](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/explain-update-code.html#send-code) *Amazon Q*」を参照してください。

## 継続的なコメント
<a name="comments-troubleshooting"></a>

コメントを使用してプロンプトを記述し、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());
    }
}
```

## インラインコード生成が正しくない
<a name="code-generation-troubleshooting"></a>

Amazon Q Developer のインライン提案が役に立たないか、プロンプトの目標を満たしていない場合があります。場合によっては、インラインコード提案は、単純な Hello World メソッドに似た汎用関数を提供することがあります。

インラインコードの提案が役に立たない場合は、次のベストプラクティスを試してください。
+ スクリプトのコンテキストを確認します。通常、コンテキストを指定するほど、Amazon Q から得られる結果が向上します。
+ コンテキストが異なる場合やノイズが多い場合は、コードをモジュール化します。同じスクリプト内で同様の関数をグループ化します。目的別に異なるクラスと関数を区切ります。
+ Amazon Q がより良いレコメンデーションを提供するのに役立つように、クラス名と関数名を戦術的に記述します。

この例では、開発者はファイルを Hadoop にアップロードするスクリプトを最初から作成しています。

入力: 

```
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!");
}
```

同じHadoopUtilitiesスクリプトで、開発者は Amazon Simple Queue Service (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 メッセージを読み取る代わりに、文字列メソッドの印刷をお勧めします。ただし、この提案はデベロッパーの元の目標を満たしていません。

この場合、コードを再モジュール化することをお勧めします。スクリプトの焦点は Hadoop メソッドです。したがって、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 にコードの生成を依頼してください。

### コードの生成に関するチャット
<a name="chat-example-code"></a>

ユーザー: 

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 チャット****を終了する** 

## チャットの結果が不十分
<a name="chat-results-troubleshooting"></a>

コードの開発中に、開発者は Amazon Q に一般的な関数の生成、レコメンデーションの提供、またはコードの説明を依頼できます。プロンプト (質問やコードスニペットなど) がある場合、Amazon Q は一般的なフィードバックや期待を満たさない結果を提供することがあります。これらのシナリオでは、以下を試してください。
+ Amazon Q から得られるコード生成結果を改善するために、さまざまなプロンプトを試してください。
+ Amazon Q がプロンプトや質問への応答で頻繁に提供する URLs に従います。
+ Amazon Q の将来のパフォーマンス向上に役立つフィードバックを提供します。

たとえば、開発者は検索拡張生成 (RAG) ソリューションを作成しており、文間のセマンティック関係を考慮してドキュメントをチャンクする必要があります。開発者は次のように Amazon Q とチャットします。

### RAG ソリューションについてチャットする
<a name="chat-results-rag"></a>

ユーザー: 

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
```

この例では、LangChain TokenTextSplitterの を使用して、入力テキストを 500 文字のチャンクに分割し、重複する 50 文字にします。HuggingFaceEmbeddings モデルは各チャンクの埋め込みを生成するために使用され、Chromaベクトルストアはチャンクとその埋め込みを保存するために使用されます。

semantic\_chunk 関数は入力テキストを受け取り、text\_splocated を使用してチャンクに分割し、埋め込みモデルを使用して各チャンクの埋め込みを生成し、チャンクとその埋め込みを に追加しますvectorstore。

このアプローチにより、入力テキストを意味的に意味のあるチャンクに分割できます。これは、RAG ソリューションで質問への回答や要約などのさまざまなタスクに役立ちます。

これは基本的な例であり、特定のユースケースとデータに基づいてパラメータ (chunk\_size、chunk\_overlap など) またはテキストスプリッターと埋め込みモデルの選択を調整する必要がある場合があります。

RAG ソリューションに関する **Amazon Q **チャットの終了 ****

ただし、このアプローチでは、スライディングウィンドウ手法を使用してドキュメントをチャンクする基本的な方法のみを提供します。開発者は、埋め込みの測定に依存する高度な方法を求めています。これらのシナリオでは、開発者は目的に応じてプロンプトに詳細を追加する必要があります。開発者が LangChain で既知の AI21 テキストスプリッター関数を参照すると、次のチャットに示すようにレスポンスが改善されます。

### RAG ソリューションについてチャットする (プロンプトを改善)
<a name="chat-results-rag2"></a>

ユーザー:

上記のプロンプトは、チャンクあたりのトークンサイズに関する分割にのみ関連しています。AI21 セマンティックテキストスプリッターを使用します。A121 セマンティックテキストを言語チェーンで分割して関数を生成します。

Amazon Q:

さて、AI21 Semantic Text Splitter with LangChain を使用してセマンティックチャンキングを実装しましょう。以下に例を示します: [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\_spcovered を使用してチャンクに分割し、埋め込みモデルを使用してチャンクごとに埋め込みを作成し、チャンクとその埋め込みを に追加しますvectorstore。

このアプローチにより、入力テキストを意味的に意味のあるチャンクに分割できます。これは、RAG ソリューションで質問への回答や要約などのさまざまなタスクに役立ちます。

特定のユースケースとデータに基づいて、パラメータまたは埋め込みモデルの選択を調整する必要がある場合があります。

ソース [1] LangChain でテキストスプリッターを使用する方法について説明します

[soosweb3.hashnode.dev > the-ultimate-langchain-series-text-splitters](https://blog.davideai.dev/the-ultimate-langchain-series-text-splitters)

RAG ソリューションに関する **Amazon Q **チャットの終了 **(プロンプトを改善)** **** 

チャットの結果に基づいて、開発者は 関数を使用して情報のソースに移動できます。

一般的に、高度なトピックや質問では、Amazon Q Developer とチャットするときにプロンプト内でより具体的なコンテキストが必要です。チャットの結果が正確ではないと思われる場合は、サムズダウンアイコンを使用して Amazon Q レスポンスに関するフィードバックを提供します。Amazon Q Developer は、フィードバックを継続的に使用して将来のリリースを改善します。肯定的な結果をもたらしたインタラクションの場合は、サムズアップアイコンを使用してフィードバックを提供すると便利です。