Improving Local Search with Multimodal LLMs and Vector Search

offerup · E-commerce · 2025 · source Agentic: no · promotional bias: high · source-backed · extracted with prompt 0.5.6 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Marketplace search relevance with multimodal vector retrieval

OfferUp's keyword-based Elasticsearch search could surface broad inventory, but it could not understand query context, synonyms, visual similarity, or multi-concept intent well enough for local marketplace discovery. The team needed to modernize search with multimodal semantic retrieval while preserving high throughput, low latency, local relevance, and measurable business outcomes.

Constraints:

Architecture

OfferUp transformed its search pipeline from lexical BM25 search to multimodal vector search using Amazon Titan Multimodal Embeddings G1 and Amazon OpenSearch Service. New and updated listings still flow through S3 uploads, posting and writer microservices, DynamoDB, SNS, SQS, and a Lambda indexer; the new indexer path retrieves images, base64-encodes them, sends listing data to OpenSearch, and uses an OpenSearch ingest pipeline with a Bedrock connector to call Titan and store image/description embeddings. Query-time neural search sends text or image queries through the same Titan embedding model, then OpenSearch performs k-NN retrieval over vectors. A/B tests and production-data relevance experiments guided rollout, including choosing k=128 and initially backfilling 12 million listings in three high-density DMAs.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  OfferUp_user["OfferUp user"] --> Amazon_S3["Amazon S3"]
  OfferUp_user --> Posting_microservice["Posting microservice"]
  Posting_microservice --> Listing_writer_microservice["Listing writer microservice"]
  Listing_writer_microservice --> Amazon_DynamoDB["Amazon DynamoDB"]
  Listing_writer_microservice --> Amazon_SNS["Amazon SNS"]
  Amazon_SNS --> Amazon_SQS["Amazon SQS"]
  Amazon_SQS --> Lambda_indexer["Lambda indexer"]
  Amazon_DynamoDB --> Listing_reader_microservice["Listing reader microservice"]
  Listing_reader_microservice --> Lambda_indexer
  Amazon_S3 --> Image_microservice["Image microservice"]
  Image_microservice --> Lambda_indexer
  Lambda_indexer --> Amazon_OpenSearch_Service["Amazon OpenSearch Service"]
  Amazon_OpenSearch_Service --> OpenSearch_ingest_pipeline["OpenSearch ingest pipeline"]
  OpenSearch_ingest_pipeline --> Bedrock_connector["Bedrock connector"]
  Bedrock_connector --> Amazon_Titan_Multimodal_Embeddings["Amazon Titan Multimodal Embeddings"]
  Amazon_Titan_Multimodal_Embeddings --> Amazon_OpenSearch_Service
  OfferUp_user --> Search_microservice["Search microservice"]
  Search_microservice --> Neural_search_pipeline["Neural search pipeline"]
  Neural_search_pipeline --> Amazon_Titan_Multimodal_Embeddings
  Neural_search_pipeline --> k_NN_retrieval["k-NN retrieval"]
  k_NN_retrieval --> Amazon_OpenSearch_Service
  Search_microservice --> A_B_testing["A/B testing"]
  A_B_testing --> Business_metrics["Business metrics"]
  A_B_testing --> Technical_relevance_metrics["Technical relevance metrics"]
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
OfferUp user Creates listings and performs text or image searches. Posting microservice, Search microservice, Amazon S3
Amazon S3 Stores listing images uploaded through signed URLs. OfferUp user, Image microservice
Posting microservice Receives listing title, description, and image IDs. OfferUp user, Listing writer microservice
Listing writer microservice Persists listing changes and publishes change events. Posting microservice, Amazon DynamoDB, Amazon SNS
Amazon DynamoDB Stores listing details read by downstream indexing components. Listing writer microservice, Listing reader microservice
Amazon SNS Publishes listing-change events. Listing writer microservice, Amazon SQS
Amazon SQS Queues listing updates for indexing. Amazon SNS, Lambda indexer
Lambda indexer Polls listing updates, retrieves full details and images, and sends documents to OpenSearch. Amazon SQS, Listing reader microservice, Image microservice, Amazon OpenSearch Service
Listing reader microservice Fetches full listing details from DynamoDB for the indexer. Amazon DynamoDB, Lambda indexer
Image microservice Retrieves listing images and encodes them in base64 for embedding. Amazon S3, Lambda indexer
Amazon OpenSearch Service Stores listing data, vectors, metadata, and serves neural/k-NN search. Lambda indexer, OpenSearch ingest pipeline, Neural search pipeline, Search microservice
OpenSearch ingest pipeline Processes listing data and invokes Bedrock to create multimodal embeddings. Amazon OpenSearch Service, Bedrock connector
Bedrock connector Allows OpenSearch to call Amazon Bedrock Titan embeddings. OpenSearch ingest pipeline, Amazon Titan Multimodal Embeddings
Amazon Titan Multimodal Embeddings Embeds images and text into the same semantic vector space. Bedrock connector, Neural search pipeline, Amazon OpenSearch Service
Neural search pipeline Converts search text/images into vectors and performs vector search. Search microservice, Amazon Titan Multimodal Embeddings, k-NN retrieval
k-NN retrieval Finds listings whose embeddings are nearest to the query vector. Neural search pipeline, Amazon OpenSearch Service
A/B testing Compares keyword-search control groups with multimodal-search variants. Search microservice, Business metrics, Technical relevance metrics
Business metrics Tracks user engagement, EWSR, search depth, fanout searches, and ad impressions. A/B testing
Technical relevance metrics Measures relevance recall on production data for top-k results across DMAs. A/B testing

Data flow

When users create or update listings, images go to S3 and listing metadata flows through the posting microservice, listing writer, DynamoDB, SNS, SQS, and Lambda indexer. The indexer retrieves the full listing and encoded images, then OpenSearch invokes the Bedrock connector so Titan Multimodal Embeddings creates vectors for images and descriptions. At query time, the search microservice forwards text or image searches to OpenSearch neural search, which embeds the query with the same Titan model and uses k-NN to retrieve similar listings. A/B tests compare the multimodal variant against keyword-search control groups.

3 supporting quotes
“As an OfferUp user creates or updates a listing, any new images are uploaded directly to Amazon Simple Storage Service (Amazon S3) using signed upload URLs.”article, stated
“An OpenSearch Ingest pipeline invokes the OpenSearch connector for Amazon Bedrock. The Titan Multimodal Embeddings model generates multi-dimensional vector embeddings”article, stated
“The neural search pipeline forwards each search request to the same Amazon Titan Multimodal Embeddings model to convert the text and images into multi-dimensional vector embeddings.”article, stated

Why this architecture

The architecture preserves OfferUp's proven listing-event pipeline while adding multimodal embeddings at indexing and query time. Titan gives a shared semantic space for text and images, OpenSearch supplies managed vector search and neural-search pipelines, and A/B testing keeps business and technical relevance improvements measurable before wider rollout.

3 supporting quotes
“OfferUp selected Amazon Titan Multimodal Embeddings and Amazon OpenSearch Service for their fully managed services”article, stated
“It translates the input image or text into an embedding that contains the semantic meaning of both the image and text in the same semantic space.”article, stated
“The A/B testing methodology provided robust comparison between the old and new systems.”summary, stated

Models used: Amazon Titan Multimodal Embeddings G1 · amazon.titan-embed-image-v1 · BM25 keyword ranking baseline

Scale

— article, stated

Alternatives considered (roads not taken)

Continue BM25 lexical keyword search

Rejected because: Keyword search missed context, synonyms, and multi-concept query intent.

“Previously, OfferUp’s search engine was built with Elasticsearch (v7.10) on Amazon Elastic Compute Cloud (Amazon EC2), using a keyword search algorithm”article, stated
“Keyword search, which uses BM25 as a ranking algorithm, lacks the ability to understand semantic relationships between words”article, stated

Pure text retrieval

Rejected because: Marketplace listings include images, and Titan embeds both text and images into a common semantic space.

“This model is used for use cases like searching images by text, by image, or by a combination of text and image for similarity and personalization.”article, stated
“It translates the input image or text into an embedding that contains the semantic meaning of both the image and text in the same semantic space.”article, stated

Immediate global rollout

Rejected because: OfferUp phased the launch through high-density DMAs and A/B testing.

“OfferUp adopted a three-step process to implement multimodal search functionality into their foundational search architecture.”article, stated
“identified three business-critical high-density locations where multimodal search solutions demonstrated promising results in offline experiments”article, stated

Use arbitrary k-NN result depth

Rejected because: A/B tests showed k=128 balanced search result quality with compute resources.

“After extensive A/B testing with various k values, OfferUp found that a k value of 128 delivers the best search results while optimizing compute resources.”article, stated

Patterns

rag-retrieval (retrieval)

OfferUp retrieves marketplace listings by embedding text and image queries and searching nearest listing vectors in OpenSearch.

“The neural search pipeline forwards each search request to the same Amazon Titan Multimodal Embeddings model to convert the text and images into multi-dimensional vector embeddings.”article, stated
“OpenSearch Service then uses the vectors to find the k-nearest neighbors (KNN) to the vectorized search term and image to retrieve the relevant listings.”article, stated

retrieval-ranking (retrieval)

The search stack tunes k-NN result depth and measures relevance recall to improve ranked local results.

“After extensive A/B testing with various k values, OfferUp found that a k value of 128 delivers the best search results”article, stated
“relevance recall (RR)= sum(listing relevance score) / number of retrieved listings”article, stated

batch-offline-processing (data)

OfferUp backfilled active listings into multimodal vectors before rollout.

“Backfilling converts an image of every active listing into vectors using Amazon Titan Multimodal Embeddings and stores that in OpenSearch Service.”article, stated
“In the first phase, OfferUp backfilled 12 million active listings.”article, stated

eval-driven-development (quality)

Offline experiments, A/B tests, business metrics, and relevance-recall calculations determined rollout and parameter choices.

“OfferUp evaluated the impact of multimodal search through A/B testing to manage traffic control and user experiment variations.”article, stated
“OfferUp conducted additional experiments to assess technical metrics, utilizing 6 months of production system data”article, stated

latency-optimization (operations)

The team chose managed OpenSearch vector search and tuned k=128 to balance quality with compute resources and fast responses.

“meeting the high throughput and latency requirements.”article, stated
“a k value of 128 delivers the best search results while optimizing compute resources.”article, stated

Tradeoffs

Managed multimodal search stack

Chose Amazon Titan Multimodal Embeddings plus Amazon OpenSearch Service over self-managed vector infrastructure.

Rationale: Managed services simplified deployment and operation while meeting throughput and latency needs, at the cost of AWS dependency.

“selected Amazon Titan Multimodal Embeddings and Amazon OpenSearch Service for their fully managed services”article, stated
“This choice also simplifies the deployment and operation of large-scale search capabilities on the OfferUp app”article, stated

Multimodal semantic retrieval

Chose text and image embeddings in one semantic space over lexical search over listing text only.

Rationale: Marketplace listings rely on both image and text semantics, and embeddings improve context and similarity beyond keywords.

“It translates the input image or text into an embedding that contains the semantic meaning of both the image and text in the same semantic space.”article, stated
“By comparing embeddings, the model produces more relevant and contextual responses than keyword matching alone.”article, stated

Phased DMA rollout

Chose start with three high-density business-critical locations over full-market rollout.

Rationale: Offline experiments identified promising markets and A/B testing controlled risk.

“identified three business-critical high-density locations where multimodal search solutions demonstrated promising results in offline experiments”article, stated
“OfferUp evaluated the impact of multimodal search through A/B testing to manage traffic control and user experiment variations.”article, stated

k-NN depth

Chose k=128 over untuned default k values.

