Skip to main content

Using Behavior Latticing to infer user motivation from unstructured interactions

Project description

Behavior Latticing

Python 3.10+ arXiv PyPI Downloads License: MIT

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

  1. Observe — the Observer reads sliding windows of raw interactions and prompts an LLM to infer the user's behavior.
  2. Synthesize — observations are grouped by session and synthesized into titled, evidence-backed insights with context on when each pattern applies.
  3. Layer — insights from multiple sessions are merged into higher-order patterns, revealing cross-session behaviors invisible at the individual session level.
  4. 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"))

Examples

Explore examples of how behavior latticing can be applied to different types of interaction data:

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

latticing-0.1.3.3.tar.gz (168.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

latticing-0.1.3.3-py3-none-any.whl (31.4 kB view details)

Uploaded Python 3

File details

Details for the file latticing-0.1.3.3.tar.gz.

File metadata

  • Download URL: latticing-0.1.3.3.tar.gz
  • Upload date:
  • Size: 168.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for latticing-0.1.3.3.tar.gz
Algorithm Hash digest
SHA256 948a9f35b79fa721f6f625872fbab4495264c643e78053c0d6de88c350f84346
MD5 1c5d7345ee17d189ff1d0163c07d5161
BLAKE2b-256 9cefc4fe9890223df77eaf94bff29a9b1ec4b0e33ee084c6554c07e5a566d939

See more details on using hashes here.

File details

Details for the file latticing-0.1.3.3-py3-none-any.whl.

File metadata

  • Download URL: latticing-0.1.3.3-py3-none-any.whl
  • Upload date:
  • Size: 31.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for latticing-0.1.3.3-py3-none-any.whl
Algorithm Hash digest
SHA256 6d585275b39f30ea4e7a5c437b2a1dda4073ec77bf9de38fd4bfce58a69e25ee
MD5 c8710aaa94f5a2b5ac718a11cb118d60
BLAKE2b-256 ec21182393ac58ea245b75af174e6287593e13dc81881b3a374467d7541b9bd1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page