Survey Memory System
Memory controls which previous question-answer pairs an agent sees when answering each question. This affects how context is provided in the LLM prompt.
Memory Modes
| Mode | Description | Use Case |
|---|---|---|
| No Memory | Agent sees no prior answers | Independent questions |
| Full Memory | Agent sees ALL prior answers | Conversational surveys |
| Lagged Memory | Agent sees last N answers | Recent context only |
| Targeted Memory | Specific questions see specific priors | Precise control |
Full Memory Mode
Every question sees all prior answers:
python
from edsl import Survey survey = Survey([q1, q2, q3, q4, q5]) # Enable full memory (returns new Survey) survey = survey.set_full_memory_mode() # Now: # - q2 sees q1's answer # - q3 sees q1 and q2's answers # - q4 sees q1, q2, and q3's answers # - etc.
Lagged Memory Mode
Each question sees only the last N answers:
python
survey = Survey([q1, q2, q3, q4, q5]) # Each question sees the last 2 Q&A pairs survey = survey.set_lagged_memory(lags=2) # Now: # - q3 sees q1 and q2's answers # - q4 sees q2 and q3's answers # - q5 sees q3 and q4's answers
Targeted Memory
Specific questions see specific prior answers:
python
survey = Survey([q1, q2, q3, q4, summary])
# q3 remembers q1's answer
survey = survey.add_targeted_memory("q3", "q1")
# summary remembers multiple specific questions
survey = survey.add_memory_collection("summary", ["q1", "q2", "q3"])
# Chain multiple targeted memories
survey = (survey
.add_targeted_memory("q3", "q1")
.add_targeted_memory("q4", "q2")
.add_memory_collection("summary", ["q1", "q2", "q3", "q4"]))
Memory Collection
One question sees multiple specific prior answers:
python
# Create a summary question that sees specific prior answers
summary_q = QuestionFreeText(
question_name="summary",
question_text="Based on your previous answers, what patterns do you notice?"
)
survey = Survey([q1, q2, q3, q4, summary_q])
# summary sees answers from q1, q2, q3, q4
survey = survey.add_memory_collection("summary", ["q1", "q2", "q3", "q4"])
Combining Memory Modes
You can combine different memory approaches:
python
survey = (Survey([intro, q1, q2, q3, q4, summary])
# Start with lagged memory as base
.set_lagged_memory(lags=1)
# Add specific memory for summary
.add_memory_collection("summary", ["q1", "q2", "q3", "q4"]))
Memory and Dependencies
Memory creates dependencies in the survey's DAG (Directed Acyclic Graph):
- •If question B remembers question A, then B depends on A
- •This affects parallel execution and validation
- •Questions cannot remember future questions (forward references)
python
# This works - q3 remembers q1
survey = survey.add_targeted_memory("q3", "q1")
# This would fail - can't remember future questions
# survey = survey.add_targeted_memory("q1", "q3") # Error!
View Memory Configuration
python
# Access the memory plan
memory_plan = survey.memory_plan
# See memory for each question
for question_name, memory in memory_plan.data.items():
print(f"{question_name} remembers: {memory.data}")
How Memory Affects Prompts
When an agent answers a question with memory, the prompt includes:
code
Before this question, you already answered: Question: What is your name? Answer: Alice Question: What is your occupation? Answer: Software engineer Now answer this question: ...
Memory Modes Comparison
python
survey = Survey([q1, q2, q3, q4])
# No memory (default) - each question is independent
# q4 sees: nothing
# Full memory
survey_full = survey.set_full_memory_mode()
# q4 sees: q1, q2, q3
# Lagged memory (lags=2)
survey_lagged = survey.set_lagged_memory(lags=2)
# q4 sees: q2, q3
# Targeted memory
survey_targeted = survey.add_targeted_memory("q4", "q1")
# q4 sees: q1 only
Quick Reference
| Task | Method |
|---|---|
| Full memory | survey.set_full_memory_mode() |
| Lagged memory | survey.set_lagged_memory(lags=N) |
| Single targeted | survey.add_targeted_memory(focal, prior) |
| Multiple targeted | survey.add_memory_collection(focal, [priors]) |
| View memory plan | survey.memory_plan |