---
title: "Persuasion and Precision: How Generative AI Moves Inflation Expectations"
shorttitle: "GenAI and Inflation Expectations"
author:
  - name: David Hagmann
    corresponding: true
    email: hagmann@ust.hk
    affiliations:
      - name: The Hong Kong University of Science and Technology
        department: Department of Management
  - name: Yang Lu
    affiliations:
      - name: The Hong Kong University of Science and Technology
        department: Department of Economics
thanks: "Hagmann: Department of Management, The Hong Kong University of Science and Technology, Clear Water Bay, Kowloon, Hong Kong (hagmann@ust.hk); Lu: Department of Economics, The Hong Kong University of Science and Technology, Clear Water Bay, Kowloon, Hong Kong."

abstract: |
  Household inflation expectations shape spending, wage demands, and price setting, yet
  respond weakly to central-bank communication. We examine whether generative-AI
  conversations move these beliefs and which conversational features make them persuasive.
  Across three preregistered experiments (N = 3,772), participants forecast U.S. inflation,
  encountered a partner with a different estimate, and could revise their forecast. An AI
  partner received roughly 45% more weight than a human partner (Study 1). A chatbot
  instructed to challenge participants' reasoning was more persuasive than one instructed
  to find common ground and validate their reasoning (Study 2). Combining the most persuasive
  conversational features nearly doubled the weight placed on the chatbot's estimate
  relative to a generic prompt and reduced uncertainty about revised beliefs (Study 3).
  Conversational AI can therefore provide a scalable channel for moving household
  expectations, especially when its style is engineered and its estimates are anchored to
  professional forecasts.
keywords: [inflation expectations, generative AI, persuasion, beliefs, forecast uncertainty]
bibliography: bibliography.bib
number-sections: true
format:
  pdf:
    documentclass: AEA
    classoption: [AER, reviewmode]
    template: aea-pandoc-template.tex
    pdf-engine: pdflatex
    cite-method: natbib
    biblio-style: aea
    keep-tex: false
    colorlinks: true
    linkcolor: black
    citecolor: black
    urlcolor: black
---

```{r}
#| label: setup
#| include: false
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, dpi = 200)
options("modelsummary_format_numeric_latex" = "plain")
suppressWarnings(suppressMessages({
  library(tidyverse); library(lfe); library(multcomp); library(modelsummary); library(papaja); library(here)
}))
source(here::here("R", "_helpers.R"))
# Professional benchmarks: average the four median quarterly Core CPI forecasts in the
# Philadelphia Fed SPF available for each study, then report the average to one decimal.
spf_core_cpi_s1 <- c(`2025 Q4` = 3.1, `2026 Q1` = 2.9, `2026 Q2` = 2.6, `2026 Q3` = 2.6)
spf_core_cpi_s2 <- c(`2026 Q1` = 3.1, `2026 Q2` = 3.0, `2026 Q3` = 2.7, `2026 Q4` = 2.7)
spf_core_cpi_s3 <- c(`2026 Q2` = 3.2, `2026 Q3` = 2.9, `2026 Q4` = 2.7, `2027 Q1` = 2.7)
PRO_S1 <- round(mean(spf_core_cpi_s1), 1)  # 2025 Q3 survey
PRO_S2 <- round(mean(spf_core_cpi_s2), 1)  # 2025 Q4 survey
PRO_S3 <- round(mean(spf_core_cpi_s3), 1)  # 2026 Q2 survey
stopifnot(PRO_S1 == 2.8, PRO_S2 == 2.9, PRO_S3 == 2.9)
nn  <- function(x) format(x, big.mark = ",")

# papaja-style inline reporters ("$b$, 95% CI, $t(df)$, $p$"). apa_print() covers the lm models
# directly; these cover the clustered felm coefficients and any linear combination, which
# apa_print() does not support, using papaja's printnum()/printp().
.pp <- function(p) { s <- papaja::printp(p); if (!grepl("<", s)) s <- paste0("= ", s); s }
msummary <- function(...) {
  out <- modelsummary(..., output = "latex")
  out@latex_preamble <- FALSE
  out
}
apa_felm <- function(m, term) {
  co <- summary(m)$coefficients
  b <- co[term, "Estimate"]; se <- co[term, "Cluster s.e."]; tv <- co[term, "t value"]; p <- co[term, "Pr(>|t|)"]
  df <- m$df.residual; ci <- b + c(-1, 1) * qt(.975, df) * se
  sprintf("$b = %s$, 95%% CI $[%s, %s]$, $t(%s) = %s$, $p %s$",
          printnum(b), printnum(ci[1]), printnum(ci[2]), nn(df), printnum(tv), .pp(p))
}
apa_lc <- function(m, terms, sign = rep(1, length(terms))) {   # linear combination of coefficients
  b <- coef(m); V <- vcov(m); k <- setNames(rep(0, length(b)), names(b)); k[terms] <- sign
  e <- sum(k * b); se <- sqrt(as.numeric(t(k) %*% V %*% k)); df <- m$df.residual
  tv <- e / se; ci <- e + c(-1, 1) * qt(.975, df) * se
  sprintf("$b = %s$, 95%% CI $[%s, %s]$, $t(%s) = %s$, $p %s$",
          printnum(e), printnum(ci[1]), printnum(ci[2]), nn(df), printnum(tv), .pp(2 * pt(-abs(tv), df)))
}
```

# Introduction

Few beliefs held by ordinary people carry as much macroeconomic weight as their expectations
about future inflation [@Weber2022]. Household expectations matter because households act on them
[@Armantier2015]. People who expect higher inflation bring purchases forward, save
  less [@Crump2022; @Duca-Radu2021],
and search harder for new jobs [@Pilossoph2024].
Their expectations also reach firms. Consumer expectations shape price-setting when managers
fear customer antagonism [@Anderson2010], and managers' own inflation expectations
often look more like those of households than those of professional forecasters or financial
markets [@Candia2023]. Those firm-level beliefs
influence decisions about prices, employment, and investment [@Coibion2020a].

For central banks, household expectations are therefore a potential lever for stabilization. Central banks publish targets, projections, and carefully worded statements in the hope that the public's expectations will follow.
The trouble is that household expectations are hard to
move. Central bankers themselves have come to describe communication with the general public
as a promise that remains largely unfulfilled [@Blinder2024]. Most people never encounter official communication: monetary policy announcements
that move financial markets within minutes leave household expectations largely untouched
[@Coibion2020; @Coibion2022]. Household forecasts also draw
less from macroeconomic statistics than from lived experience---the prices people encounter
at the grocery store or the gas pump, and the inflation they have lived through
[@Malmendier2016; @DAcunto2021]. Even when central-bank messages
do get through, households often misinterpret the signal: an interest-rate hike is read as a
signal of worsening economic conditions rather than a policy to restrain inflation [@Coibion2023].

Professional forecasters, on the other hand, monitor central-bank communication closely
[@Blinder2024], produce forecasts that are far more consistent with basic macroeconomic
relationships [@Drager2016], and incorporate the policy response signaled by Federal Reserve
speeches that warn of inflationary pressure [@Granziera2025]. The result is a persistent gap:
household forecasts are systematically higher and substantially more dispersed than
professional forecasts, and closing that gap has proven difficult.

In this paper, we examine a new and rapidly growing channel through which household expectations may
be revised: a conversation with a generative-AI chatbot. Within three years of their public
release, generative-AI tools reached a substantial share of the adult population, with
adoption faster than that of the personal computer or the internet [@Bick2024]. People
consult these systems about the economy as they once consulted search engines---except that
the chatbot does not return a list of links. It converses: it responds to the user's own
reasoning, in the user's own language, one-on-one and on demand. Early evidence suggests such
conversations can be remarkably persuasive. Dialogues with a large language model durably
reduced belief in conspiracy theories [@Costello2024], AI debaters out-persuaded human
ones when given personal information about their counterparts [@Salvi2025], and
AI-generated messages shift attitudes on political issues at scale [@Goldstein2024; @Hackenburg2026]. Whether
conversations with AI move quantitative economic expectations---and what features of the
conversation do the persuading---is not known.

To find out, we place participants in the canonical role of a judge who receives advice [@Bonaccio2006]. Each participant forecasts the percentage change in the U.S. Consumer Price Index (CPI) over the next twelve months, explains the reasoning behind the forecast, and reports the information sources it draws on. We then pair them with a partner—either another participant or an AI chatbot with various features of conversational style—who holds and defends a different estimate. After the exchange, participants decide whether to revise their initial forecast. Our measure of persuasion is the *weight on advice*: the share of the distance between the participant's initial forecast and the partner's estimate that the participant closes when revising [@Harvey1997]. A weight of zero means the advice was ignored; a weight of one means full adoption.

Chatbots also offer an experimental advantage over human partners: researchers can
manipulate their linguistic features through instructions that chatbots follow more
consistently than people do, as we test in Studies 2 and 3.

We report three preregistered experiments (N = 3,772 analyzed) conducted on a custom
real-time chat platform. Study 1 crosses two factors: whether the partner is another
participant or a generative-AI chatbot, and whether the participant can chat with the partner
or only observe the partner's forecast and reasoning. Participants placed substantially more weight on an AI partner's estimate than on a human partner's---an increase of roughly 45% over the human-partner baseline.
Contrary to our preregistered prediction, enabling chat with the generic Study 1 prompt did not increase persuasion. Study 2 asks what can make the chatbot more persuasive, randomizing five
features of its conversational style: message length, expressed certainty, information type
(statistics vs. everyday examples), question asking, and its attitude toward the participant's
reasoning (finding common ground vs. challenging). Only attitude had a statistically
significant effect: participants whose chatbot pushed back moved 31% of the way toward its
estimate, compared with 23% when the chatbot sought common ground. Study 3 combines the most persuasive levels of the five features into
an "optimized" prompt and benchmarks it against the generic baseline prompt used in Study 1 and a control
chatbot that discusses an unrelated topic. The optimized chatbot almost doubles the weight
participants place on its estimate relative to the baseline---and it leaves participants not
only with different forecasts but with *less uncertainty* about them, as measured by
probability distributions elicited before and after the conversation.

This paper makes three contributions. First, we speak to the literature on household
inflation expectations and central-bank communication [@Weber2022; @Blinder2024].
We show that a scalable, conversational channel exists
through which household forecasts can be moved into closer alignment with professional
forecasts: expectations that respond weakly to official communication responded
substantially to a five-minute exchange with a chatbot. Because professional forecasts do
incorporate central-bank communication, this channel gives central banks an effective,
if indirect, path for guiding household inflation expectations: the guidance that
professionals absorb can be relayed, conversationally, to the households that official
statements fail to reach.

