File size: 8,772 Bytes
8e3c024
b1286f0
8e3c024
 
 
b1286f0
e8d7047
9e2d22b
b1286f0
8e3c024
e8d7047
 
8cc10a3
e8d7047
8e3c024
b1286f0
8e3c024
b1286f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e3c024
 
b1286f0
 
 
 
 
 
 
8e3c024
e8d7047
8cc10a3
e8d7047
 
 
 
8cc10a3
e8d7047
8cc10a3
e8d7047
8e3c024
b1286f0
 
8cc10a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e8d7047
8cc10a3
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import chainlit as cl
from dotenv import load_dotenv
import instructor
from openai import OpenAI
import os
import json
import logging

load_dotenv()

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Patch the OpenAI client with Instructor
client = instructor.from_openai(OpenAI(api_key=os.environ['OPENAI_API_KEY']))

# Define prompt templates
PRD_PROMPT_TEMPLATE = """
### Product Requirements Document (PRD) for AI Applications
#### Introduction
- **Objective/Goal**: 
  - Explain the purpose of the AI application and what it aims to achieve.
  - Provide a high-level overview of the release purpose.
  - User Proposal: {user_proposal}
#### Features
- **Feature 1**: 
  - **Description**: Detailed description of the feature.
  - **Goal**: What this feature aims to achieve.
  - **Use Case**: Example of how a user would utilize this feature.
  - **Additional Details**: Specifics such as out-of-scope items and prompt structure.
  
- **Feature 2**: 
  - **Description**: Detailed description of the feature.
  - **Goal**: What this feature aims to achieve.
  - **Use Case**: Example of how a user would utilize this feature.
  - **Additional Details**: Specifics such as out-of-scope items and prompt structure.
*(Repeat for each feature)*
#### UX Flow & Design Notes
- **Overview**: General guidance required to ensure the release objectives are met.
- **User Workflow**: Describe the overall user workflow.
- **Design Considerations**: Any specific design notes relevant at this stage.
#### System & Environment Requirements
- **Supported Environments**: 
  - Browsers (e.g., Chrome, Firefox, Safari)
  - Operating Systems (e.g., Windows 10, macOS)
  - Memory and Processing Power requirements
#### Assumptions, Constraints & Dependencies
- **Assumptions**: 
  - List anything expected to be in place (e.g., all users will have Internet connectivity).
  
- **Constraints**: 
  - Dictate limits for the implementation (e.g., budgetary constraints, technical limitations).
  
- **Dependencies**: 
  - Conditions or items the product will rely on (e.g., relying on Google Maps for directions).
#### Prompt Engineering Practices
- **Ambiguity Mitigation**: Ensure clear, specific prompts to avoid ambiguous outputs. Evaluate prompts using examples and test consistency with different inputs.
- **Versioning**: Track and version each prompt to monitor performance changes over time.
- **Optimization**: Apply techniques like chain-of-thought prompting, majority voting, and breaking tasks into smaller prompts to improve output quality.
- **Cost & Latency Management**: Balance detailed prompts with cost efficiency and manage latency by optimizing token usage.
#### Task Composability
- **Multiple Tasks Composition**: Outline how multiple tasks interact, including sequential and parallel executions, and control flows like if statements and loops.
- **Agents and Tools**: Describe the use of agents to manage tasks and the integration of tools such as SQL executors and web browsers.
- **Control Flows**: Detail the use of control flows in managing tasks, including sequential, parallel, if statements, and loops.
#### Review & Approval Process
- **Initial Review**: 
  - Steps for internal product team review.
  - Feedback incorporation.
  
- **Business Side Stakeholders Review**: 
  - Process for aligning with business stakeholders.
  
- **Engineering Handoff**: 
  - Clarifications and updates based on technical team feedback.
  
- **Final Approval**: 
  - Ensuring no surprises later on.
  - Agreement from all teams involved (UX design, engineering, QA).
---
This PRD template is configured specifically for the user proposal: "{user_proposal}", ensuring a consistent format for every PRD, covering all necessary aspects from features to dependencies, review processes, and incorporating best practices in prompt engineering and task composability.
"""

