Files
spring-ai-examples/agents/reflection/README.md
2024-11-01 15:57:47 -04:00

117 lines
3.9 KiB
Markdown

# Spring AI Reflection Agent Application
This project demonstrates the use of Spring AI to create a self-improving code generation system. The Reflection Agent uses two ChatClient instances in an iterative loop - one for generation and one for critique - to produce high-quality Java code.
It is based on the code in the repository https://github.com/neural-maze/agentic_patterns
The application implements a reflection-based system where the **Reflection Agent**:
- Uses a **generation ChatClient** to create code based on user prompts
- Uses a **critique ChatClient** to review the generated code
- Iteratively improves the code by feeding critique back to the **generation ChatClient**
- Continues this loop until the **critique ChatClient** is satisfied with the quality
## Prerequisites
- Java 17 or higher
- Maven
This examples uses OpenAI as the model provider.
Before using the AI commands, make sure you have a developer token from OpenAI.
Create an account at [OpenAI Signup](https://platform.openai.com/signup) and generate the token at [API Keys](https://platform.openai.com/account/api-keys).
The Spring AI project defines a configuration property named `spring.ai.openai.api-key` that you should set to the value of the API key obtained from OpenAI.
Exporting an environment variable is one way to set that configuration property:
```shell
export SPRING_AI_OPENAI_API_KEY=<INSERT KEY HERE>
```
## Running the Application
1. Clone the repository
2. Navigate to the project directory
3. Run the application using Maven wrapper:
`./mvnw spring-boot:run`
## Project Structure
### Main Components
* `Application.java`: The main Spring Boot application that provides the command-line interface
* `ReflectionAgent.java`: The core component that manages the iteration between generation and critique
## How It Works
### Initial Setup
The Reflection Agent creates two `ChatClient` instances:
- `generateChatClient`: For generating Java code based on user requests
- `critiqueChatClient`: For reviewing and critiquing the generated code
## Generation Process
- User inputs a request
- The generation `ChatClient` creates initial code
- The critique `ChatClient` reviews the code
- If improvements are needed, the generation `ChatClient` creates a revised version
- This continues for up to `maxIterations` or until the critique `ChatClient` approves (`<OK>`)
-
## ChatClient Configurations
- **Generation ChatClient** system prompt:
```text
You are a Java programmer tasked with generating high quality
Java code. Your task is to generate the best content possible
for the user's request.
```
- **Critique ChatClient** system prompt:
```text
You are tasked with generating critique and recommendations for
the user's generated content. If the user content has something
wrong or something to be improved, output a list of
recommendations and critiques.
```
## Example Run
In this sample run, the user requested a JUnit 5 test for a `Person` class. See the file `JacksonTestAgent.md` for the actual output.
### Initial Generation
- The generation `ChatClient` created a basic `Person` class and test class
- Included serialization/deserialization functionality
- Implemented basic test cases
### Critique Phase
The critique `ChatClient identified several improvements:
- Better error handling
- Improved code readability
- Need for edge case testing
- Better test structure
- Expanded test coverage
- Enhanced Java class structure
- Modern Java feature usage
### Final Result
The generation `ChatClient` created improved code with:
- Separated test methods for better modularity
- Enhanced error handling with detailed messages
- Added edge case testing for null values
- Improved code structure and readability
- Better test coverage
## MergeSort
The file `AgentMergeSort.md` shows a similar run to create a merge sort algorithm. There is also a JUnit test of the code that was generated to show it works.