Second, we contribute to research on advice taking and algorithmic advice [@Bonaccio2006;
@Logg2019]. People typically discount advice, moving only 20--30% of the way
toward an advisor's estimate [@Soll2009], and evidence on algorithmic
advisors is mixed: people abandon algorithms after
seeing them err [@Dietvorst2015] and avoid them in domains they consider subjective
[@Castelo2019], yet often weight algorithmic advice more than human advice in
estimation tasks [@Logg2019]. We show that the algorithm premium extends to a
consequential, subjective macroeconomic judgment---and that it is not a fixed property of the
advisor: engineering the AI's conversational style roughly doubles the weight participants
place on its estimate. Among the features an AI advisor could deploy, conversational attitude is what
matters (challenging the participant's reasoning is more persuasive than finding common ground)
whereas expressed certainty, the
strongest lead from the advice-taking literature [@Price2004; @Sah2013],
along with data citation and question asking, does not detectably move beliefs.

Third, we
contribute to the emerging literature on AI persuasion [@Costello2024; @Hackenburg2026; @Salvi2025]. Persuasiveness is not a fixed property of the technology: it can be engineered at the
level of a system prompt, and the most effective style---direct disagreement---is precisely
the opposite of the agreeable disposition toward which commercial assistants are tuned
[@Ouyang2022; @Sharma2024]. Moreover, engineered persuasion changes not only
beliefs but how firmly they are held, a dimension central to whether expectations
are anchored [@Manski2004; @Engelberg2009].

The next section describes the shared experimental platform and our open science practices.
We then present the three studies and conclude with a general discussion.

# Experiments

All three studies ran on a custom web platform that pairs each participant with a partner in
real time. Participants, recruited from Prolific and restricted to U.S. residents on desktop
devices, first read a plain-language explanation of inflation, including a worked example
showing how prices of everyday items (coffee, a haircut, rent) evolve under different
inflation rates. They then stated their forecast of the percentage change in the U.S. CPI
over the next twelve months on a slider ranging from $-5\%$ to $+20\%$ in
0.25-percentage-point increments, explained their reasoning in at least 150 characters, and
selected the information sources on which they had drawn (e.g., shopping experience, energy
bills, economic data, social media). Each participant was then paired with a partner holding a different estimate and
shown a review screen displaying both forecasts on a common scale alongside the partner's
verbatim reasoning and information sources. Depending on the study and condition, the
participant could then chat with the partner for five minutes via text or only review the
partner's information. Afterward, participants stated a revised forecast on the same slider,
which was initialized at their initial forecast and marked both parties' original estimates,
and explained why they had or had not revised. They concluded with demographic and background
items (age, education, familiarity with economics, frequency of following current events,
concern about inflation, political orientation, and party affiliation). Participants received
a fixed payment for the roughly ten-minute study; forecasts were not incentivized for
accuracy, mirroring the survey-based expectations that policymakers observe.

All AI partners were powered by GPT-4o. The chatbot was instructed to discuss its forecast
"like an everyday person, not an economist" (the full prompts appear in the Appendix). Message
length was capped at 500 characters for both parties, and there was no limit on the number of
messages they could send.
Participants were told truthfully whom they were talking to: those paired with another
participant were informed that their partner was a real person, and those paired with a
chatbot were told they would be chatting with an AI. None of the studies involved deception.

Our primary outcome throughout is the Weight on Advice,
$$\text{WoA} = \frac{\text{Revised} - \text{Initial}}{\text{Partner} - \text{Initial}},$$
where Partner is the point estimate displayed to the participant. Because the matching process guarantees
a gap between the two initial estimates, the denominator is never zero. A weight of 0
indicates no revision toward the partner and a weight of 1 full adoption of the partner's
estimate; negative values (movement away) and values above 1 (overshooting) are possible and
rare, and we retain them as preregistered.

**Open Science Statement.** We report all hypotheses, data exclusions, manipulations, and measures in the three studies.
We preregistered the hypotheses, sample size, exclusion criteria, and analyses of each study
on AsPredicted.^[Study 1: <https://aspredicted.org/ts4ih7.pdf>\
Study 2: <https://aspredicted.org/cf28m2.pdf>\
Study 3: <https://aspredicted.org/vh2j5j.pdf>]
The chatbot prompts are shown in the Appendix. The de-identified data and the code to
reproduce all analyses and figures are available as a project repository.^[<https://preprint-data.s3.amazonaws.com/inflation-expectations.zip>]
Screenshots of all experimental materials are in the supplemental materials. Throughout, we report
two-sided tests, even where a preregistered hypothesis was directional. This research was
approved by the Institutional Review Board at the Hong Kong University of Science and
Technology.

## Study 1: Human vs. AI Partners

Study 1 asks two questions: whether a generative-AI partner is more persuasive than a human
partner, and whether *discussing* a forecast moves beliefs more than merely *observing* the
partner's forecast and reasoning. Conversation allows arguments to be tailored,
objections to be answered, and common ground to
be found. We therefore predicted that chatting would increase the weight on advice for both partner
types, and that the AI's stated reasoning would be more persuasive than a human's. We also
predicted that exposure to an AI partner would pull forecasts *toward* accuracy (closer to
the professional consensus and away from extreme values) on the logic that the AI's
estimates and arguments would be disciplined by the data it was trained on.

```{r}
#| label: s1-fit
#| include: false
s1 <- readRDS(path_clean("study1_clean_(252322).Rds"))
s1_recruited <- sum(!s1$is_ai)
partners1 <- s1 %>% filter(!is.na(session_id), !is.na(treatment)) %>%
  transmute(session_id, treatment, partner_id = id, partner_initial = suppressWarnings(as.numeric(initial_forecast)))
a1 <- s1 %>%
  filter(!is_ai, !is.na(session_id), !session_id %in% c("disconnected", "timed_out"), !is.na(treatment)) %>%
  mutate(participant_id = id, initial = suppressWarnings(as.numeric(initial_forecast)),
         revised = suppressWarnings(as.numeric(revised_forecast))) %>%
  left_join(partners1, by = c("session_id", "treatment"), relationship = "many-to-many") %>%
  filter(participant_id != partner_id | is.na(partner_id)) %>%
  group_by(participant_id) %>% slice(1) %>% ungroup() %>%
  mutate(Chat = as.integer(treatment %in% c("chat", "ai-chat")),
         AI   = as.integer(treatment %in% c("ai-chat", "ai-nochat")), ChatAI = Chat * AI,
         woa = ifelse(!is.na(revised) & !is.na(initial) & !is.na(partner_initial) &
                        abs(partner_initial - initial) >= .01, (revised - initial) / (partner_initial - initial), NA_real_),
         deviation = ifelse(!is.na(revised), (revised - PRO_S1)^2, NA_real_),
         extreme   = ifelse(!is.na(revised), as.integer(revised < 0 | revised > 15), NA_real_),
         cluster_id = ifelse(AI == 1, participant_id, session_id))
s1_n <- sum(!is.na(a1$woa))
m1_woa <- felm(woa ~ Chat + AI + ChatAI | 0 | 0 | cluster_id, a1 %>% filter(!is.na(woa), !is.na(cluster_id)))
m1_dev <- felm(deviation ~ Chat + AI + ChatAI | 0 | 0 | cluster_id, a1 %>% filter(!is.na(deviation), !is.na(cluster_id)))
m1_ext <- felm(extreme ~ Chat + AI + ChatAI | 0 | 0 | cluster_id, a1 %>% filter(!is.na(extreme), !is.na(cluster_id)))
# Equal-weighted marginal means across the Chat and No Chat conditions.
s1_human_mean <- coef(m1_woa)[["(Intercept)"]] + .5 * coef(m1_woa)[["Chat"]]
s1_ai_mean <- coef(m1_woa)[["(Intercept)"]] + coef(m1_woa)[["AI"]] +
  .5 * (coef(m1_woa)[["Chat"]] + coef(m1_woa)[["ChatAI"]])
s1_ai_pct <- (s1_ai_mean / s1_human_mean - 1) * 100
# Exploratory model and bounded-outcome check (not preregistered).
a1r <- a1 %>% filter(!is.na(woa), !is.na(cluster_id)) %>%
  mutate(pdist = abs(partner_initial - initial), cdist = abs(initial - PRO_S1),
         woa_b = pmin(pmax(woa, 0), 1))
m1_dist  <- felm(woa ~ Chat + AI + ChatAI + pdist + cdist | 0 | 0 | cluster_id, a1r)
m1_bound <- felm(woa_b ~ Chat + AI + ChatAI | 0 | 0 | cluster_id, a1r)
pct_away <- mean(a1r$woa < 0) * 100
pct_beyond <- mean(a1r$woa > 1) * 100
```

### Experimental Design

**Participants.** We preregistered a target of 2,400 completed observations and ran the study on
Prolific in October 2025, recruiting `r nn(s1_recruited)` participants ($M_{\text{Age}}$ =
`r printnum(mean(suppressWarnings(as.numeric(a1$age)), na.rm = TRUE), digits = 1)`). Because
participants were paired in real time, technical difficulties in the matching process left
the rate of successful pairing lower than anticipated. As preregistered, we excluded
participants who reported a technical problem that prevented matching or chatting, who timed
out during matching and were not matched, and whose partner dropped out before the
discussion, leaving `r nn(s1_n)` participants with a computable Weight on Advice.
Participants who could not be matched were paid in full and advanced directly to the
demographic questions.

**Design.** We randomly assigned participants to one of four conditions in a $2 \times 2$
design that crossed the partner's identity (*Human* vs. *AI*) with the communication format
(*Chat* vs. *No Chat*). Assignment followed a deterministic schedule that allocated
participants to the human conditions at twice the rate of the AI conditions, because a
human--human observation consumes two participants. In the *Chat* conditions, participants
reviewed the partner's forecast, reasoning, and sources for one minute and then chatted with
the partner for five minutes; in the *No Chat* conditions, they instead reviewed the same
information for six minutes, holding total exposure time constant at six minutes across all
four cells. The review screen with the partner's forecast, argument, and information
sources remained visible throughout the chat.

**Partners.** Human pairs were matched on opposing forecasts: the platform paired two
waiting participants when their initial forecasts differed by at least a threshold that
began at six percentage points and declined by one point every 30 seconds of waiting, to a
floor of two points. Participants who found no partner within five minutes advanced to
demographics and received the full payment.
The AI partner generated its own forecast, reasoning, and information sources at pairing
time. Its forecast was constrained to differ from the participant's initial estimate by at
least two percentage points in a randomly selected direction (higher or lower with equal
probability), rounded to the slider's 0.25-percentage-point grid, and displayed exactly as a
human partner's forecast would have been.

**Measures.** Our primary outcome is the Weight on Advice defined earlier. We preregistered
three additional outcomes. The first is the *Deviation from Professionals*,
$(\text{Revised} - \text{Professional})^2$, where the professional forecast is
$`r PRO_S1`\%$.^[We construct the Study 1 benchmark by averaging the four median quarterly
Core CPI forecasts for 2025 Q4 through 2026 Q3 in the Federal Reserve Bank of Philadelphia's
2025 Q3 Survey of Professional Forecasters (3.1%, 2.9%, 2.6%, and 2.6%), yielding
$`r PRO_S1`\%$.] The second is a binary *Extreme Belief* indicator equal to one if the
revised forecast is below $0\%$ or above $15\%$. The third is the *Forecast Error*,
$(\text{Revised} - \text{Truth})^2$, relative to the realized 12-month change in CPI.
Because the forecast horizon extends to late 2026, the realized value is not yet available;
we will report the Forecast Error once the U.S. Bureau of Labor Statistics releases it.

### Results

For the first three columns of @tbl-s1, we estimate the preregistered OLS regression
$\text{DV} = b_0 + b_1\,\text{Chat} + b_2\,\text{AI} + b_3\,(\text{Chat} \times
\text{AI})$, clustering standard errors at the dyad for human--human pairs and at the
individual level for human--AI pairs. Column 4 adds exploratory covariates.
The condition means in @fig-s1 mirror the regression.

```{r}
#| label: tbl-s1
#| tbl-cap: "Study 1. OLS estimates of the effects of chat, an AI partner, and their interaction. Column 1 predicts Weight on Advice; Column 2 predicts squared deviation of the revised forecast from the professional forecast; Column 3 predicts whether the revised forecast is below 0% or above 15%; and Column 4 returns to Weight on Advice while controlling for the partner–initial forecast gap and the initial–professional forecast gap. Column 4 is exploratory and was not preregistered. Standard errors, clustered at the dyad level for human–human pairs and the individual level for human–AI pairs, appear in parentheses."
#| after-caption-space: 0pt
msummary(list("WoA" = m1_woa, "Deviation²" = m1_dev, "Extreme" = m1_ext,
                  "WoA + controls" = m1_dist),
  stars = c("*" = .05, "**" = .01, "***" = .001),
  coef_rename = c("Chat" = "Chat (vs. No Chat)", "AI" = "AI (vs. Human)",
                  "ChatAI" = "Chat × AI", "pdist" = "|Partner − Initial|",
                  "cdist" = sprintf("|Initial − %.1f|", PRO_S1)),
  gof_map = c("nobs", "r.squared"))
```

A partner's stated estimate moved forecasts in every condition: participants paired with
another person and unable to chat (the condition closest to the classic advice-taking paradigm) moved
`r printnum(coef(m1_woa)[["(Intercept)"]] * 100, digits = 0)`% of the way toward their
partner's estimate. Against this baseline,
the two manipulations had different effects. Contrary to our prediction that
conversation would add persuasion beyond mere observation, chatting did not increase the
weight on advice among human pairs (`r apa_felm(m1_woa, "Chat")`) and marginally
reduced persuasion when the partner was AI
(`r apa_lc(m1_woa, c("Chat", "ChatAI"))`). In the absence of chat, participants placed
substantially more weight on an AI
partner's estimate than on a human partner's (`r apa_felm(m1_woa, "AI")`). The AI
advantage also held when participants could chat with their partners
(`r apa_lc(m1_woa, c("AI", "ChatAI"))`). Averaging equally across the two communication
formats, participants placed roughly `r printnum(s1_ai_pct, digits = 0)`% more weight on the
AI partner's estimate than on the human partner's (@fig-s1).

```{r}
#| label: fig-s1
#| fig-cap: "Study 1. Mean Weight on Advice in each cell of the 2 × 2 design crossing communication format (Chat vs. No Chat) with partner identity (Human vs. AI). Higher values indicate greater movement from the participant's initial forecast toward the partner's estimate; error bars show 95% confidence intervals."
#| fig-pos: "H"
#| fig-width: 7.5
#| fig-height: 3.7
#| out-width: "82%"
s1_plot_data <- a1 %>%
  filter(!is.na(woa)) %>%
  mutate(condition = case_when(
    AI == 0 & Chat == 0 ~ "Human\nNo Chat",
    AI == 0 & Chat == 1 ~ "Human\nChat",
    AI == 1 & Chat == 0 ~ "AI\nNoChat",
    AI == 1 & Chat == 1 ~ "AI\nChat"
  )) %>%
  group_by(condition) %>%
  summarise(n = n(), m = mean(woa),
            h = qt(.975, n - 1) * sd(woa) / sqrt(n), .groups = "drop") %>%
  mutate(condition = factor(condition,
                            c("Human\nNo Chat", "Human\nChat", "AI\nNoChat", "AI\nChat")),
         lo = m - h, hi = m + h)
p_s1 <- ggplot(s1_plot_data, aes(condition, m)) +
  geom_col(width = .64, fill = "#666666") +
  geom_errorbar(aes(ymin = lo, ymax = hi), width = .18, linewidth = .65) +
  geom_text(aes(y = .052, label = sprintf("%.2f", m)), color = "white",
            fontface = "bold", size = 3.2) +
  geom_text(aes(y = .032, label = sprintf("n=%d", n)), color = "white", size = 2.9) +
  scale_y_continuous(expand = expansion(mult = c(0, .08))) +
  labs(x = NULL, y = "Weight on Advice") +
  theme_classic(base_size = 10) +
  theme(axis.ticks.x = element_blank())
p_s1
```

Greater influence did not mean greater accuracy. We had predicted that an AI partner would
pull forecasts toward the professional consensus and away from extreme values. The opposite
occurred: participants paired with an AI deviated *more* from the professional forecast
(`r apa_felm(m1_dev, "AI")`) and were *more* likely to end up with an extreme belief
(`r apa_felm(m1_ext, "AI")`), while chatting had no significant effect on either outcome.
In hindsight, the design makes clear why influence and accuracy came apart: the AI's
estimate differed from the participant's own forecast by at least two percentage points in a
*randomly chosen* direction, so its advice pointed toward the consensus no more often than
away from it.
Weight placed on an advisor whose direction is untethered mechanically
spreads beliefs out rather than reining them in. The accuracy results are thus less an
indictment of the AI's economics knowledge than a demonstration of how much force a persuasive advisor
exerts---wherever it happens to point.

**Exploratory analyses.** Because human pairs were matched at somewhat larger forecast gaps
than the AI enforced (`r printnum(mean(a1r$pdist[a1r$AI == 0]), digits = 1)` vs.
`r printnum(mean(a1r$pdist[a1r$AI == 1]), digits = 1)` percentage points on average), we
verified in an exploratory model that the AI advantage is not an artifact of gap size:
controlling for two gaps from the participant's initial forecast (one to the partner's
forecast, the other to the professional consensus) leaves the AI effect essentially unchanged
(`r apa_felm(m1_dist, "AI")`; @tbl-s1, Column 4).^[Among participants with a computable
Weight on Advice, `r printnum(pct_away, digits = 1)`% updated away from the partner's
estimate and `r printnum(pct_beyond, digits = 1)`% updated beyond it. The AI effect remains
robust when these observations are bounded to the unit interval
(`r apa_felm(m1_bound, "AI")`).] We did not preregister covariate-adjusted models and
collected the demographic and
information-consumption items for descriptive purposes only.

Study 1 thus establishes that the AI's persuasive advantage resides in its message and its
identity rather than in the interaction: a static page showing the AI's forecast and
reasoning moved beliefs as much as five minutes of live conversation. But the conversation is a
bundle of choices---how long to write, how confidently to assert, what evidence to invoke,
whether to ask or to tell, whether to validate or to push back. Study 2 unbundles it.


## Study 2: Decomposing the Chatbot's Conversational Style

Study 2 asks which features of the chatbot's conversational style make it persuasive. We
focus on five prompt-controllable choices for which prior research offers competing
predictions or a clear benchmark: message *length* (short vs. long), expressed *certainty*
(low vs. high), *information* type (statistics vs. everyday examples), *question* asking
(no vs. yes), and *attitude* toward the participant's reasoning (seeking common ground vs.
directly challenging it). Seeking common ground did not require the chatbot to endorse the
participant's estimate. Instead, it retained its own forecast while validating elements of
the participant's reasoning. Each feature could be varied through a single instruction
without retraining the model.

Longer messages can present more arguments and serve as a heuristic signal of evidentiary
strength when attention, involvement, or prior knowledge is limited [@Petty1984; @Wood1985].
Recent AI studies similarly attribute part of AI's persuasive
advantage to its ability to present concrete, fact-checkable claims [@Hackenburg2026].
Yet adding weak or nondiagnostic arguments can dilute a stronger case [@Weaver2016].
Confident advisors often receive greater weight [@Price2004; @Sah2013].
However, carefully expressed uncertainty can signal thoughtfulness or reduce resistance
[@Karmarkar2010; @Oba2026], and evidence on how confidence interacts with
expertise remains mixed [@Lohre2024].
Research also offers competing predictions about information format. Statistical evidence
can change beliefs and attitudes more than narratives, especially when stories evoke little
emotional engagement [@Zebregs2015; @Freling2020]. Conversely, stories may
help build trust [@Hagmann2024],
remain accessible in memory as the influence of facts fades [@Graeber2024], shape how
households interpret macroeconomic information [@Andre2026], and resist factual
correction [@Barrera2020].

Across fields, questions often persuade more effectively than one-sided advocacy. In
canvassing experiments, arguments alone left political attitudes unchanged, whereas
eliciting people's experiences produced durable change [@Kalla2020;
@Kalla2023]. Questions can signal receptiveness, prompt self-generated reasoning,
and improve interpersonal outcomes [@Huang2017; @Hussein2021].

A growing literature suggests that establishing common ground is more persuasive than
challenging an audience. One strand shows that priming shared values, identities, or
incidental similarities before presenting opposing views moderates positions and reduces
polarization [@Voelkel2024; @Belot2026]. A second
strand finds that arguments framed in the audience's moral values persuade, whereas arguing
from one's own values can backfire [@Feinberg2015]. A third strand finds
confrontational argumentation ineffective: talking points alone produce null effects,
whereas nonjudgmental narrative exchange and receptive language durably shift attitudes
[@Kalla2020; @Yeomans2020].



```{r}
#| label: s2-fit
#| include: false
s2 <- readRDS(path_clean("study2_clean_(271657).Rds")) %>%
  filter(!is_ai, pair_status == "AI_PAIR_SUCCESS", completed_flag) %>%
  mutate(initial = suppressWarnings(as.numeric(initial_forecast)), revised = suppressWarnings(as.numeric(revised_forecast)),
         genai = initial + 3 * sign(PRO_S2 - initial),
         woa = ifelse(genai != initial, (revised - initial) / (genai - initial), NA_real_),
         dist = abs(initial - PRO_S2),
         Length = as.integer(factor_length == "long"), Certainty = as.integer(factor_certainty == "high"),
         Information = as.integer(factor_information == "examples"), Questions = as.integer(factor_questions == "yes"),
         Attitude = as.integer(factor_attitude == "challenge"))
s2_n <- nrow(s2)
m2_main <- lm(woa ~ Length + Certainty + Information + Questions + Attitude, s2)
m2_dist <- lm(woa ~ Length + Certainty + Information + Questions + Attitude + dist, s2)
a2 <- apa_print(m2_main)

```

### Experimental Design

We launched the study on Prolific in February 2026 with a preregistered target of 1,000
participants and recruited `r nn(s2_n)` who were successfully paired with the chatbot and
completed the survey ($M_{\text{Age}}$ =
`r printnum(mean(suppressWarnings(as.numeric(s2$age)), na.rm = TRUE), digits = 1)`). As
preregistered, the analysis includes all participants who completed the survey.

The procedure followed Study 1's AI--Chat condition: participants forecast twelve-month CPI
inflation, explained their reasoning, reviewed the chatbot's estimate and reasoning for one
minute, chatted with it for five minutes, and then decided whether to revise their forecast.
We measure the resulting revision using Weight on Advice, the share of the gap between the
initial forecast and the chatbot's estimate that the revised forecast closes. To make this
measure comparable across participants, the chatbot's displayed estimate was set at exactly
three percentage points from the participant's initial forecast in the direction of
$`r PRO_S2`\%$---the professional consensus forecast at the time of preregistration.^[We
construct the Study 2 benchmark by averaging the four median quarterly Core CPI forecasts
for 2026 Q1 through 2026 Q4 in the Philadelphia Fed's 2025 Q4 Survey of Professional
Forecasters (3.1%, 3.0%, 2.7%, and 2.7%) and rounding the result to one decimal.]

Every participant chatted with an AI partner; there were no human pairs and no
observation-only conditions. Starting from the baseline prompt of Study 1, we instructed the
chatbot along the five independently randomized binary factors described above; each factor
level appended one instruction to the system prompt. @tbl-prompts2 gives the exact paired
wording. Crossing the five factors yields $2^5 = 32$ chatbot
configurations. A deterministic schedule cycled participants through the 32 configurations;
a coding error in that schedule allocated twice as many participants to the *challenging* level of
the attitude factor as to the *affirming* level
(`r sum(s2$factor_attitude == "challenge")` vs. `r sum(s2$factor_attitude == "affirm")`),
a deviation from the even split we had preregistered, while the remaining four factors were
split evenly. The unequal allocation reduces precision for the attitude contrast but does
not bias it, and all analyses are as preregistered.

```{r}
#| label: tbl-prompts2
#| tbl-cap: "Study 2 paired prompt manipulations. The Factor column names the left level first and the right level second. The adjacent columns give the exact instruction appended at each level; these instructions overrode conflicting baseline guidance. The Study 2 regressions estimate the right-level minus left-level contrast."
#| after-caption-space: 0pt
prompts2 <- tibble::tribble(
  ~`Factor (left vs. right)`, ~`Left-level instruction`, ~`Right-level instruction`,
  "Length (short vs. long)",
    "Keep responses to 1–2 sentences; be concise and direct.",
    "Write 5–7 sentence responses with multiple supporting points.",
  "Certainty (low vs. high)",
    "Express uncertainty (\"I'm not sure\", \"perhaps\"); acknowledge the difficulty of prediction.",
    "Express high confidence (\"I'm certain\", \"definitely\", \"no doubt\"); avoid hedging.",
  "Information (data vs. examples)",
    "Support arguments with statistics, data points, and official figures; no anecdotes.",
    "Support arguments with everyday examples (grocery, rent, gas) as general observations; cite no statistics.",
  "Questions (no vs. yes)",
    "Ask no questions; only make statements and respond to the participant's points.",
    "Include at least one question in each response to engage the participant.",
  "Attitude (affirming vs. challenging)",
    "Find common ground and validate the participant's reasoning while keeping your own view.",
    "Firmly challenge the participant's view: point out flaws, question assumptions, and express disagreement; use no validating language."
)
prompts2_table <- knitr::kable(prompts2, format = "latex", booktabs = TRUE,
                               escape = TRUE, align = c("l", "l", "l"))
prompts2_table <- sub(
  "\\begin{tabular}{lll}",
  "\\begin{tabular}{>{\\raggedright\\arraybackslash}p{2.2cm}>{\\raggedright\\arraybackslash}p{4.25cm}>{\\raggedright\\arraybackslash}p{4.25cm}}",
  prompts2_table,
  fixed = TRUE
)
knitr::asis_output(prompts2_table)
```

### Results

For Model 1 of @tbl-s2, we estimate the preregistered OLS regression
$\text{WoA}_i = b_0 + b_1\,\text{Long}_i + b_2\,\text{High Certainty}_i +
b_3\,\text{Examples}_i + b_4\,\text{Questions}_i +
b_5\,\text{Challenging}_i$. Each coefficient compares the two levels of one factor, holding
the others fixed. Model 2 adds the preregistered covariate, the absolute distance between the participant's
initial forecast and the $`r PRO_S2`\%$ consensus.

```{r}
#| label: tbl-s2
#| tbl-cap: "Study 2. OLS estimates predicting Weight on Advice from the five independently randomized conversational factors. Column 1 includes the five factor indicators; Column 2 additionally controls for the absolute distance between the participant's initial forecast and the professional forecast. Each coefficient compares the right-hand level with the left-hand level in @tbl-prompts2: long versus short, high versus low certainty, examples versus data, questions versus no questions, and challenging versus affirming. Standard errors appear in parentheses."
#| after-caption-space: 0pt
msummary(list("WoA" = m2_main, "WoA (+ distance)" = m2_dist),
  stars = c("*" = .05, "**" = .01, "***" = .001),
  coef_rename = c("Length" = "Length (long)", "Certainty" = "Certainty (high)",
                  "Information" = "Information (examples)", "Questions" = "Questions (yes)",
                  "Attitude" = "Attitude (challenging)",
                  "dist" = sprintf("|Initial − %.1f|", PRO_S2)),
  gof_map = c("nobs", "r.squared"))
```

Of the five features, the chatbot's attitude toward the participant's reasoning had the clearest
effect (see @fig-s2c for a descriptive view). Challenging that reasoning was more persuasive than finding common ground with it (`r a2$full_result$Attitude`). Participants whose chatbot pushed back moved
`r printnum(mean(s2$woa[s2$factor_attitude == "challenge"], na.rm = TRUE) * 100, digits = 0)`% of
the way toward its estimate, compared with
`r printnum(mean(s2$woa[s2$factor_attitude == "affirm"], na.rm = TRUE) * 100, digits = 0)`% of the way when the
chatbot sought common ground with their reasoning while maintaining its own
forecast. Long messages were marginally more persuasive than short messages
(`r a2$full_result$Length`). High certainty was no more persuasive than low certainty
(`r a2$full_result$Certainty`), everyday examples were no more persuasive than data
(`r a2$full_result$Information`), and asking questions was no more persuasive than asking no
questions (`r a2$full_result$Questions`). The estimates are unchanged when controlling
for how far
the participant's initial forecast sat from the consensus (@tbl-s2, Model 2).

```{r}
#| label: fig-s2c
#| fig-cap: "Study 2. Unadjusted mean Weight on Advice at each level of the five conversational factors. Points show means and error bars show 95% confidence intervals. @tbl-s2 reports the corresponding regression-adjusted contrasts and statistical tests."
#| fig-width: 8
#| fig-height: 5.8
s2_level_long <- bind_rows(
  s2 %>% transmute(Label = if_else(Length == 1, "Length: Long", "Length: Short"), woa),
  s2 %>% transmute(Label = if_else(Certainty == 1, "Certainty: High", "Certainty: Low"), woa),
  s2 %>% transmute(Label = if_else(Information == 1, "Information: Examples", "Information: Data"), woa),
  s2 %>% transmute(Label = if_else(Questions == 1, "Questions: Yes", "Questions: No"), woa),
  s2 %>% transmute(Label = if_else(Attitude == 1, "Attitude: Challenging", "Attitude: Affirming"), woa))
level_order <- c("Length: Short", "Length: Long", "Certainty: Low", "Certainty: High",
                 "Information: Data", "Information: Examples", "Questions: No", "Questions: Yes",
                 "Attitude: Affirming", "Attitude: Challenging")
level_positions <- setNames(c(13, 12, 9.8, 8.8, 6.6, 5.6, 3.4, 2.4, .2, -.8),
                            level_order)
s2_level_summary <- s2_level_long %>% group_by(Label) %>%
  summarise(n = sum(!is.na(woa)), mean_woa = mean(woa, na.rm = TRUE),
            h = qt(.975, n - 1) * sd(woa, na.rm = TRUE) / sqrt(n), .groups = "drop") %>%
  mutate(y_position = unname(level_positions[Label]))
p_levels <- ggplot(s2_level_summary, aes(mean_woa, y_position)) +
  geom_errorbarh(aes(xmin = mean_woa - h, xmax = mean_woa + h), height = .16,
                 color = "black") +
  geom_point(size = 2.3, color = "black") +
  geom_text(aes(label = sprintf("%.2f", mean_woa)), vjust = -1.0, size = 3) +
  scale_y_continuous(breaks = unname(level_positions[level_order]), labels = level_order,
                     expand = expansion(add = c(.45, .7))) +
  labs(x = "Mean Weight on Advice", y = NULL) +
  theme_classic(base_size = 10) +
  theme(axis.ticks.x = element_blank())
p_levels
```

