Learning from User Demonstration
For complex tasks, users can demonstrate the task execution process to help UFO learn effective action patterns. UFO uses Windows Step Recorder to capture user action trajectories, which are then processed and stored for future reference.
Mechanism
UFO leverages the Windows Step Recorder tool to capture task demonstrations. The workflow operates as follows:
- Record: User performs the task while Step Recorder captures the action sequence
- Process: The
DemonstrationSummarizerextracts and summarizes the recorded demonstration from the zip file - Store: Summarized demonstrations are saved to the configured demonstration database
- Retrieve: When encountering similar tasks, the
DemonstrationRetrieverqueries relevant demonstrations - Apply: Retrieved demonstrations guide the AppAgent's plan generation
See the User Demonstration Provision guide for detailed recording instructions.
Demo Video:
Configuration
To enable learning from user demonstrations:
-
Provide Demonstrations: Follow the User Demonstration Provision guide to record demonstrations
-
Configure Parameters: Set the following options in
config.yaml:
| Configuration Option | Description | Type | Default |
|---|---|---|---|
RAG_DEMONSTRATION |
Enable demonstration-based learning | Boolean | False |
RAG_DEMONSTRATION_RETRIEVED_TOPK |
Number of top demonstrations to retrieve | Integer | 5 |
RAG_DEMONSTRATION_COMPLETION_N |
Number of completion choices for demonstration results | Integer | 3 |
DEMONSTRATION_SAVED_PATH |
Database path for storing demonstrations | String | "vectordb/demonstration/" |
For more details on RAG configuration, see the RAG Configuration Guide.
API Reference
Demonstration Summarizer
The DemonstrationSummarizer class in record_processor/summarizer/summarizer.py handles demonstration summarization:
The DemonstrationSummarizer class is the summarizer for the demonstration learning. It summarizes the demonstration record to a list of summaries, and save the summaries to the YAML file and the vector database. A sample of the summary is as follows: { "example": { "Observation": "Word.exe is opened.", "Thought": "The user is trying to create a new file.", "ControlLabel": "1", "ControlText": "Sample Control Text", "Function": "CreateFile", "Args": "filename='new_file.txt'", "Status": "Success", "Plan": "Create a new file named 'new_file.txt'.", "Comment": "The user successfully created a new file." }, "Tips": "You can use the 'CreateFile' function to create a new file." }
Initialize the DemonstrationSummarizer.
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
__build_prompt(demo_record)
Build the prompt by the user demonstration record.
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | |
__parse_response(response_string)
Parse the response string to a dict of summary.
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
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 | |
create_or_update_vector_db(summaries, db_path)
staticmethod
Create or update the vector database.
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
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 198 199 | |
create_or_update_yaml(summaries, yaml_path)
staticmethod
Create or update the YAML file.
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
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 | |
get_summary_list(record)
Get the summary list for a record
| Parameters: |
|
|---|
Source code in summarizer/summarizer.py
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | |
Demonstration Retriever
The DemonstrationRetriever class in ufo/rag/retriever.py handles demonstration retrieval:
Bases: Retriever
Class to create demonstration retrievers.
Create a new DemonstrationRetriever. :db_path: The path to the database.
Source code in rag/retriever.py
206 207 208 209 210 211 | |
get_indexer(db_path)
Create a demonstration indexer. :db_path: The path to the database.
Source code in rag/retriever.py
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | |