Most production travel apps should use both, but for different jobs. Use live provider APIs and retrieval at request time for facts that may have changed, such as prices, availability, opening hours, weather, disruptions, entry rules, and supplier restrictions. RAG retrieves approved documents or records for the model to use in an answer. A live API call is not technically RAG, but it serves the same safety goal: the model receives current evidence instead of relying on what may be stored in its weights.
Fine-tuning is useful when the problem is stable behavior, such as recognizing trip-planning intents, selecting among a small set of tools, producing a consistent tone, or reliably emitting an itinerary schema. It is a poor store for volatile facts. A fine-tuned model can still state an old price or a withdrawn visa rule with confidence, and retraining is neither a timely nor an auditable update path. Model-provider tooling supports calling application-defined functions to access data outside training data and return structured results to the model (OpenAI function-calling guide).
Start with a prompt, strict structured output, a small approved knowledge base, and narrowly scoped live tools. Add fine-tuning only when evaluation shows a repeatable behavior gap that retrieval, schema constraints, and prompt changes do not fix. For example, a weekend-plan app can retrieve its editorial neighborhood guide, call live flight, hotel, weather, place-hours, and advisory tools, then return an itinerary with an as-of time and a source beside every changeable claim.
First separate knowledge from live facts
The term RAG, short for retrieval-augmented generation, describes a system that retrieves relevant material and gives it to a language model while it generates an answer. In a travel product, that material might be an approved destination guide, hotel policy, airline baggage policy, editorial accessibility note, or a record from the app's own catalog. Retrieval is valuable because the app can control which source version was used and show the reader where a statement came from.
Some travel information is not a document-retrieval problem. It is a transaction or a fresh query. The app must ask a provider for the current result, then treat that result as time-bound evidence. A model should never invent a booking price, inventory count, seat, cancellation term, weather forecast, local opening hour, route disruption, visa eligibility, or travel restriction because a tool is unavailable or a retrieval result is old.
| Kind of information | Preferred source path | Why model weights are insufficient | What the user should see |
|---|---|---|---|
| Flight or rail fares, availability, fare rules, hotel inventory | Authorized supplier or aggregator API, then a booking or quote flow | Inventory and conditions can change between search and checkout | Provider, currency, search time, fare conditions, and a new confirmation step before purchase |
| Place opening hours, temporary closure, accessibility details | Place provider or the venue's own source, queried near use time | Regular hours do not capture special dates, moves, or temporary changes | Place identity, local time zone, source, fetched time, and any exceptional-hours warning |
| Weather and weather-sensitive activity advice | Forecast provider API with location, forecast issue time, and forecast period | Forecasts are revised and uncertainty grows with time | Forecast source, retrieved time, local date, and a clear distinction between forecast and observation |
| Disruptions, alerts, strikes, and closures | Operator, airport, rail, road, government, or destination authority source | These events are temporary and may be geographically specific | Source, alert timestamp, affected service or area, and a link for current status |
| Visa, entry, health, and local restrictions | Destination government or embassy source relevant to the traveller's nationality and trip purpose | Requirements can depend on passport, residency, purpose, connection, prior travel, and current policy | Exact official source, checked time, assumptions, and wording that does not promise eligibility |
| Stable destination writing, packing guidance, and product policies | Curated, versioned editorial or supplier knowledge base | Stable material can still need a source and revision history | Citation, publication or revision date, and scope |
Google's current Places API, for example, distinguishes regular opening hours from current opening hours. Its current-hours field covers the next seven days and can include exceptional days, which illustrates why a travel app should record the query time and not turn an hours response into a permanent model fact (Google Places reference). Weather APIs have a comparable limitation: Open-Meteo documents that current conditions are based on recent model data and that forecasts are updated as new model runs arrive (Open-Meteo Forecast API). A product may use other providers, but the principle remains the same.
The right job for each technique
RAG, live tools, prompting, and fine-tuning are complementary. Choosing one does not remove the need to evaluate the others.
| Technique | Best job | Good travel-app example | Not a good substitute for |
|---|---|---|---|
| Retrieval from a curated knowledge base | Bring approved, traceable, relatively stable information into the answer | Retrieve a versioned airline carry-on policy and a destination accessibility guide | A real-time price quote, inventory check, or a legal eligibility determination |
| Live tool or API call | Obtain current state or execute a controlled action | Search current flight offers, check hotel availability, obtain a weather forecast, or look up a venue's current hours | Long-form product style, explanation quality, or an undocumented policy interpretation |
| Prompt and schema constraints | Set instructions, format, constraints, and abstention behavior quickly | Tell the model to cite each volatile claim, ask one clarifying question, and return a defined itinerary object | Repeated capability gaps caused by too little reliable training signal |
| Fine-tuning | Make recurring stable behavior more reliable or efficient after measurement | Classify intent, normalize short preference text, select an appropriate tool from a stable toolset, or write in a consistent brand voice | Refreshing changing facts or bypassing provider access and citations |
This table suggests a practical default: data first, behavior second. Put truth claims in source systems, retrieval indexes, or live APIs. Put the app's desired behavior in prompts and schemas first. Fine-tune only after the team can state the measurable behavior it wants to improve and has a clean, representative training and held-out evaluation set.
Fine-tuning is not automatically more reliable than prompting. It adds a dataset, a training process, a model version, and a monitoring obligation. It can be worthwhile when thousands of real, reviewed examples expose a stable pattern that prompts miss, or when the same constrained behavior is requested so often that lower prompt overhead or more consistent outputs has material value. Current OpenAI documentation describes model optimization as an iterative process and exposes separate training and validation inputs for fine-tuning jobs (OpenAI model optimization guide, fine-tuning API reference). Provider names and supported models change, so treat this as a design rule rather than a product-specific capability claim.
Build the answer around evidence and time
Every fact should carry enough metadata for the application, not the language model alone, to decide whether it can be used. At minimum, return this envelope with every retrieved document or tool response:
| Field | Purpose |
|---|---|
source_id and canonical URL |
Link a statement to an identifiable supplier, government, or approved document |
retrieved_at |
Shows when the application obtained the evidence |
effective_from and effective_to when supplied |
Prevents a future or expired rule from being presented as current |
expires_at or TTL |
Tells the application when it must re-query rather than reuse a cached response |
locale, currency, and time zone |
Prevents silent errors caused by location or date interpretation |
provider_version or document revision |
Makes investigation and re-evaluation possible after an update |
filters_applied |
Shows constraints such as origin, dates, passenger count, cabin, cancellation policy, or accessibility preference |
confidence or status |
Represents provider states such as unavailable, provisional, stale, or incomplete without asking the model to guess |
TTL, or time to live, is a cache policy chosen for a fact type and risk level. A flight-shopping result might expire very quickly, while a versioned museum history article can be retained much longer. Do not assign one universal TTL. Instead, use the supplier's terms and semantics, the user's trip date, the cost of a stale answer, and the provider's update cadence. Cache must never obscure the result's original retrieval time.
Retrieval requires filters as well as semantic similarity. A passage about a baggage allowance should be filtered by airline, fare family, route or region if applicable, cabin, travel date, and document version. A visa result needs traveller-specific inputs, such as passport nationality, residency where relevant, destination, transit points, intended purpose, and arrival date. If the user has not given an essential input, the app should ask for it or state that it cannot determine the answer.
Resolve conflicts before the model writes
Retrieval cannot turn conflicting sources into a reliable single answer by asking the model to choose the more fluent sentence. Define source precedence in application code.
- Prefer the official source that controls the fact. For example, use the airline or booking provider for fare conditions, the operator for a service disruption, a venue for an event cancellation, and the destination's official authority for entry rules.
- Prefer a more specific record over a general one when both are current and applicable. A flight-specific notice is more relevant than a generic airline policy.
- Reject records outside their effective window, without a required filter value, or past their TTL. Preserve them for audit if permitted, but do not use them as a current answer.
- If equally authoritative sources conflict, present the conflict and the exact sources or route the user to confirmation. Do not merge the two into a fabricated compromise.
- If the app has no current evidence, say what is missing. Offer a safe next action, such as a link to the official authority or a new search, rather than filling the gap with model memory.
Government travel information requires particular restraint. The U.S. Department of State publishes travel advisories and links to international travel guidance, but the relevant authority for entry permission is generally the destination government's immigration authority and the answer depends on the traveller's circumstances (U.S. State Department travel advisories). A travel app can summarize an official source with timestamps and assumptions. It should not provide legal advice, state that a person will be admitted, or allow a generated summary to replace the official application process.
A production flow for travel planning
The model should coordinate a bounded workflow, not become the data store or the final authority.
- Parse the request. Extract dates, origin, destination, traveller count, budget, pace, interests, mobility or dietary preferences, passport information only if the user chooses to provide it, and the user's goal. Request the minimum missing detail needed for a useful search.
- Choose approved tools. The application exposes narrowly scoped read tools, such as
search_flights,search_hotels,get_weather,get_place_hours,get_disruption_alerts,get_entry_guidance, andretrieve_editorial_guide. A language model may request a tool, but application code validates its arguments, applies authorization and rate limits, and executes the call. - Collect evidence. Each tool returns typed records plus source URLs, timestamps, TTLs, locale, filters, and status. The application deduplicates records, applies source precedence, and keeps an audit log of calls and results.
- Generate a structured plan. Give the model only the approved records and a schema that supports an itinerary, assumptions, citations, price or availability as-of times, uncertainty, and omitted information. Current function-calling documentation describes the multi-step pattern in which the application executes a model-requested tool and returns the tool output to the model (OpenAI function-calling guide).
- Validate before display. Check that every volatile claim has supporting evidence, every cited source matches its claim, time windows are valid, currencies and time zones are coherent, and no booking action occurs without explicit user confirmation. A schema-valid object can still be factually unsupported, so this needs a separate evidence validator.
Tool calls need strict boundaries. The model must not receive broad database access, provider secrets, unrestricted web-write access, or the power to make purchases, cancel bookings, or submit visa applications on its own. Keep financial and account actions behind an explicit confirmation screen with server-side checks. Protect user travel history, location, passport data, and payment data under the applicable privacy and security program.
Structured output is useful for an itinerary because it separates rendering from reasoning. Define fields such as day, start_local, end_local, activity, reservation_required, estimated_cost, cost_currency, evidence_ids, as_of, uncertainty, and fallback. The UI can then render accessible cards, recalculate totals, flag an expired quote, or hide an unsupported section without trying to parse prose. With JSON-schema function definitions, OpenAI's current guidance says strict: true makes function calls adhere reliably to the supplied schema, subject to documented schema requirements (strict function calling). Schema adherence improves interface safety. It does not prove the itinerary is true, available, or suitable.
When a fine-tune earns its place
Do not fine-tune merely because a model once selected the wrong travel tool or formatted an itinerary awkwardly. First collect representative traces, redact or exclude sensitive user data, define a held-out test set, and compare a base model with the best prompt and schema.
| Stable problem | Try before fine-tuning | Fine-tuning is reasonable when | Keep outside the fine-tune |
|---|---|---|---|
| Intent classification | Few-shot examples, deterministic rules for obvious cases, and a small classifier | A stable set of intents recurs at scale and the measured error remains material | Current supplier facts and user account data |
| Brand tone and explanation style | System instructions, approved response examples, and output review | The desired style is stable, well-defined, and prompt variation still produces unacceptable inconsistency | Safety rules that need code enforcement and live policy claims |
| Itinerary schema | JSON schema, strict output, validators, and repair logic | Output is structurally valid but consistently fails a narrow, measured domain convention | Prices, availability, dates, and citations as model memory |
| Tool selection | Good tool descriptions, fewer exposed tools, argument validation, and route rules | A stable tool inventory and large evaluated trace set show persistent selection or argument errors | Authorization, transaction approval, rate limits, and actual tool execution |
Intent classification can also be a conventional classifier or deterministic router. It does not need a generative fine-tune if a lightweight model or ruleset meets the accuracy, cost, and latency requirements. Similarly, use application logic for hard constraints. A request that contains exact travel dates and an airport code can route deterministically to a flight search tool before a model adds any narrative.
Fine-tuned examples must teach behavior, not smuggle in an old encyclopedia of travel facts. Good examples teach how to ask a missing-date question, when to call a weather tool, how to cite a source, how to express uncertainty, and how to decline unsupported entry advice. Poor examples include past prices, stale opening hours, copied supplier catalogs, or a single provider's temporary rules. Keep training data and final evaluation cases separate so a familiar itinerary does not look better simply because the model has already seen its answer.
Example
Imagine a user asks: “Plan a Friday-to-Sunday trip from Berlin to Lisbon next month for two people. We like food and walking, want a mid-range hotel, and would rather avoid a packed schedule.” The app first asks for the exact weekend and budget currency if those details are needed. It does not infer an actual travel date from “next month” without confirming the user's local calendar context.
After dates are confirmed, the app calls a flight-offer tool with origin, destination, dates, passengers, and cabin constraints. It calls a hotel search tool with the same dates and party size. It gets the destination forecast for the exact period, retrieves a versioned editorial guide for walkable food neighborhoods, and queries place details for candidate markets and restaurants close to the lodging options. It records the returned prices, currencies, cancellation conditions, availability status, sources, and retrieval times. A place result should be associated with a specific place identity rather than only a text name. Google documents place IDs for retrieving details of the same place later (Google Place IDs).
The itinerary generator receives those records and returns a structured plan. Friday might contain a late-afternoon neighborhood walk near the selected hotel and a dinner option whose current opening hours were checked. Saturday might include an indoor or outdoor food-market choice conditioned on the forecast, with a lower-exertion fallback. Sunday might hold one booking-dependent activity only if the provider returned available inventory. Each item includes a source link, as-of time, estimated cost range when the tool supports it, and an uncertainty statement such as “Hotel rate may change before booking” or “Venue hours must be rechecked for the travel date.”
The practical takeaway is that no component has to memorize Lisbon's current facts. Retrieval supplies curated local context. Tools supply time-sensitive evidence. The language model explains trade-offs and makes the schedule readable. A future fine-tune could help it consistently choose the right tool sequence or write this brand's concise itinerary style, but it would not replace the time-stamped sources.
Evaluate the system as a chain
An appealing itinerary can conceal a failed tool call, an irrelevant document, a stale price, or a citation that does not support the sentence beside it. Test the full chain with held-out travel requests, including uncommon dates, different languages, ambiguous place names, provider timeouts, conflicting policies, no-result searches, price changes, and requests that lack essential traveller information.
| Evaluation area | What to measure | Example acceptance test |
|---|---|---|
| Retrieval quality | Recall of the needed approved document, rank of the correct source, relevance judged by reviewers, and filter correctness | A carry-on question retrieves the correct airline, fare-family, region, and current policy version in the top results |
| Citation support | Percentage of factual claims backed by the cited record, citation precision, citation completeness, and link availability | Reviewers can trace every stated price, opening-hour, entry-rule, and disruption claim to the displayed source |
| Freshness | Age at display, expired-response rate, TTL compliance, effective-date compliance, and cache-hit versus live-query rate | A displayed hotel quote never exceeds the application's defined quote TTL and shows its search time |
| Tool success | Valid argument rate, provider success rate, timeout and fallback rate, result-schema validity, and tool-selection accuracy | A flight query with dates and passengers uses the flight tool once with valid normalized dates, or asks a clarification rather than guessing |
| Unsupported claims | Claim-level hallucination rate, invented prices, invented bookings, unsupported legal or safety advice, and false certainty | A response with no current venue data says that it cannot confirm hours and offers a source link instead |
| Itinerary usefulness | Constraint satisfaction, duplicate-activity rate, travel-time plausibility, budget treatment, and human preference rating | The plan does not schedule a closed venue, exceed stated mobility constraints, or treat an estimate as a guaranteed total |
Build a test set from real, consented and appropriately protected requests plus designed edge cases. Keep final evaluation prompts and provider snapshots separate from model-training examples and routine prompt iteration. For live data, record a snapshot or normalized tool response alongside the expected judgment, otherwise an answer may look wrong later only because the supplier changed after the test ran.
Use both automatic and human checks. An automatic validator can verify source IDs, TTLs, date order, currency fields, schema conformance, tool logs, and that a cited URL came from the evidence bundle. Human reviewers should judge whether a citation actually supports the nearby claim, whether uncertainty is understandable, and whether the plan respects the traveller's stated constraints. Red-team the system for prompt injection in retrieved pages, false supplier content, confusing airport codes, malicious place names, and pressure to make a booking without confirmation.
Common failure modes
| Failure mode | Why it fails | Better control |
|---|---|---|
| Fine-tuning on historical fares and presenting them as current | Model weights cannot provide a timestamped quote or inventory guarantee | Query an authorized provider at request time and revalidate before checkout |
| Calling every fresh lookup “RAG” | It hides the difference between document relevance and transactional tool correctness | Measure retrieval and tool calls separately, with separate owners and failure handling |
| Citing a general guide beside a specific price or visa statement | The citation looks credible but does not support the claim | Bind claims to record-level evidence and use the authoritative source for the fact |
| Showing a cached result without its age | The user cannot judge whether the answer can still be acted on | Store and display retrieved time, TTL, effective window, and refresh action |
| Letting the model resolve conflicting supplier records | The model may invent a compromise or silently select the wrong source | Implement source precedence, surface unresolved conflict, and offer confirmation |
| Treating structured output as factual validation | Valid JSON can contain invented fields or unsupported claims | Validate schema, evidence coverage, and time constraints independently |
| Giving the model direct booking authority | A model error can create financial, privacy, or service harm | Use explicit user confirmation, server-side price and availability checks, and audited transaction controls |
| Fine-tuning before a baseline evaluation | It makes cost and regression hard to explain | Establish a prompt-and-tools baseline, then fine-tune against a held-out behavioral metric |
Limits and viable alternatives
A retrieval and tool architecture adds latency, provider outages, licensing or attribution obligations, integration costs, and operational complexity. For a small editorial trip-guide app that does not show prices, availability, or regulatory claims, a versioned content search may be enough. For an itinerary app that only links to partners, it may be safer to show a sourced recommendation and send the user to the supplier than to build transactional tool access.
Conversely, a booking or disruption-assistance product needs more than RAG. It needs provider contracts, secure credentials, rate-limit and outage handling, data-retention controls, user consent where personal data is involved, audit logs, and an explicit escalation path. Travel restrictions, immigration, insurance, health, and safety information have legal, financial, medical, and personal-safety implications. Show official sources and assumptions, but do not present generated text as professional advice or a guarantee of entry, coverage, or safety.
Evidence
Sources used for this answer.
Question signals show what people need. Primary documentation supports the answer. Both remain visible.
- 01Should travel apps use RAG instead of fine-tuning?Hugging Face Forums · question signal · checked 1 Sept 2026
- 02OpenAI function-calling guidedevelopers.openai.com · implementation guidance · checked 1 Sept 2026
- 03Google Places referencedevelopers.google.com · implementation guidance · checked 1 Sept 2026
- 04Open-Meteo Forecast APIopen-meteo.com · primary evidence · checked 1 Sept 2026
- 05OpenAI model optimization guidedevelopers.openai.com · implementation guidance · checked 1 Sept 2026
- 06fine-tuning API referenceplatform.openai.com · primary evidence · checked 1 Sept 2026
- 07U.S. State Department travel advisoriestravel.state.gov · primary evidence · checked 1 Sept 2026
- 08Google Place IDsdevelopers.google.com · implementation guidance · checked 1 Sept 2026