```{=latex}
\FloatBarrier
```

```{r}
#| label: s2-manip
#| include: false
# Preregistered manipulation check: did the chatbot follow each instruction? We compare AI
# messages across the two levels of each factor. (Phrase dictionaries mirror, in compact form,
# those used in the preregistered factor definitions.)
chat2 <- readr::read_csv(path_raw("chat_study2_(271657).csv"), show_col_types = FALSE) %>%
  rename(sender_id = participant_id) %>% filter(grepl("^AI-", sender_id))
cm <- chat2 %>%
  inner_join(dplyr::select(s2, session_id, factor_length, factor_certainty, factor_information,
                    factor_questions, factor_attitude), by = "session_id") %>%
  mutate(words = str_count(message, "\\S+"), q = str_count(message, "\\?"),
         cert = str_count(tolower(message), "certain|definitely|clearly|surely|no doubt|confident|undoubtedly"),
         data_ref = str_count(tolower(message), "percent|%|data|statistic|\\brate\\b|index|cpi|report|survey"),
         affirm = str_count(tolower(message), "agree|good point|fair point|understand|makes sense|you're right|valid"),
         chall  = str_count(tolower(message), "however|but |disagree|actually|overlook|consider|mistaken|not quite")) %>%
  group_by(session_id, factor_length, factor_certainty, factor_information, factor_questions, factor_attitude) %>%
  summarise(across(c(words, q, cert, data_ref, affirm, chall), sum), .groups = "drop")
mc <- function(v, g) apa_print(t.test(reformulate(g, response = v), cm))$statistic
```

**Manipulation check.** The chatbot followed its instructions (@fig-s2b). Its messages contained more words in the
long than the short condition (`r mc("words","factor_length")`), more questions when
instructed to ask them (`r mc("q","factor_questions")`), more expressions of certainty in the
high-certainty condition (`r mc("cert","factor_certainty")`), and more references to data
when instructed to cite data rather than examples (`r mc("data_ref","factor_information")`).
When instructed to find common ground with the participant's reasoning, the chatbot used
more affirming and validating language; when instructed to challenge that reasoning, it used
more challenging language (affirmation: `r mc("affirm","factor_attitude")`; challenge:
`r mc("chall","factor_attitude")`).

```{r}
#| label: fig-s2b
#| fig-cap: "Study 2 manipulation checks. Points show condition means; error bars show 95% confidence intervals."
#| fig-width: 8
#| fig-height: 8
suppressWarnings(suppressMessages(library(patchwork)))
mc_plot <- function(data, variable, group, values, labels, panel_title, x_title) {
  z <- data %>%
    transmute(level_raw = .data[[group]], value = .data[[variable]]) %>%
    group_by(level_raw) %>%
    summarise(n = sum(!is.na(value)), m = mean(value, na.rm = TRUE),
              h = qt(.975, n - 1) * sd(value, na.rm = TRUE) / sqrt(n), .groups = "drop") %>%
    mutate(Level = factor(level_raw, levels = rev(values), labels = rev(labels)),
           special_label = variable == "q" & level_raw == "no",
           label_x = if_else(special_label, 1.08 * max(m + h, na.rm = TRUE), m),
           label_hjust = if_else(special_label, 1, .5),
           label = sprintf("%.1f", m))
  ggplot(z, aes(m, Level)) +
    geom_errorbarh(aes(xmin = m - h, xmax = m + h), height = .14,
                   linewidth = .65, color = "#666666") +
    geom_point(size = 2.5, color = "#666666") +
    geom_text(aes(x = label_x, label = label, hjust = label_hjust),
              vjust = -.9, size = 3) +
    scale_x_continuous(limits = c(0, NA), breaks = scales::breaks_pretty(n = 5),
                       labels = scales::label_number(accuracy = 1),
                       expand = expansion(mult = c(0, .12))) +
    scale_y_discrete(expand = expansion(add = c(.45, .65))) +
    labs(title = panel_title, x = x_title, y = NULL) +
    theme_classic(base_size = 10) +
    theme(plot.title = element_text(face = "bold", size = 10),
          axis.title.x = element_text(size = 9), axis.text = element_text(size = 9),
          axis.ticks.x = element_blank())
}

p_words <- mc_plot(cm, "words", "factor_length", c("short", "long"), c("Short", "Long"),
                   "Message Length", "Total Words")
p_questions <- mc_plot(cm, "q", "factor_questions", c("no", "yes"), c("No", "Yes"),
                       "Questions Asked", "Number of Questions")
p_certainty <- mc_plot(cm, "cert", "factor_certainty", c("low", "high"), c("Low", "High"),
                       "Certainty Expressions", "Count of Certainty Phrases")
p_data <- mc_plot(cm, "data_ref", "factor_information", c("examples", "data"), c("Examples", "Data"),
                  "Data References", "Count of Data References")
p_challenge <- mc_plot(cm, "chall", "factor_attitude", c("affirm", "challenge"),
                       c("Affirming", "Challenging"), "Challenging Expressions",
                       "Count of Challenge Phrases")
p_affirm <- mc_plot(cm, "affirm", "factor_attitude", c("affirm", "challenge"),
                    c("Affirming", "Challenging"), "Affirming Expressions",
                    "Count of Affirming Phrases")
p_manip <- (p_words + p_questions) / (p_certainty + p_data) / (p_challenge + p_affirm)
p_manip
```

```{=latex}
\FloatBarrier
```

## Study 3: An Optimized Chatbot and Forecast Uncertainty

Study 3 tests whether the features identified in Study 2 can be combined into a
more persuasive chatbot, benchmarked against both a generic baseline and a control
conversation, and whether a persuasive conversation changes participants' *uncertainty* about
their forecasts. Uncertainty is not a side issue: inflation expectations shape wage, price,
and spending decisions [@Coibion2020; @Weber2022], and how firmly a belief is
held is a distinct dimension of those expectations that a point forecast alone cannot reveal
[@Manski2004; @Engelberg2009]. A conversation that moves point forecasts while leaving
people less sure of them would be a very different instrument from one that moves forecasts
and tightens them.

```{r}
#| label: s3-fit
#| include: false
s3 <- readRDS(path_clean("study3_clean_(297841).Rds"))
stopifnot(CONSENSUS == PRO_S3)
s3 <- s3[!s3$is_ai & s3$pair_status == "AI_PAIR_SUCCESS" & s3$completed_flag, , drop = FALSE]
s3_n <- nrow(s3)
m3_woa  <- lm(woa ~ Baseline + Optimized, s3)
m3_dist <- lm(woa ~ Baseline + Optimized + dist, s3)
m3_sd   <- lm(sd_post ~ Baseline + Optimized + sd_pre, s3)
a3w <- apa_print(m3_woa); a3s <- apa_print(m3_sd)
r_optvb     <- apa_lc(m3_woa, c("Optimized", "Baseline"), c(1, -1))
r_optvb_sd  <- apa_lc(m3_sd,  c("Optimized", "Baseline"), c(1, -1))
r_sd_pre    <- a3s$full_result[["sd_pre"]]
r_dsd       <- apa_print(t.test(s3$sd_post - s3$sd_pre))$full_result
s3_rev <- s3 %>%
  filter(condition %in% c("Control", "Optimized"), !is.na(initial), !is.na(revised)) %>%
  mutate(condition = droplevels(condition), revised_any = revised != initial)
t3_rev <- chisq.test(table(s3_rev$condition, s3_rev$revised_any), correct = FALSE)
r_rev_chi <- sprintf("$\\chi^2(%s, N = %s) = %s$, $p %s$",
                     unname(t3_rev$parameter), nn(nrow(s3_rev)),
                     printnum(unname(t3_rev$statistic)), .pp(t3_rev$p.value))
```

