

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 Amazon Q 开发者中的代码生成场景进行故障排除
<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 开发者没有自动提供建议，您可以使用以下快捷方式手动执行 Amazon Q 内嵌建议：
+ 电脑****-**Alt\+** C
+ **macOS-Option\+C**

有关更多信息，请参阅 *Amazon Q 开发者用户指南*中的[使用快捷键](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/actions-and-shortcuts.html)。

在大多数情况下，Amazon Q 会生成建议。当 Amazon Q 返回 “没有来自 Amazon Q 的建议” 消息时，请查看该问题的以下常见解决方案：
+ **上下文不足**-确保存在适用的库。确保脚本中定义的类和函数与新代码相关。
+ **提示模棱两可** — 如果提示令人困惑或不清楚，Amazon Q 在提出内联代码建议时表现不佳。在这些情况下，请在代码和注释中更具体，以获得正确的响应。

如果你遇到困难，可以尽你所能继续编程。通常，Amazon Q 会识别出您的意图，从而触发它提供建议。另一种选择是在Amazon Q聊天中发送带有提示说明的代码片段。有关更多信息，请参阅 [Amazon Q *开发者用户指南中的向 Amazon Q* 发送代码](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/explain-update-code.html#send-code)。

## 持续评论
<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 获得的结果就越好。
+ 如果上下文变化 and/or 很嘈杂，请对代码进行模块化。将相似的函数分组到同一个脚本中。按目标区分不同的类和函数。
+ 从战术上写下您的类和函数名称，以帮助 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 SQS) Simple Queue Service 主题。

输入：

```
// 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 方法从亚马逊 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>

用户：

生成 Java 函数以读取来自亚马逊 SQS 队列的消息

亚马逊 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;
        }
    }
```

此代码创建一个 SQSMessage Reader 类，该类将 AmazonSQS 客户端和队列网址作为构造函数参数。readMessage () 方法使用从队列中提取最多 1 条消息，最长等待时间为 10 秒。 ReceiveMessageRequest 

如果收到消息，则会打印消息正文并使用将消息从队列中删除 DeleteMessageRequest。然后返回消息正文。如果未收到任何消息，则返回 null。

**结束****关于生成代码的 Amazon Q 聊天**

## 聊天结果不足
<a name="chat-results-troubleshooting"></a>

在开发代码时，开发人员可以让 Amazon Q 生成常用函数、提供建议或解释代码。有时，如果出现提示（例如问题或代码片段），Amazon Q 可能会提供不符合您期望的一般反馈或结果。在这些场景中，请尝试以下操作：
+ 尝试不同的提示以改善您从 Amazon Q 获得的代码生成结果。
+ 按 URLs 照 Amazon Q 在回答您的提示或问题时经常提供的内容进行操作。
+ 提供反馈以帮助改善 Amazon Q. 的未来表现

例如，开发人员正在创建检索增强生成 (RAG) 解决方案，鉴于句子之间的语义关系，他们需要对文档进行分块。开发者按如下方式与 Amazon Q 进行了交谈。

### 聊一聊 RAG 解决方案
<a name="chat-results-rag"></a>

用户：

对于 RAG 解决方案，生成用于语义分块的代码

亚马逊 Q：

当然，这里有一个示例，说明如何在Python使用库时为检索增强生成 (RAG) 解决方案实现语义分块： LangChain 

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

在此示例中，我们使用 from TokenTextSplitter 将输入文本拆分为 500 个字符的块，重叠部分为 50 个字符。 LangChain 该HuggingFaceEmbeddings模型用于为每个区块生成嵌入，向Chroma量存储用于存储区块及其嵌入。

semantic\_chunk 函数接收输入文本，使用 text\_splitter 将其分成块，使用嵌入模型为每个区块生成嵌入内容，然后将这些块及其嵌入添加到中。vectorstore

这种方法允许您将输入文本拆分为语义上有意义的块，这对于RAG解决方案中的各种任务（例如问答或摘要）非常有用。

请注意，这是一个基本示例，您可能需要根据您的特定用例和数据调整参数（例如 chunk\_size、chunk\_overlap）或文本拆分器和嵌入模型的选择。

**关于 RAG 解决方案的 Amazon Q 聊天****已结束**

但是，这种方法仅提供了一种使用滑动窗口技术对文档进行分块的基本方法。开发人员想要一种依赖于测量嵌入的高级方法。在这些情况下，开发者必须根据自己的目标在提示中添加更多细节。当开发者使用引用已知的 AI21 文本拆分器功能时 LangChain，他们会收到改进的响应，如以下聊天所示。

### 聊一聊 RAG 解决方案（带有改进的提示音）
<a name="chat-results-rag2"></a>

用户：

上面的提示仅与拆分每个区块的令牌大小有关。我想使用 AI21 语义文本拆分器。使用语言链的 A121 语义文本拆分生成一个函数。

亚马逊 Q：

好吧，让我们使用 AI21 语义文本拆分器 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
```

在此示例中，我们使用 from 将 AI21SemanticTextSplitter 输入文本拆分 LangChain 为语义上有意义的块。该HuggingFaceEmbeddings模型用于为每个区块创建嵌入，向Chroma量存储用于存储块及其嵌入。

semantic\_chunk 函数接收输入文本，使用 text\_splitter 将其分成块，使用嵌入模型为每个区块创建嵌入内容，然后将这些块及其嵌入添加到中。vectorstore

这种方法允许您将输入文本拆分为语义上有意义的块，这对于RAG解决方案中的各种任务（例如问答或摘要）非常有用。

请注意，您可能需要根据您的特定用例和数据调整参数或嵌入模型的选择。

来源 [1] 了解如何在中使用文本拆分器 LangChain

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

**关于 RAG 解决方案的 Amazon Q 聊天****已结束****（提示已改进**）

根据聊天结果，开发者可以使用该功能并导航到信息来源。

通常，当您与 Amazon Q Developer 聊天时，高级主题和问题需要在提示中提供更具体的背景信息。如果您认为聊天结果不准确，请使用竖起大拇指图标提供有关 Amazon Q 回复的反馈。Amazon Q Developer 不断使用反馈来改进 future 的版本。对于产生积极结果的互动，使用竖起大拇指图标提供反馈很有用。