117 lines
3.9 KiB
Markdown
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.
|