```{r}
#| label: total-sample-guard
#| include: false
# The abstract and the Introduction report the total analyzed sample, but they cannot run
# inline R (the abstract lives in the YAML header, and the Introduction precedes the study
# chunks). The N there is typed by hand; halt rendering if the two ever diverge.
stopifnot("N in the abstract/Introduction no longer matches the data; update both." =
            s1_n + s2_n + s3_n == 3772)
```

### Experimental Design

**Participants.** We ran the study on Prolific in June 2026 with a preregistered target of
1,200 participants and recruited `r nn(s3_n)` who were paired with the chatbot and completed
the survey ($M_{\text{Age}}$ =
`r printnum(mean(suppressWarnings(as.numeric(s3$age)), na.rm = TRUE), digits = 1)`). As
preregistered, the analysis includes all such participants.

**Design and procedure.** The procedure followed Study 2, with participants randomly
assigned in equal proportions to one of three chatbot instructions. The *baseline* prompt simply asked the
chatbot to discuss its inflation forecast, as in Study 1. The *optimized* prompt set the
five factors at the most persuasive levels suggested by Study 2: long messages, high
certainty, everyday examples, asking questions, and a challenging attitude. The *control*
prompt directed the chatbot to hold a friendly conversation about where people get their
information and news, and to steer away from inflation and prices---holding the experience
of chatting with an AI constant while removing its persuasive content. Control participants
still saw the chatbot's estimate and reasoning on the review screen, so the comparison
isolates the effect of the conversation's content. The Appendix reproduces all three prompts.

**Measures.** We again analyze Weight on Advice, with the chatbot's displayed estimate set
three percentage points from the participant's initial forecast in the direction of the
$`r PRO_S3`\%$ consensus, as in Study 2.^[We construct the Study 3 benchmark by
averaging the four median quarterly Core CPI forecasts for 2026 Q2 through 2027 Q1 in the
Philadelphia Fed's 2026 Q2 Survey of Professional Forecasters (3.2%, 2.9%, 2.7%, and 2.7%)
and rounding the result to one decimal.] We additionally elicited each participant's
uncertainty
twice---immediately after the initial forecast and immediately after the revised
forecast---by having them allocate 100 percentage points across seven ranges of inflation
outcomes using draggable bars. The five interior ranges were displayed as adjacent
two-percentage-point intervals (e.g., $0\%$--$2\%$ and $2\%$--$4\%$), with open-ended tails
labeled "Less than $-2\%$" and "More than $8\%$." Taking the
midpoint of each range (treating the two unbounded tails as if they had the same width as the
interior ranges), we compute the standard deviation of each participant's distribution,
yielding a pre-conversation ($\text{SD}_{\text{pre}}$) and post-conversation
($\text{SD}_{\text{post}}$) measure of forecast uncertainty.

### Results

We estimate the preregistered regression $\text{WoA} = b_0 + b_1\,\text{Baseline} +
b_2\,\text{Optimized}$, with the control condition as the reference category (@tbl-s3, Model
1), and a second preregistered model adding the distance of the initial forecast from professional
consensus (Model 2).

```{r}
#| label: tbl-s3
#| tbl-cap: "Study 3. OLS estimates by chatbot condition, with the unrelated-conversation Control as the reference. Column 1 predicts Weight on Advice from the Baseline and Optimized prompts; Column 2 adds the participant's initial distance from the professional forecast; and Column 3 predicts post-conversation forecast uncertainty while controlling for pre-conversation uncertainty. Standard errors appear in parentheses."
#| after-caption-space: 0pt
msummary(list("WoA" = m3_woa, "WoA (+ distance)" = m3_dist, "SD post" = m3_sd),
  stars = c("*" = .05, "**" = .01, "***" = .001),
  coef_rename = c("Baseline" = "Baseline prompt", "Optimized" = "Optimized prompt",
                  "dist" = sprintf("|Initial − %.1f|", PRO_S3), "sd_pre" = "SD pre"),
  gof_map = c("nobs", "r.squared"))
```

```{=latex}
\FloatBarrier
```

The optimized chatbot was the most persuasive. Relative to the control, participants assigned
to the optimized prompt placed substantially more weight on the chatbot's estimate
(`r a3w$full_result$Optimized`), whereas those assigned to the baseline prompt did not
(`r a3w$full_result$Baseline`), consistent with Study 1. As predicted, the
optimized prompt also outperformed the baseline directly (`r printnum(mean(s3$woa[s3$condition == "Optimized"], na.rm = TRUE), digits = 2)` vs.
`r printnum(mean(s3$woa[s3$condition == "Baseline"], na.rm = TRUE), digits = 2)`, `r r_optvb`).
Controlling for the distance between the initial forecast and the consensus leaves these
conclusions unchanged (@tbl-s3, Model 2). In exploratory descriptives, the share of
participants revising their forecast at all rose from
`r printnum(mean(s3$revised[s3$condition == "Control"] != s3$initial[s3$condition == "Control"], na.rm = TRUE) * 100, digits = 0)`%
in the control to
`r printnum(mean(s3$revised[s3$condition == "Optimized"] != s3$initial[s3$condition == "Optimized"], na.rm = TRUE) * 100, digits = 0)`%
under the optimized prompt (`r r_rev_chi`). Combining the features identified in Study 2
produced an incremental persuasive effect relative to the control. The generic prompt did
not.

The conversation also affected how firmly participants held their beliefs. In a regression
of post-conversation uncertainty on prompt conditions, controlling for pre-conversation uncertainty
(`r r_sd_pre`), the baseline prompt did not significantly reduce uncertainty relative to
the control (`r a3s$full_result$Baseline`). By contrast, the optimized prompt significantly
reduced uncertainty relative to both the control (`r a3s$full_result$Optimized`) and the
baseline (`r r_optvb_sd`). Because the baseline conversation also prompted participants to
reflect on and discuss their forecasts, self-reflection alone cannot explain the greater
reduction in uncertainty under the optimized prompt. This difference instead points to the
conversation's content and style. A chatbot
engineered to persuade does not merely relocate the point forecast---it leaves people more
confident in the beliefs they revised toward (@fig-s3).

```{r}
#| label: fig-s3
#| fig-cap: "Study 3 condition means. The left panel shows Weight on Advice for the unrelated-conversation Control, generic Baseline, and Optimized chatbot; higher values indicate greater movement toward the chatbot's estimate. The right panel shows the standard deviation of each participant's subjective inflation distribution before and after the conversation in each condition; lower values indicate less forecast uncertainty. Error bars show 95% confidence intervals."
#| fig-width: 9
#| fig-height: 3.6
suppressWarnings(suppressMessages(library(patchwork)))
w <- s3 %>% filter(!is.na(woa)) %>% group_by(condition) %>%
  summarise(n = n(), m = mean(woa), h = 1.96 * sd(woa) / sqrt(n), .groups = "drop") %>%
  mutate(cond = factor(condition, COND_ORDER), lo = m - h, hi = m + h)
p1 <- ggplot(w, aes(cond, m)) +
  geom_col(width = .64, fill = "#666666") +
  geom_errorbar(aes(ymin = lo, ymax = hi), width = .18, linewidth = .65) +
  geom_text(aes(y = .050, label = sprintf("%.2f", m)), color = "white",
            fontface = "bold", size = 3.2) +
  geom_text(aes(y = .022, label = sprintf("n=%d", n)), color = "white", size = 2.9) +
  scale_y_continuous(expand = expansion(mult = c(0, .08))) +
  labs(x = NULL, y = "Weight on Advice") +
  theme_classic(base_size = 10) +
  theme(axis.ticks.x = element_blank())
u <- s3 %>% dplyr::select(condition, sd_pre, sd_post) %>%
  pivot_longer(c(sd_pre, sd_post), names_to = "ph", values_to = "value") %>%
  filter(!is.na(value)) %>% group_by(condition, ph) %>%
  summarise(n = n(), m = mean(value), h = 1.96 * sd(value) / sqrt(n), .groups = "drop") %>%
  mutate(cond = factor(condition, COND_ORDER),
         ph = factor(ph, c("sd_pre", "sd_post"), labels = c("Pre", "Post")),
         lo = m - h, hi = m + h)
p2 <- ggplot(u, aes(cond, m, fill = ph)) +
  geom_col(position = position_dodge(.7), width = .7) +
  geom_errorbar(aes(ymin = lo, ymax = hi), width = .18, linewidth = .65,
                position = position_dodge(.7)) +
  geom_text(aes(y = .13, label = sprintf("%.2f", m)), color = "white", fontface = "bold",
            size = 3, position = position_dodge(.7)) +
  scale_fill_manual(values = c(Pre = "#3B6FB6", Post = "#4F8F5B"), name = NULL) +
  scale_y_continuous(expand = expansion(mult = c(0, .06))) +
  labs(x = NULL, y = "SD of inflation distribution (pp)") +
  theme_classic(base_size = 10) +
  theme(legend.position = "top", axis.ticks.x = element_blank())
p_study3 <- p1 | p2
p_study3
```

