wikillm

Paper · 2024-03-17 · cs.CL, cs.AI

Customized large language models can outperform Community Notes in correcting misinformation

MUSE asks an LLM (GPT-4 in the main setup) for search queries, retrieves web pages from publishers ranked by factuality and bias, extracts refuting and contextual evidence, and writes a reply with source links. Image posts add captions, celebrity labels and OCR. Author-reported: expert-rated overall quality 8.1/10 vs 6.3 for high-helpfulness Community Notes.

Retrieval-augmented generationHallucination mitigationAutomated fact-checkingmisinformationfact-checkingretrievalmultimodalsocial-media

arXivPDFCodeMarkdown15 min read

AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

False claims spread on social media faster than people can check them. A volunteer-written note under a post can help, but such notes often show up hours later, and many posts never get one. This paper asks whether a language model, given live web search, can write a useful correction fast enough to matter.

The system works like a careful research assistant. It reads the post, turns it into a few search questions, and looks up pages. It prefers pages from news and science outlets that are rated as accurate and not strongly slanted. From those pages it pulls the sentences that contradict the post, and sentences that add context. Then it writes a short reply that says what is wrong or misleading and links the sources. Posts with pictures get a text description of the image first, including any names and any words visible in it.

The authors compare these replies with human volunteer notes and with the same language model used without search. Expert fact-checkers preferred the system's replies, and in a survey of readers the corrections made people better at spotting the misleading post. All the results come from the authors' own studies.

TL;DR

MUSE is a training-free pipeline around a prompted LLM. It writes search queries, filters web pages by publisher rating and text or image similarity, extracts refuting and contextual evidence, and writes a reply with source links §Approach fig. 1. Author-reported: 12 fact-checking experts rated its replies 8.1/10 overall against 6.3 for high-helpfulness Community Notes and 5.9 for GPT-4 alone (n=232 responses each) fig. 2 §Results. A survey of 988 U.S. participants found a 10% gain in correct belief that a post was misleading §Results. Read the Paper vs code section before reusing any threshold or stop rule.

Problem

Misinformation is hard to correct on social media. Posts can be multimodal, claims can be partly true, and the corrections must be timely, evidence-based and politically even-handed §Introduction. X's Community Notes is a widely used crowd system with good explanations, but in the authors' February 2023 snapshot 88% of suspicious posts had no note and 93% had no highly rated note in the first hour §Introduction. The authors also argue that static benchmarks can be contaminated by training data and that lexical metrics such as ROUGE cannot judge whether a correction is factual, complete and cites credible sources §Introduction. The authors name these limits: English text and images only, no video, one platform, and dependence on relevant, credible evidence being available online §Discussion.

Method

MUSE has three modules: a prompted LLM for queries and replies, a web retriever with credibility-aware ranking, and a multimodal integrator for image posts §Approach. There are no numbered equations in the paper, and the sections are unnumbered, so citations below name the section. The steps for a text-only post are:

  1. Queries. The LLM writes search queries from the post. The paper says "different queries"; the code asks for three numbered queries, and answers "NONE" when the post is uninformative §Approach prompt_query_generation_unimodal.txt [supp. fig. prompt-query-generation].
  2. Search by publisher tier. Each query is sent to a search engine. Results are grouped into three publisher tiers, High, Medium and Low, derived from Media Bias/Fact Check factuality and bias ratings. The tiers are searched in that order §Approach §Experiments main.py.
  3. Pre-filter. Only the top results per query are kept, then their pages are crawled main.py main.py.
  4. Time filter. Only pages published before the post's time are kept. This simulates a correction written right after the post appeared main.py §Experiments.
  5. Relevance filter. Each page is scored against the post text with a sentence-embedding model, and pages above a threshold are kept §Experiments main.py.
  6. Evidence extraction. The LLM is given one page at a time and quotes at most two paragraphs that explicitly refute the post and at most two that implicitly refute it, meaning context that shows the fuller picture §Approach prompt_evidence_extraction.txt.
  7. Stop rule. The search stops once enough refutation is found. The paper says two pages that refute the claim; the code counts three refuting items §Approach main.py.
  8. Reply. The LLM writes a short reply with the refuting and context facts, each with its URL and date. Facts are meant to be ranked by publisher tier and by relevance §Approach [supp. fig. prompt-response-generation]. If no page refutes the post, the code asks for a reply with no facts main.py.

