Enrich Dataset Rows with Dynamic Columns from the Dashboard
Enrich a dataset with AI-generated summaries, sentiment labels, entities, vector-retrieved context, and parsed JSON fields from the Future AGI dashboard.
Dynamic Columns enrich any dataset with AI-generated data: summaries, sentiment labels, extracted entities, vector-retrieved context, parsed JSON fields, and conditional routing. Every value is computed across every row from the Future AGI dashboard, no code required.
| Time | Difficulty | Package |
|---|---|---|
| 15 min | Beginner | Dashboard only |
- Future AGI account: app.futureagi.com
- A model available in your workspace’s model list (see Custom models to register one)
- For the Retrieval column: a vector database (Pinecone, Qdrant, or Weaviate) with data already indexed
Tutorial
Upload a starter dataset
Save as support_tickets.csv:
ticket_id,customer_message,agent_response,response_metadata,priority
T001,My laptop battery drains in under 2 hours even after a factory reset.,I have opened a replacement request. You will receive a prepaid shipping label within 24 hours.,"{""resolution_time_hours"": 24, ""replacement_approved"": true, ""ticket_owner"": ""support_team""}",high
T002,I never received my order from three weeks ago. Tracking says it was delivered.,I see the delivery was marked complete. Let me file a lost shipment claim with the carrier right now.,"{""resolution_time_hours"": 48, ""replacement_approved"": false, ""ticket_owner"": ""logistics_team""}",high
T003,The app crashes every time I try to open my account settings.,This is a known issue in version 3.2. Please update to version 3.3 using the link below.,"{""resolution_time_hours"": 2, ""replacement_approved"": false, ""ticket_owner"": ""engineering_team""}",medium
T004,Can I change my subscription plan before the billing date?,Absolutely! You can change your plan at any time from Account > Billing. The new rate applies from the next billing cycle.,"{""resolution_time_hours"": 0, ""replacement_approved"": false, ""ticket_owner"": ""billing_team""}",low
T005,I was charged twice for the same order last month.,I have confirmed the duplicate charge and initiated a full refund. It will appear in 3-5 business days.,"{""resolution_time_hours"": 72, ""replacement_approved"": true, ""ticket_owner"": ""billing_team""}",high- Go to Dataset then Add Dataset
- Select Upload a file (JSON, CSV) and choose
support_tickets.csv - Name the dataset
support_ticketsand drop in the file
You should see a support_tickets dataset grid with 5 rows and the 5 uploaded columns.
Run Prompt: generate summaries
- Add Column then Dynamic Columns then Run Prompt
- Name:
summary - Model Type:
LLM, Model:gpt-4o-mini - System:
You are a support assistant that writes short, factual summaries. - User:
Summarize this customer support message in one sentence: {{customer_message}} - Concurrency:
5 - Test then Run
You should see a new summary column populated with a one-sentence summary for every row.
Classification: label sentiment
- Add Column then Dynamic Columns then Classification
- Name:
sentiment, Column (source):customer_message - Add labels:
Positive,Neutral,Negative - Choose a model, Concurrency:
5 - Test then Run
You should see a sentiment column with one of the three labels assigned to each row. Labeling is model-dependent, so treat the exact assignments as illustrative rather than guaranteed.
Extract Entities: pull structured data
- Add Column then Dynamic Columns then Extract Entities
- Name:
entities, Column:customer_message - Instructions:
Extract: issue type, product, urgency level, and location (if present).
Return concise entity values.- Choose a model, Concurrency:
5 - Test then Run
You should see an entities column listing the issue type, product, and urgency level parsed out of each customer message.
Retrieval: fetch context from a vector database
Note
Requires an external vector database (Pinecone, Qdrant, or Weaviate) with data already indexed. This is separate from the Future AGI Knowledge Base.
- Add Column then Dynamic Columns then Retrieval
- Select your Vector Database type
Pinecone:
| Field | Value |
|---|---|
| Column | agent_response |
| Pinecone API Key | Your API key |
| Index Name | Your index |
| Namespace | Your namespace |
| Query Key | Your query key |
| Embedding Configuration (Type + Model) | Your embedding provider and model |
| Vector Length | Your index’s vector dimension |
| Number of chunks to fetch | 3 |
| Key to extract | text |
| Concurrency | 5 |
Qdrant:
| Field | Value |
|---|---|
| Column | agent_response |
| Qdrant API Key | Your API key |
| Qdrant URL | Your instance URL |
| Collection Name | Your collection |
| Embedding Configuration (Type + Model) | Your embedding provider and model |
| Vector Length | Your collection’s vector dimension |
| Number of chunks to fetch | 3 |
| Key to extract | text |
| Concurrency | 5 |
Weaviate:
| Field | Value |
|---|---|
| Column | agent_response |
| Weaviate API Key | Your API key |
| Weaviate Cluster URL | Your cluster URL |
| Collection Name | Your collection |
| Embedding Configuration (Type + Model) | Your embedding provider and model |
| Vector Length | Your collection’s vector dimension |
| Number of chunks to fetch | 3 |
| Search Type | Semantic Search or Hybrid |
| Key to extract | content |
| Concurrency | 5 |
- Test then Run
You should see a new column populated with the retrieved chunks for each row, pulled live from your vector database.
Extract JSON Key: parse a field from JSON
- Add Column then Dynamic Columns then Extract a JSON Key
- Name:
resolution_time, Column:response_metadata - JSON Key:
resolution_time_hours - Concurrency:
5 - Run
If response_metadata is still typed as text (its type after a CSV upload), every cell in resolution_time comes back null, since there’s no JSON to extract a key from.
- Open the
response_metadatacolumn header menu and select Edit Column Type, then set it to JSON - Re-run the
resolution_timecolumn
You should now see resolution_time holding just the resolution_time_hours value pulled out of each row’s response_metadata JSON, for example 24 for T001 and 48 for T002.
Conditional Node: route by priority
- Add Column then Dynamic Columns then Conditional Node
- Name:
triage_output
Branch 1 (if):
- Condition:
{{priority}} == "high"(references theprioritycolumn; verify the exact comparison syntax against your workspace before relying on it) - Column Type: Run Prompt
- Concurrency:
5 - System:
You are a senior support analyst. - User:
Write a detailed triage summary and next action for this high-priority ticket: {{customer_message}}
Branch 2 (else):
- Column Type: Run Prompt
- Concurrency:
5 - System:
You are a support assistant. - User:
Write a one-line summary for this ticket: {{customer_message}}
- Test then Run
You should see triage_output carry a detailed analyst summary for the high priority rows (T001, T002, T005) and a one-line summary for the rest.
Tip
Add elif branches between if and else for more granular routing. Each branch runs one of Run Prompt, Retrieval, Extract Entities, Extract JSON Key, Execute Custom Code, Classification, or API Calls.
Run evals on the enriched dataset
- Click Evaluate then Add Evaluations and select
groundedness - Map:
contexttoentities,outputtoagent_response - Add & Run
You should see a groundedness column report Pass or Fail for each row, with a Reason column explaining the verdict.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Run Prompt column stays empty after Run | Column referenced in {{...}} doesn’t exist or is misspelled | Check the exact column name in the dataset header; {{customer_message}} must match case-for-case |
| Classification assigns the same label to every row | Only one label was added, or the model wasn’t given enough distinguishing context | Add at least two contrasting labels and confirm the source column has varied content |
| Retrieval column returns empty results | Vector database index has no data, or the API key doesn’t have read access | Confirm the index/collection is populated and the key is scoped to read that index |
| Extract JSON Key returns null for every row | Source column is typed as text, not JSON | Use Edit Column Type in the column header menu to set the column’s data type to JSON before extracting |
| A Dynamic Column shows Failed on one row while the column overall reports Completed | That row’s input didn’t fit the model’s expectations, for example an empty or malformed source value | Open the row, check the source column’s value, fix or fill it, then rerun that row |
| Eval mapping fails with a missing key error | Mapped an eval input to a column that doesn’t exist yet, for example before the Dynamic Column has run | Run the Dynamic Column first, then map the eval to its output column |
Next
For every dynamic column method in detail, see Dynamic column methods.
Questions & Discussion