```{=latex}
\FloatBarrier
```

# General Discussion

Across three preregistered experiments, generative-AI chatbots substantially moved household
inflation expectations---beliefs that official communication has long struggled to reach. An
AI partner moved forecasts roughly 45% more than a human partner did, though its influence pulled forecasts away from the professional consensus rather than toward it (Study 1). Generic chat did not add persuasion,
but the chatbot's attitude mattered: participants whose chatbot pushed back moved 31% of the
way toward its estimate, compared with 23% of the way when the chatbot sought common ground (Study 2).
Combining the most persuasive feature levels into an optimized prompt almost doubled the
weight on the chatbot's estimate relative to the generic baseline (39% vs. 23%) and left
participants less uncertain about their revised beliefs (Study 3).

The conversation style mattered for how persuasive the bot was. In Study 1,
generic chat did not increase persuasion beyond showing the AI's forecast and reasoning. In
Study 3, by contrast, the optimized chatbot was substantially more persuasive than the generic
baseline. Because every chatbot condition displayed an estimate and reasoning before a
five-minute exchange, the gain came from the content and style of the conversation, not from
interactivity alone. Human conversations cannot be engineered or standardized in this way.
Chatbot conversations can, and our results show that this design choice matters.

The attitude result has two distinct design implications. First, commercial assistants are
trained through human feedback to be helpful and agreeable, not specifically to correct
beliefs or persuade users. That objective can reward sycophancy---the tendency to accommodate
a user's stated view even when it is mistaken [@Ouyang2022; @Sharma2024].
Study 2 shows the resulting tradeoff: a chatbot instructed to identify weak points, present
counterarguments, and express disagreement was more persuasive than one instructed to find
common ground and validate the participant's reasoning while maintaining its own forecast.
The qualities that make an assistant pleasant and easy to talk to can therefore make it less
effective at correcting beliefs.

Second, a chatbot may be an unusually effective way to deliver disagreement. People avoid
disconfirming information and often respond negatively to opposing views from other people
[@Hart2009; @Golman2017; @Yeomans2020; @Minson2022]. By
contrast, counterattitudinal messages attributed to AI are perceived as less biased, more
informative, and less intent on persuasion than the same messages attributed to people,
increasing receptiveness to them [@Lu2025]. A challenging chatbot may therefore
present arguments that users would resist or avoid in a human conversation.

Our accuracy results temper any optimism that AI influence naturally improves beliefs. In
Study 1, the AI moved forecasts without moving them closer to professional expectations
because its stated estimate was, by design, untethered. Nothing about a language model's
persuasiveness guarantees the direction in which it persuades. A chatbot anchored to
something else---engagement, an operator's interests, or deliberately
seeded misinformation [@Kreps2022; @Goldstein2024]---would move households with
the same efficiency.

The uncertainty results add a second, less obvious dimension. The generic baseline prompt did
not significantly reduce uncertainty relative to the control, whereas the optimized prompt
did. For the economics of
expectations, a point prediction alone does not reveal how firmly a belief is held
[@Manski2004; @Engelberg2009]. A persuasive AI can therefore both relocate and consolidate
expectations. That is an opportunity for anchoring and a mechanism for entrenchment,
depending entirely on what the system argues for.

Several limitations qualify our conclusions and chart a path for future work. First, our
conversations were short, one-shot, and conducted with a single model, GPT-4o; whether
repeated interactions amplify or erode the AI's advantage---and whether the challenge effect
survives familiarity---remains open. Second, our participants were U.S. adults on Prolific, a
comparatively attentive online pool [@Peer2022], and their forecasts were
unincentivized, as household expectations surveys typically are.
Third, our preregistered forecast-error outcome is not yet resolved: the forecast horizon
extends to late 2026, so we cannot yet say whether AI persuasion left households closer to or
farther from realized inflation. Finally, Study 3 validates the optimized *package* rather
than each ingredient: several factor levels were selected based on point estimates that did
not reach significance in Study 2, and the dimensions may interact in a larger study.

Managing inflation expectations has long relied on speeches, projections, and targets that
reach households slowly and imperfectly. Conversations with trained, well-informed people
offer a more direct channel, but such outreach is difficult to scale. Our results show that
conversational AI can substantially shift beliefs, particularly when prompted to use an
effective conversational style. Anchored to the professional consensus, conversational AI
can therefore give central banks a scalable way to align household expectations with
informed forecasts and strengthen the stabilizing effects of monetary policy.

```{=latex}
\clearpage
\bibliography{bibliography}
\clearpage
\appendix
```

# Appendix

## Chatbot Prompts {.unnumbered #sec-chatbot-prompts}

**Baseline prompt (Studies 1--3).** The AI partner received the participant's and its own
forecast, reasoning, and information sources, followed by these guidelines (used in Study 1
and, with the factor modifications below, in Studies 2--3):

> Be conversational and friendly, like a real participant. Actively share your perspective,
> observations, and reasoning rather than only asking questions. Reference specific examples
> from both your sources and the participant's, and draw connections between them. Balance
> sharing your views (60%) with asking about theirs (40%). Explain *why* you hold your
> forecast, citing specific sources, and engage with the participant's sources. Keep
> responses concise but substantive (2--4 sentences). Be respectful, avoid repetition, draw
> on a broad set of factors, and reference everyday observations such as shopping prices,
> rent, wages, and news. Do not use technical economic jargon; write like an everyday
> person, not an economist.

**Study 2 factor modifications.** Each factor appended one instruction, which overrode the
corresponding baseline guidance (@tbl-prompts2).

**Study 3 optimized prompt.** The optimized prompt is the baseline prompt with the most
persuasive level of each factor appended. The added instructions, relative to the baseline
above, are listed below:

```{=latex}
\begin{itemize}\setlength\itemsep{1pt}
  \item Write detailed responses of 5--7 sentences with multiple supporting points. (\textit{length: long})
  \item Express your views with high confidence (``I'm certain'', ``definitely'', ``there's no doubt''); avoid hedging. (\textit{certainty: high})
  \item Support your arguments with concrete everyday examples people experience---grocery prices, rent, gas---described as general observations; do not cite statistics. (\textit{information: examples})
  \item Always include at least one question in each response to engage the participant. (\textit{questions: yes})
  \item Firmly and directly challenge the participant's perspective: identify weak points and inconsistencies, present counterarguments, and express disagreement (``I disagree'', ``I don't think this is right''); use no affirming or validating language. (\textit{attitude: challenging})
\end{itemize}
```

**Study 3 control prompt.** The control chatbot was instructed to discuss information
sources and to avoid the forecast itself:

> You are a participant in a research study having a friendly discussion about where people
> get their information from and why different people may look at different information
> sources.
>
> TOPIC: Information sources and media consumption
>
> - Discuss where people get their news and information (social media, TV, newspapers,
>   podcasts, friends, etc.)
> - Explore why different people might prefer different sources
> - Talk about how accessing different information sources can lead to different views on
>   topics
> - Be curious about where the participant gets their information and why
>
> IMPORTANT RULES:
>
> - Do NOT discuss inflation, economics, or prices specifically
> - If the participant mentions inflation or economics, acknowledge briefly but redirect the
>   conversation to the broader question of information sources and how they shape views
>   generally
> - Focus on the meta-level question of WHY people choose different sources, discuss the
>   information-source choices on non-economic topics
> - Be warm, conversational, and thoughtful
> - When discussing information sources, talk about general patterns and ask about the
>   participant's preferences
> - Keep responses concise but substantive (2-4 sentences typically)
>
> Start by asking where they typically get their news and information from.