For a post with images, the paper turns each image into text first. Image captioning output, celebrity labels and OCR are combined into an "informative image description" by the LLM §Approach §Experiments [supp. fig. prompt-image2text]. The web search then also uses reverse image search, and each candidate page is scored on text and on image similarity §Approach fig. 1. The code keeps at most two pages per tier, the best text match and the best image match main.py. A second, text-based search runs if fewer than three refutations are found main.py.

Variants used in the experiments: GPT-4 alone (no retrieval, no vision), a version without vision (MUSE minus vision), and a version without retrieval (MUSE minus retrieval). A Llama 3 70B version and a GPT-5.5 version are reported in the discussion §Experiments §Discussion.

Pseudocode for the text-only path. The paper has no algorithm box, so this is reconstructed from the code and the prose:

Pseudocode
# MUSE, text-only post (reconstructed from code, no paper algorithm)
# Input:  post (text, author, time); no images
# Output: reply text with source links
# [§Approach] [code: model/main.py#L755-L1040]

def correct_text_post(post, top_k):
    # 1. Write 3 search queries; NONE if the post is uninformative
    #    [code: model/main.py#L178-L241]
    queries = llm_queries(post)

    refute_evidence = []
    context_evidence = []
    # 2. Search publisher tiers from most to least credible
    #    [code: model/main.py#L792-L793]
    for tier in ["High", "Medium", "Low"]:
        # 3. Keep the top_k results per query  [code: model/main.py#L799]
        links = search_top_k(queries, tier, top_k)
        # 4. Crawl pages; keep English pages with 100+ words and a date,
        #    published strictly before the post  [code: model/main.py#L445]
        pages = crawl_and_filter_by_time(links, post.time)
        # 5. Keep up to 3 pages whose text score is at least 90
        #    [code: model/main.py#L572-L596]
        pages = filter_by_text_score(post.text, pages, 3, 90)
        for page in pages:
            # 6. Quote up to 2 explicit and 2 implicit refutations
            #    [code: model/main.py#L599-L706]
            refutes, contexts = extract_evidence(post, page)
            refute_evidence += refutes
            context_evidence += contexts
        # 7. Stop after 3 refuting items  [code: model/main.py#L831-L833]
        if len(refute_evidence) >= 3:
            break

    # 8. No refutation: retry once with top_k = 10
    #    [code: model/main.py#L835-L847]
    if not refute_evidence and top_k == 3:
        return correct_text_post(post, 10)

    # 9. Reply with facts only when refutations exist; context is then
    #    included, otherwise the reply uses no facts
    #    [code: model/main.py#L709-L748]
    if refute_evidence:
        return llm_reply(post, refute_evidence + context_evidence)
    return llm_reply(post, [])

Pseudocode for the image-page filter, as implemented in the code:

Pseudocode
# MUSE multimodal page filter  [code: model/main.py#L477-L554]
# Input:  candidate pages of one tier; post text; post images
# Output: at most two pages: best text match and best image match

def multimodal_filter(post, pages):
    # 1. Text score per page: dot product of text embeddings
    #    [code: model/main.py#L500-L521]
    text_scores = []
    for page in pages:
        text_scores.append(dot(embed(post.text), embed(page.text)))
    # 2. Image score per page: DINO cosine between each post image and
    #    the page's lead image, averaged over the post images
    #    [code: model/main.py#L479-L526]
    image_scores = []
    for page in pages:
        image_scores.append(mean_cosine(post.images, page.lead_image))
    kept = []
    # 3. Keep the best text match if its score is at least 95
    #    [code: model/main.py#L531-L543]
    best = argmax(text_scores)
    if text_scores[best] >= 95:
        kept.append(pages[best])
    # 4. Keep the best image match if its score is at least 0.7
    #    [code: model/main.py#L545-L547]
    best = argmax(image_scores)
    if image_scores[best] >= 0.7:
        kept.append(pages[best])
    return kept

Hyperparameters

The paper states few numeric settings. Values from the code are marked as such. Where the paper and code disagree, the Paper vs code section explains which one this card follows.

