Using Behavior Latticing to infer user motivation from unstructured interactions
Project description
Behavior Latticing
Latticing is a Python library for transforming raw interaction traces into behavioral insights about the user's motivations.
Given a stream of user interactions — chat histories, screen activity logs, support tickets, behavior latticing induces user motivation through hierarchically grouping and interpreting user behavior.
Installation
pip install latticing
Set your LLM provider API key(s) in a .env file or your environment:
ANTHROPIC_API_KEY=sk-ant-... # Anthropic (Claude)
OPENAI_API_KEY=sk-... # OpenAI (GPT)
GOOGLE_API_KEY=... # Google (Gemini)
TOGETHER_API_KEY=... # Together AI
Requirements: Python 3.10+
Quick start
import os
import asyncio
from lattice import Lattice, AsyncLLM, SyncLLM
from dotenv import load_dotenv
load_dotenv()
# interaction_traces: list of sessions, each a dict with
# "interactions" (list of {interaction, metadata}) and "time"
l = Lattice(
name="Alice",
interactions=interaction_traces,
description="the user's ChatGPT conversations",
insight_model=AsyncLLM(name="claude-opus-4-6", api_key=os.getenv("ANTHROPIC_API_KEY")),
observer_model=AsyncLLM(name="claude-sonnet-4-6", api_key=os.getenv("ANTHROPIC_API_KEY")),
evidence_model=AsyncLLM(name="claude-sonnet-4-6", api_key=os.getenv("ANTHROPIC_API_KEY")),
format_model=SyncLLM(name="claude-sonnet-4-6", api_key=os.getenv("ANTHROPIC_API_KEY")),
params={"max_concurrent": 100, "min_insights": 3, "window_size": 100},
)
# Each config entry defines a layer: how to group inputs into insight clusters
config = {
0: {"type": "session", "value": "5"}, # L1: synthesize observations across 5 chunks (i.e., chat conversations)
1: {"type": "session", "value": "10"}, # L2: synthesize insights across 10 chunks from the layer below
}
asyncio.run(l.build(config))
l.save("lattice.json")
# Interactive Plotly figure
l.visualize().show()
How it works
- Observe — the
Observerreads sliding windows of raw interactions and prompts an LLM to infer the user's behavior. - Synthesize — observations are grouped by session and synthesized into titled, evidence-backed insights with context on when each pattern applies.
- Layer — insights from multiple sessions are merged into higher-order patterns, revealing cross-session behaviors invisible at the individual session level.
- Explore — navigate the resulting lattice interactively — hover any node to read its full text, trace it back to its supporting observations.
Lattice structure
| Layer | Contents |
|---|---|
| 0 | Raw observations — inferred emotional/cognitive states from interaction windows |
| 1+ | Insights — higher-order inferred motivations that are induced from the layer below |
Edges link each insight back to the observations or lower-level insights that support it.
Supported providers
Pass different providers per role for cost/quality tradeoffs:
from lattice import AsyncLLM, SyncLLM
model = AsyncLLM(name="claude-opus-4-6", api_key=os.getenv("ANTHROPIC_API_KEY"))
format_model = SyncLLM(name="claude-haiku-4-5", api_key=os.getenv("ANTHROPIC_API_KEY"))
Documentation
Full documentation is available at https://stanfordhci.github.io/lattice.
Citation
If you use Behavior Latticing in academic work, please cite:
@article{zhao2026behavior,
title={Behavior Latticing: Inferring User Motivations from Unstructured Interactions},
author={Zhao, Dora and Lam, Michelle S and Yang, Diyi and Bernstein, Michael S},
journal={arXiv preprint arXiv:2604.07629},
year={2026}
}
License
MIT — see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file latticing-0.1.2.tar.gz.
File metadata
- Download URL: latticing-0.1.2.tar.gz
- Upload date:
- Size: 122.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aefe76dab9ec70da9e2e0492b31381ab2bab26a5f43583b1a2e7457cada02200
|
|
| MD5 |
347dcf5f5c6e993b5cfb513b795c4d7a
|
|
| BLAKE2b-256 |
8545a77188e02c63e7f72ec9b08995cb4764616eadea6c2d2dbc13b400c357dd
|
File details
Details for the file latticing-0.1.2-py3-none-any.whl.
File metadata
- Download URL: latticing-0.1.2-py3-none-any.whl
- Upload date:
- Size: 27.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3259c78da997e3b3094c1fe0122b62c1216396fbdd959ed18d88ddb0d6cf9b6
|
|
| MD5 |
bffe57f531da3dd90a993169ef4581b4
|
|
| BLAKE2b-256 |
7567302b47de5fb79652fda0fe3ef0ff7ac8f1ae9f05303579aae23b36b919fe
|