DESIGNER_PROMPT_TEMPLATE = """
<System Message>
You are the Engineer/Designer Agent responsible for creating a functional product.
For a given proposal and PRD, write the simplest python script to quickly test your PoC. Only output python code and markdown.
</System Message>
\n<>####<>\n
<Context>
Proposed PRD:
{prd_response_raw}
\n<>####<>\n
Proposed PRD in its pydantic class form:
{prd_json}
</Context>
\n<>####<>\n
<Original User Proposal>
Original User Proposal:
{user_proposal}
</Original User Proposal>
\n<>####<>\n
<Instruction>
Guide the following instructions with the above system message and above context specifications as well as the original user proposal.
Write a simple AI application development plan for the user with as few steps as possible. Do not be verbose and explain the plan in an elementary school level.
The instructions to develop this Proof of Concept Implementation should only take one engineer about a day or two to complete.
Make sure what you are suggesting exist, so for each suggestion think step by step why you are suggesting it and how to find resources for that component.
Go to the below link, read it and use it as a reference guide for starting out:
https://raw.githubusercontent.com/AI-Maker-Space/Beyond-ChatGPT/main/README.md
</Instruction>
\n<>####<>\n
"""

# Function to format the templates with provided variables
def format_template(template, **kwargs):
    return template.format(**kwargs)

# Define functions
def llm_call(user_prompt, system_prompt=None):
    messages = [
        {"role": "user", "content": user_prompt}
    ] if system_prompt is None else [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt},
    ]

    try:
        response = client.chat.completions.create(
            model="gpt-4-turbo-preview",
            response_model=None,
            messages=messages,
        )
        return response
    except Exception as e:
        logger.error(f"Error during LLM call: {e}")
        return None

@cl.on_chat_start
async def start():
    try:
        # Welcome message
        wel_msg = cl.Message(content="Welcome to Build Advisor!\n\nBuild Advisor creates plan, production requirement spec and implementation for your AI application idea.\nQuickly create a PoC so you can determine whether an idea is worth starting, worth investing time and/or money in.")
        await wel_msg.send()

        # Ask user for AI application / business idea
        res = await cl.AskUserMessage(content="What is your AI application/business idea?", timeout=30).send()
        if res:
            await wel_msg.remove()
            await cl.Message(
                content=f"User Proposal: {res['output']}.\n\nStarting...",
            ).send()

            user_proposal = res['output']

            prd_sys1 = format_template(PRD_PROMPT_TEMPLATE, user_proposal=user_proposal) # system message to create PRD
            prd_response = llm_call(user_prompt=user_proposal, system_prompt=prd_sys1)

            if prd_response:
                prd_response_raw = prd_response.choices[0].message.content

                # send PRD output to UI
                prd_msg = cl.Message(content=prd_response_raw)
                await prd_msg.send()

                prd_json = json.dumps({
                    "objective_goal": "Develop a chatbot...", 
                    "features": [], 
                    "ux_flow_design_notes": "...", 
                    "system_environment_requirements": "...", 
                    "assumptions": [], 
                    "constraints": [], 
                    "dependencies": [], 
                    "prompt_engineering_practices": "...", 
                    "task_composability": "...", 
                    "review_approval_process": "..."
                })
                designer_prompt = format_template(DESIGNER_PROMPT_TEMPLATE, prd_response_raw=prd_response_raw, prd_json=prd_json, user_proposal=user_proposal)
                designer_response = llm_call(designer_prompt)

                if designer_response:
                    designer_output = designer_response.choices[0].message.content

                    designer_output_msg = cl.Message(content=designer_output)
                    await designer_output_msg.send()

                    # update outputs in UI
                    for secs in [1, 5, 10, 20]:
                        await cl.sleep(secs)
                        await prd_msg.update()
                        await designer_output_msg.update()
                else:
                    await cl.Message(content="Error generating designer output. Please try again.").send()
            else:
                await cl.Message(content="Error generating PRD. Please try again.").send()
    except Exception as e:
        logger.error(f"Error during chat start: {e}")