NameValueWhereNotes
Foundation LLM (main)GPT-4, model alias gpt-4§Experiments main.pyPaper: September 2021 training cutoff assumed §Experiments
Sampling temperature0main.pyApplies to every OpenAI call in the script; the paper does not state it
Request timeout10 smain.pyCode only
Retries per LLM callup to 20, sleep 5 s; returns empty string on failuremain.py main.py main.pyCode only; a failed call gives empty output
Queries per post3prompt_query_generation_unimodal.txtPaper: "different queries", count not given
Results kept per query, first passtop 3main.pyCode only
Results kept per query, retrytop 10main.pyCode only; retry runs only if no refutation was found
Stop rule3 refuting itemsmain.py main.pyPaper: at least two refuting pages §Approach
Max pages per image search5 result pages; stop once more than 10 linksmain.py main.pyCode only
Minimum article length100 words, English, datedmain.pyCode only
Article text sent to LLMfirst 20,000 charactersmain.py main.pyCode only
Text relevance, unimodalkeep up to 3 pages with score ≥ 90main.pyCode only; scale not normalised in code
Text relevance, multimodalkeep best page if score ≥ 95main.pyCode only; scale not normalised in code
Image relevance, multimodalkeep best page if mean cosine ≥ 0.7main.pyCode only; paper gives no value
Text embedding modelmsmarco-distilbert-base-tas-b§Experiments main.pyPaper and code agree
Image embedding modeldino-vitb8§Experiments main.pyPaper and code agree
Relevance calibration100 page–post pairs, top 10 results for 10 held-out posts, zero false positives§ExperimentsPaper; the calibrated thresholds are not stated in it
Publisher tiersHigh, Medium, Low§Experiments main.pyPaper: 118 / 2,123 / 204 publishers; code files have 117 / 2,122 / 203 lines
Publisher rating filterfactuality "very high", "high" or "mostly factual"; bias "least biased", "left-center", "right-center" or "pro-science"§ExperimentsPaper; the code uses the resulting domain lists
OCR confidencekeep lines above 80main.py main.pyCode only; values come from precomputed AWS Textract output
Llama requestmax_tokens 500main.pyCode only; not called by __main__
Post imagesup to 4 per postmain.pyCode comment only; the script reads image lists from model/data/image_url.json main.py
Retrieval threshold for GPT-5.5 relevancecosine 0.1 on text-embedding-3-small§DiscussionPaper; validation F1 0.86
Concurrency5 worker processes; Firefox WebDriver, not set to headlessmain.pyCode only

Results

Author-reported. Setup: 247 X posts (February 2021 to February 2023) with a high- and an average-helpfulness Community Notes response; 12 expert fact-checkers, 10 in the second phase, rating 13 criteria, with overall quality on a 10-point scale; GPT-4 as the primary model; a Prolific study of 988 U.S. participants §Experiments fig. 2. Baselines: high- and average-helpfulness Community Notes written by laypeople, GPT-4 without retrieval or vision §Experiments.