Rationale: A/B testing found k=128 delivered the best results while managing compute resources.

“a k value of 128 delivers the best search results while optimizing compute resources.”article, stated

Gotchas (what bit them)

Keyword search could not infer semantic context.

Root cause: BM25/keyword search treated terms lexically and could not distinguish intent across contexts.

Resolution: Embed text and images into a shared semantic vector space and retrieve by vector similarity.

“Keyword searches don’t account for the context in which a term is used.”article, stated
“By comparing embeddings, the model produces more relevant and contextual responses than keyword matching alone.”article, stated

Synonyms and adjacent product terms were missed or overmatched.

Root cause: Lexical search lacked semantic awareness of word relationships and product variations.

Resolution: Use multimodal embeddings and vector similarity rather than exact keyword matching alone.

“searching for “car” might not return results for “sedan”. Similarly, searching for iPhone 11 can return results for iPhone 10 and iPhone 12.”article, stated
“lacks the ability to understand semantic relationships between words, often missing semantically relevant results if they don’t contain exact keywords.”article, stated

Complex multi-concept queries produced partial matches.

Root cause: The foundational search treated keywords independently rather than modeling combined intent.

Resolution: Use Titan multimodal embeddings and neural search to represent query meaning.

“complex, multi-concept queries like “red running shoes,” often returning results that included shoes in other colors or footwear not designed for running.”article, stated
“Neural search transforms text and images into vectors and facilitates vector search both at ingestion time and at search time.”article, stated

Vector search quality depended on k and compute cost.

Root cause: Higher or lower k values change result quality and resource use.

Resolution: Run extensive A/B tests and select k=128.

“After extensive A/B testing with various k values, OfferUp found that a k value of 128 delivers the best search results while optimizing compute resources.”article, stated

Large-scale listing backfill had to precede useful search coverage.

Root cause: Active listings needed image vectors stored in OpenSearch before the new query path could retrieve them.

Resolution: Backfill active listing images into Titan embeddings and OpenSearch before rollout.

“Backfilling converts an image of every active listing into vectors using Amazon Titan Multimodal Embeddings and stores that in OpenSearch Service.”article, stated
“In the first phase, OfferUp backfilled 12 million active listings.”article, stated

Evaluation

OfferUp evaluated multimodal search with A/B tests comparing keyword-search control groups against multimodal variants, tracked business metrics such as engagement and EWSR, and used six months of production data to measure relevance recall on top k=10 results across high- and low-density DMAs.

Metrics: relevance recall improved 27% · geographic spread reduced 54% · user engagement increased 2.2% · EWSR improved 3.8% · search depth grew 6.5% · fanout searches decreased 54.2% · ad impressions rose 0.91% · top-k relevance recall used k=10 · k-NN search selected k=128

4 supporting quotes
“OfferUp found that multimodal search improved relevance recall by 27%, reduced geographic spread (which means more local results) by 54%, and grew search depth by 6.5%.”article, stated
“User engagement increased by 2.2%, and EWSR saw a 3.8% improvement, highlighting enhanced relevance in search outcomes”article, stated
“the need for fanout searches (broader search queries) decreased by 54.2%, showing that more users found relevant local results quickly”article, stated
“utilizing 6 months of production system data to examine relevance recall with a focus on the top k=10 most relevant results”article, stated

Outcomes

This is an AWS co-written case study, so vendor-service framing and metrics should be treated as reported by OfferUp/AWS. The architecture itself is detailed enough to extract reusable production patterns for multimodal retrieval, vector indexing, phased rollout, and A/B evaluation.

4 supporting quotes
“The results of the multimodal search implementation were compelling.”article, stated
“User engagement increased by 2.2%, and EWSR saw a 3.8% improvement”article, stated
“Backfilling converts an image of every active listing into vectors using Amazon Titan Multimodal Embeddings”article, stated
“we demonstrated how OfferUp transformed its foundational search architecture using Amazon Titan Multimodal Embeddings and OpenSearch Service”article, stated