SettingMetricBaselineThis paperSource
All postsOverall correction quality (0–10), mean, SD 2.0, n=2326.3 high-helpfulness notes; 5.9 GPT-4; 5.2 average-helpfulness notes8.1fig. 2a §Results
All postsResponses that explicitly identify and explain inaccuraciesPaper gives relative gains only: 16% over GPT-4, 29% over high notes, 43% over average notes89%§Results fig. 2b
All postsAt least one correct identification and no mistakes80% GPT-4; 72% high notes; 65% average notes91%fig. 2c
All postsAll inaccuracies identified38% GPT-4; 26% high notes; 17% average notes61%fig. 2d
All postsFully accurate explanations47% GPT-4; 55% high notes; 37% average notes70%fig. 2e
All postsInformativeness, meanRelative gains only: 32%, 36%, 65% over the three baselines7.9fig. 2f
All postsRelevance of generated text, meanRelative gains: 18% over GPT-4, 21% over high notes, 43% over average notes8.7fig. 2g
All postsText completely factual45% GPT-4; 59% high notes74%fig. 2h
All postsReference links reachable / relevantGPT-4: 49% page-not-found errors; 76% of reachable links relevantNearly 100% reachable; 96% relevantfig. 2l–m
Posts after GPT-4's assumed cutoffMean quality, n=207Stated as consistently above GPT-4 and high notes8.1 ± 2.0§Results fig. 3a
Posts before cutoffMean quality, n not stated (all posts: n=232)Not stated separately8.1 ± 2.0 on both sets, per the authors§Results fig. 3a
Posts where a fact-check was cited (exclusion test)Mean quality after excluding them—8.0; cited a fact-check for 16% of posts, relied solely on one for 6%§Results
AblationQuality vs no retrieval / vs no visionPaper gives relative gains: 25% and 33%—§Results [supp. fig. impact-retrieval-and-vision]
Correction timingQuality if started at posting / at 13 h / at 16 h—8.1 ± 2.0 in all three§Results
Reader study, 988 participantsMean correct belief that the post is misleading4.5 before4.9 after (+10%, d = 0.3, p = 0.0001)fig. 4a §Results
Reader studyTrustworthiness, mean4.6 average-helpfulness notes4.9 (p = 0.004)§Results fig. 4c
Reader studySource disclosure (human or AI)—No significant effect on trust or sharing; withholding source raised correct belief by 8%§Results fig. 4d–f
GPT-5.5 without MUSE's pipelineReference hallucination rate70% of links reachable; 43% hallucinated2% hallucinated for MUSE§Discussion
Cost and latencyPer post, authors' estimate—About 0.2 USD; about 2 minutes on an M1 CPU with 16 GB§Discussion

Expert agreement, measured with weighted Cohen's κ, is in §Experiments. Reference reachability reaches 0.79, four criteria (overall quality among them) fall between 0.41 and 0.51, and the remaining scored criteria fall between 0.28 and 0.40. Llama 3 70B was reported as qualitatively comparable to GPT-4 §Discussion [supp. fig. impact-foundation-llm].

Paper vs code

The paper's acknowledgements link the repository as the study's code and data, so it is treated as the official one §Acknowledgements. It is Apache-2.0 and was cloned at 94662ccf546abbbece52c6b608f730fb2c4e0301. The code is a single script, model/main.py, with prompts and lists under model/data/ main.py. Differences:

  • Stop rule. The paper stops after two refuting pages §Approach. The code stops after three refuting evidence items, not pages main.py main.py.
  • Evidence order is lost. The paper and the reply prompt both say evidence should be ranked by publisher tier and relevance, and facts at the top should be used first §Approach [supp. fig. prompt-response-generation]. The code collects evidence into Python sets and passes them on as list(set(...)). The order is then arbitrary and can change between runs main.py main.py.
  • Multimodal filter. The paper describes relevance scoring that removes irrelevant pages §Approach. The code keeps at most two pages per tier, the single best text match and the single best image match main.py.
  • Image captions. The paper says BLIP-2, Rekognition and Textract outputs are turned into descriptions by the LLM §Experiments. The script does not run those models. It reads precomputed JSON files main.py main.py main.py. It also runs a GPT-4 step that revises the caption against the post and against the OCR text, which the paper does not describe main.py. When there is no OCR and no celebrity label, the code uses a fixed "A photo of" prefix without the LLM main.py.
  • Celebrity labels. A label is kept only if the name appears in the post text or in the OCR output main.py. The paper does not describe this filter.
  • Image relevance. The paper says "visual content" §Experiments. The code compares each post image with the page's lead image only main.py main.py.
  • Fallback search. The paper does not describe the code's fallback to a text search and a reverse-image search for image posts with too few refutations main.py.
  • Retry with more results. The code repeats the unimodal search with top 10 results when nothing refutes the post main.py. The paper's "exhausting all credible pages" is not the same rule.
  • Search engines. The paper says "Google Search". The code uses the Google Programmable Search JSON API for text main.py and SerpApi's Google reverse-image engine for images main.py.
  • Time filter. The paper's temporal matching uses pages published up to 30 minutes before each Community Notes response §Experiments. That matching is not in main.py. The script keeps only pages published strictly before the post main.py.
  • Llama model ID. The client is created for meta-llama/Meta-Llama-3.1-70B-Instruct but the request names meta-llama/Meta-Llama-3-70B-Instruct main.py main.py. The Llama function is not called by the script's __main__.
  • Query prompt. The code's query prompt asks for exactly three queries. The paper says "different queries" §Approach prompt_query_generation_unimodal.txt.
  • Context dropped. When there are no refutations, the code passes no facts to the reply prompt, so context-only evidence is discarded main.py.
  • Data shipped. The repository releases tweet IDs only, as the README says, so the script needs the tweet content and image URLs obtained separately README.md. It also needs an OpenAI key, a SerpApi key and a Google Custom Search key, read from a keys file main.py. The eval folder ships the Community Notes data and the expert ratings README.md.
  • Figures and supplement. The paper's figure and supplement labels such as "Supp. Fig." are cited here by caption title rather than by number, because the supplement numbering was not verified against a compiled PDF.

No official code.

Pitfalls

  • Rule choices hidden in code. Thresholds of 90, 95 and 0.7 and the top-3 and top-10 limits are only in the code main.py main.py main.py main.py. The paper describes calibrating its relevance thresholds on 100 pairs but gives no resulting values §Experiments. The text scores are raw dot products, not normalised similarities, so a threshold of 90 or 95 means something only for the embedding scale it was tuned on. Check that scale before reusing these values.
  • Set-based evidence. Because evidence goes through sets, two runs on the same post can use facts in different orders, so the reply prompt's request to use the facts listed first cannot be met main.py.
  • Refutation counted as items. A refutation count of 3 can come from one long page or from three pages. The paper's "two pages" rule is not reproduced by the code main.py.
  • LLM failure is silent. After 20 failed calls the helper returns an empty string, and the evidence parser then returns no evidence, with no error main.py main.py. A failed run looks like a post with no refutation.
  • Parser fragility. The evidence parser keeps only lines that start with a dash and skips any line containing the word "NONE" anywhere, including inside a quoted sentence main.py main.py. A quote that contains "none" is dropped.
  • Model alias. The code asks for gpt-4, a moving alias, not a dated snapshot main.py. The paper's contamination analysis relies on GPT-4's assumed September 2021 cutoff §Results. Pin a snapshot before any reproduction, and rerun the contamination split if the model changes.
  • Temperature and sampling. All OpenAI calls use temperature 0 in the code main.py, but the paper does not say so. Expect output drift between model versions even at temperature 0.
  • Cost is not in the code. The cost estimate (about 0.2 USD per post) and the two-minute latency are the authors' figures §Discussion; the repository has no cost accounting. The code makes many LLM calls per post: captions, queries, one evidence call per page, and the reply. It also crawls many pages in a Firefox WebDriver with a 10-second page-load timeout main.py.
  • Crawl quality. Pages must have at least 100 words and a publication date, and duplicate text is dropped. Pages without a parsed date are removed silently main.py.
  • Image relevance is one page. The image score uses the page's single lead image. If the image cannot be fetched or decoded, the score is -1 and the page cannot pass the image test main.py main.py.
  • Results are self-reported. The expert study used 12 experts, of whom 10 completed the second phase, and 247 posts from X's Community Notes. Agreement was only fair for most criteria §Experiments.
  • Information voids. The authors say they did not systematically evaluate detection of information voids or abstention, so the system's behaviour on breaking news with little evidence is not measured §Discussion.
  • Scope. English text and images only, no video, and one platform §Discussion. The paper's expert and reader results do not show performance on other languages or platforms.

Lineage

  • Builds on: X Community Notes, the crowd fact-checking system that supplies the baselines and the evaluation posts §Introduction §Experiments. No card exists for it.
  • Uses: the MBFC ratings for publisher tiers §Experiments; msmarco-distilbert-base-tas-b and dino-vitb8 for relevance §Experiments; BLIP-2 for captions §Experiments.
  • Compared against: GPT-4 alone, MUSE without retrieval, MUSE without vision, high- and average-helpfulness lay responses, GPT-5.5 and Llama 3 70B §Experiments §Discussion.
  • Superseded by: not known from content in this wiki.

Source and license

Adapted from “Customized large language models can outperform Community Notes in correcting misinformation” by Xinyi Zhou, Ashish Sharma, Amy X. Zhang, Tim Althoff (arXiv:2403.11169), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors. Code citations refer to https://github.com/Social-Futures-Lab/MUSE at commit 94662ccf546a (Apache-2.0). Any quoted code is shown under that license.