{"id":22388335,"url":"https://github.com/google-marketing-solutions/feedgen","last_synced_at":"2025-04-04T16:11:40.855Z","repository":{"id":170988234,"uuid":"641384038","full_name":"google-marketing-solutions/feedgen","owner":"google-marketing-solutions","description":"Optimise Shopping feeds with Generative AI","archived":false,"fork":false,"pushed_at":"2025-03-28T11:41:28.000Z","size":9737,"stargazers_count":197,"open_issues_count":1,"forks_count":32,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-03-28T15:04:16.727Z","etag":null,"topics":["data-science","generative-ai","google-cloud","large-language-models","llm","machine-learning","shopping-feed","vertex-ai"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/google-marketing-solutions.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-05-16T11:05:11.000Z","updated_at":"2025-03-28T11:40:26.000Z","dependencies_parsed_at":"2023-07-14T11:43:20.071Z","dependency_job_id":"9fc17b57-7fdb-47ae-b805-29fc8e9ebcef","html_url":"https://github.com/google-marketing-solutions/feedgen","commit_stats":null,"previous_names":["google/feedgen","google-marketing-solutions/feedgen"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google-marketing-solutions%2Ffeedgen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google-marketing-solutions%2Ffeedgen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google-marketing-solutions%2Ffeedgen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/google-marketing-solutions%2Ffeedgen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/google-marketing-solutions","download_url":"https://codeload.github.com/google-marketing-solutions/feedgen/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247208142,"owners_count":20901570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-science","generative-ai","google-cloud","large-language-models","llm","machine-learning","shopping-feed","vertex-ai"],"created_at":"2024-12-05T02:13:08.997Z","updated_at":"2025-04-04T16:11:40.833Z","avatar_url":"https://github.com/google-marketing-solutions.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003c!--\nCopyright 2023 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n      http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n--\u003e\n\u003cimg align=\"left\" width=\"150\" src=\"https://services.google.com/fh/files/misc/feedgen_logo.png\" alt=\"feedgen_logo\" /\u003e\u003cbr\u003e\n\n# FeedGen: Optimise Shopping feeds with Generative AI\n\n[![GitHub last commit](https://img.shields.io/github/last-commit/google/feedgen)](https://github.com/google/feedgen/commits)\n[![Code Style: Google](https://img.shields.io/badge/code%20style-google-blueviolet.svg)](https://github.com/google/gts)\n\n**Disclaimer: This is not an official Google product.**\n\n*FeedGen works best for up to 30k items. Looking to scale further? Check out the [Product Studio API](https://developers.google.com/product-studio/docs/onboarding) or consider [processing your feed in BigQuery](bigquery/README.md).*\n\n[Overview](#overview) •\n[Get started](#get-started) •\n[What it solves](#challenges) •\n[How it works](#solution-overview) •\n[How to Contribute](#how-to-contribute) •\n[Community Spotlight](#community-spotlight)\n\n## Updates\n\n* [July 2024]: Added guide to [feed optimisation using BigQuery](bigquery/README.md).\n* [May 2024]: Added support for `gemini-1.5-pro` and `gemini-1.5-flash`\n* [April 2024]\n  * **IMPORTANT**: As of April 9 and as per the updated [Merchant Center product data specification](https://support.google.com/merchants/answer/14784710) please use `structured_title` and `structured_description` when importing FeedGen's output into Merchant Center instead of `title` and `description` respectively. Refer to [these instructions](#using-structured_title-and-structured_description) for details.\n  * Added support for Gemini 1.5 pro (preview): `gemini-1.5-pro-preview-0409`. Please note that the model name may (breakingly) change in the future.\n* [March 2024]\n  * Renamed Gemini models to `gemini-1.0-pro` and `gemini-1.0-pro-vision`\n  * Added support for retrieving JSON web pages\n* [January 2024]: Added support for fetching product web page information and\n  using it for higher quality title and description generation\n* [December 2023]\n  * Added support for Gemini models (`gemini-pro` and `gemini-pro-vision`)\n  * Unified description generation and validation - now handled by a single\n    prompt\n  * Added support for [image understanding](#image-understanding) for higher\n    quality title and description generation (only available with\n    `gemini-pro-vision`)\n  * Added LLM-generated titles which should avoid duplicate values at the\n    possible loss of some attribute information\n* [November 2023]: Added description validation as a separate component\n* [October 2023]: Made title and description generation optional\n* [August 2023]: Added support for [text-bison-32k](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#32k_models)\n* [June 2023]: Moved Colab variant to `v1` and switched to JS/TS on `main`\n\n## Overview\n\n**FeedGen** is an open-source tool that uses Google Cloud's state-of-the-art\nLarge Language Models (LLMs) to improve product titles, generate more\ncomprehensive descriptions, and fill missing attributes in product feeds. It\nhelps merchants and advertisers surface and fix quality issues in their feeds\nusing Generative AI in a simple and configurable way.\n\nThe tool relies on GCP's Vertex AI API to provide both zero-shot and few-shot\ninference capabilities on GCP's foundational LLMs. With\n[few-shot prompting](https://cloud.google.com/vertex-ai/docs/generative-ai/text/text-overview),\nyou use the best 3-10 samples from your own Shopping feed to customise the\nmodel's responses towards your own data, thus achieving higher quality and more\nconsistent output. This can be optimised further by fine-tuning the\nfoundational models with your own proprietary data. Find out how to fine-tune\nmodels with Vertex AI, along with the benefits of doing so, at this\n[guide](https://cloud.google.com/vertex-ai/docs/generative-ai/models/tune-models).\n\n\u003e Note: Please check if your target feed language is one of the\n[Vertex AI supported languages](https://cloud.google.com/vertex-ai/docs/generative-ai/learn/models#language_support)\nbefore using FeedGen, and reach out to your Google Cloud or Account\nrepresentatives if not.\n\n## Get Started\n\nTo get started with FeedGen:\n\n1. Make a copy of the Google Sheets\n[spreadsheet template](https://docs.google.com/spreadsheets/d/19eKTJrbZaUfipAvL5ZQmq_hoxEbLQIlDqURKFJA2OBU/edit#gid=1661242997)\n1. Follow the instructions detailed in the `Getting Started` worksheet\n\n## Challenges\n\nOptimising Shopping feeds is a goal for every advertiser working with Google\nMerchant Center (MC) in order to improve query matching, increase coverage, and\nultimately click-through rates (CTR). However, it is cumbersome to sift\nthrough product disapprovals in MC or manually fix quality issues.\n\nFeedGen tackles this using Generative AI - allowing users to surface and fix\nquality issues, and fill attribute gaps in their feeds, in an automated fashion.\n\n## Solution Overview\n\nFeedGen is an Apps Script based application that runs as an HTML sidebar (see\n[HtmlService](https://developers.google.com/apps-script/guides/html) for\ndetails) in Google Sheets. The associated Google Sheets spreadsheet template is\nwhere all the magic happens; it holds the input feed that needs optimisation,\nalong with specific configuration values that control how content is generated.\nThe spreadsheet is also used for both (optional) human validation and setting up\na **supplemental feed** in Google Merchant Center (MC).\n\n\u003e Generative Language in Vertex AI, and in general, is a nascent feature /\ntechnology. We highly recommend manually reviewing and verifying the generated\ntitles and descriptions. FeedGen helps users expedite this process by providing\na [score](#scoring--evaluation) for both titles and descriptions (along with\ndetailed components) that represents how \"good\" the generated content is, along\nwith a Sheets-native way for bulk-approving generated content via data filters.\n\nFirst, make a copy of the [template spreadsheet](#get-started) and follow the\ninstructions defined in the **Getting Started** section. The first step is to\nauthenticate yourself to the Apps Script environment via the **Initialise**\nbutton as shown below.\n\n\u003cimg src='./img/getting-started.png' alt='Getting Started' /\u003e\n\nAfterwards, navigate to the **Config** worksheet to configure feed settings,\nVertex AI API settings (including an estimation of the\n[costs](#vertex-ai-pricing-and-quotas) that will be incurred), and settings to\ncontrol the content generation.\n\n\u003cimg src='./img/config.png' alt='Config' /\u003e\n\n### Description Generation\n\nDescription generation works by taking the prompt prefix given in the **Config**\nsheet, appending a row of data from **Input** and sending the result as a prompt\nto the LLM. This gives you great flexibility in shaping the wording, style and\nother requirements you might have. All data from **Input Feed** will be provided\nas part of the prompt.\n\nIf a web page link is provided in the input feed, you may also check the\n`Use Landing Page Information` checkbox to load and pass sanitised content of\nthe product's web page into the prompt. All `span` and `p` tags are extracted\nfrom the fetched HTML content and concatenated together to form an additional\nparagraph of information that is passed to the LLM in the prompt, along with\ndedicated instructions on how to use this additional information. JSON web\nresponses will be used as-is without additional parsing. Furthermore, fetched\nweb page information is cached using Apps Script's\n[CacheService](https://developers.google.com/apps-script/reference/cache) for a\nperiod of 60 seconds in order to avoid refetching and reparsing the content for\nthe generation of titles (which is a separate call to the Vertex AI API).\n\n*Optional*: You can also provide examples of descriptions in the **Few-shot**\nexamples section (see below). Those will be appended to the prompt prefix as\nwell and inform the model of how *good* descriptions look like.\n\nThe result is directly output as **Generated Description**\n\n### Description Validation\n\nSince LLMs have a tendency to hallucinate, there is an option to ask the model\n(in follow-up instructions within the same prompt) if the generated description\nmeets your criteria. The model evaluates the description it just generated and\nresponds with a numerical score as well as reasoning. Example\n*validation criteria and scoring* are provided to give some hints on how to\ninstruct the model to evaluate descriptions - e.g. it includes criteria as well\nas example score values.\n\n### Title Generation\n\nTitles use few-shot prompting; a technique where one would select samples from\ntheir own input feed as shown below to customise the model's responses towards\ntheir data. To help with this process, FeedGen provides a utility Google Sheets\nformula:\n\n```sql\n=FEEDGEN_CREATE_CONTEXT_JSON('Input Feed'!A2)\n```\n\nWhich can be used to fill up the “Context” information field in the few-shot\nprompt examples table by dragging it down, just as for other Sheets formulas.\nThis \"Context\" represents the entire row of data from the input feed for this\nitem, and it will be sent as part of the prompt to the Vertex AI API.\n\nAfterwards, you must manually fill in the remaining columns of the few-shot\nprompt examples table, which define the expected output by the LLM. These\nexamples are very important as they provide the basis upon which the LLM will\nlearn how it should generate content for the rest of the input feed. The best\nexamples to pick are products where:\n\n* You can identify attributes in the existing title that match *column names* from your input feed.\n* You can propose a new title that is better than the existing one (e.g. contains more attributes).\n* The proposed title has a structure that can be reused for other products within your feed.\n\nWe would recommend adding at least one example per unique category within your\nfeed, especially if the ideal title composition would differ.\n\n\u003cimg src='./img/few-shot.png' alt='Few-Shot' /\u003e\n\nFeedGen defaults to using attributes from the input feed instead of generated\nattribute values for composing the title, to avoid LLM hallucinations and ensure\nconsistency. For example, the value `Blue` from the input feed attribute\n**Color** for a specific feed item will be used for its corresponding title\ninstead of, say, a generated value `Navy`. This behaviour can be overridden with\nthe `Prefer Generated Values` checkbox in the **Advanced Settings** section of\nthe *Title Prompt Settings*, and is useful whenever the input feed itself\ncontains erroneous or poor quality data.\n\nWithin this same section you can also specify a list of *safe* words that can be\noutput in generated titles even if they did not exist beforehand in your feed.\nFor example, you can add the word \"Size\" to this list if you would like to\nprefix all values of the `Size` attribute with it (i.e. \"Size M\" instead of \"M\").\n\nFinally, you can also specify whether you would like the LLM to generate titles\nfor you using the `Use LLM-generated Titles` checkbox. This allows the LLM\nto inspect the generated attribute values and select which ones to concatenate\ntogether - avoiding duplicates - instead of the default logic where *all*\nattribute values will be stitched together. This feature should work better with\nGemini models than PaLM 2, as Gemini models have better reasoning capabilities\nthat allow them to better strick to prompt instructions over PaLM 2 models.\nFurthermore, LLM-generated titles allow you to specify the desired length for\ntitles in the prompt (max 150 characters for Merchant Center), which was not\npossible previously.\n\nLike descriptions, you may also choose to load information from the provided web\npage link and pass it to the LLM for the generation of higher quality titles.\nThis can be done via the `Use Landing Page Information` checkbox, and when\nchecked, all features extracted from the web page data will be listed under a\n[new attribute](#feed-gaps-and-new-attributes) called **Website Features**. New\nwords that were not covered by existing attributes will then be added to the\ngenerated title.\n\nNow you are done with the configuration and ready to optimise your feed. Use the\ntop navigation menu to launch the FeedGen sidebar and start generating and\nvalidating content in the **Generated Content Validation** worksheet.\n\n\u003cimg src='./img/generated.png' alt='Generated' /\u003e\n\nYou would typically work within this view to understand, approve and/or\nregenerate content for each feed item as follows:\n\n* The **Generate** button controls the generation process, and will first\n  regenerate all columns with an *empty* or *failed* status before continuing on\n  with the rest of the feed. For example, clearing row 7 above and clicking\n  *Generate* will start the generation process at row 7 first, before continuing\n  on with the next feed item.\n  * This means that you may clear the value of the **Status** column for any\n    feed item in order to *regenerate* it.\n  * To start from scratch, click **Clear Generated Data** first before\n    *Generate*.\n* If an error occurs, it will be reflected in the **Status** column as \"Failed\".\n* Approval can be done in bulk via filtering the view and using the\n  **Approve Filtered** button, or individually using the checkboxes in the\n  **Approval** column. All entries with a score above 0 will already be\n  pre-approved (read more about FeedGen's\n  [Scoring / Evaluation](#scoring--evaluation) system below).\n* Additional columns for titles and descriptions are grouped, so that you may\n  expand the group you are interested in examining.\n\nOnce you have completed all the necessary approvals and are satisfied with the\noutput, click **Export to Output Feed** to transfer all approved feed items\nto the **Output Feed** worksheet.\n\n\u003cimg src='./img/output.png' alt='Output' /\u003e\n\nThe last step is to connect the spreadsheet to MC as a supplemental feed,\nthis can be done as described by this\n[Help Center article](https://support.google.com/merchants/answer/7439058) for\nstandard MC accounts, and this\n[Help Center article](https://support.google.com/merchants/answer/9651854)\nfor multi-client accounts (MCA).\n\nNotice that there is a **att-p-feedgen** column in the output feed.\nThis column name is completely flexible and can be changed directly in the\noutput worksheet. It adds a custom attribute to the supplemental feed for\nreporting and performance measurement purposes.\n\n### Image Understanding\n\nAs Gemini (`gemini-pro-vision`) is a multimodal model, we are able to\nadditionally examine product images and use them to generate higher quality\ntitles and descriptions. This is done by adding additional instructions to the\nexisting title and description generation prompts for *extracting* visible\nproduct features from the provided image.\n\nFor titles, extracted features are used in 2 ways:\n\n1. As a quality check for existing feed attributes. For example, if the given\nproduct feed references a *white* color, yet the provided image shows a *black*\nproduct, the title and feed attribute are going to be adjusted accordingly.\n2. To enhance the generated title via a\n[new attribute](#feed-gaps-and-new-attributes) called **Image Features**. This\nattribute lists all visible features the model was able to extract from the\nprovided image. All new words that were not covered by existing attributes will\nthen be added to the generated title.\n\nFor descriptions, extracted features are used by the model to generate a more\ncomprehensive description that highlights the visual aspects of the product.\nThis is particularly relevant for domains where visual appeal is paramount;\nwhere the product's key details are *visually* conveyed rather than in a\nstructured text format within the feed. This includes fashion, home decor and\nfurniture, and perfumery and jewelry to name a few.\n\nFinally, it is important to note the following restrictions (this information\nis valid during the *Public Preview* of Gemini):\n\n* You can specify either web images and/or Google Cloud Storage (GCS) file URIs\n  in the `Image Link` column of the *Input Feed* worksheet. GCS URIs are passed\n  as-is to Gemini (as they are supported by the model itself), while web images\n  are first downloaded and provided inline as part of the input to the model.\n* Regardless of the source, only `image/png` and `image/jpeg` MIME types are\n  supported.\n* GCS URIs must also point to a bucket that is within the same Google Cloud\n  project that is sending the request (otherwise, it will be discarded by\n  Gemini).\n* [Pricing](#vertex-ai-pricing-and-quotas) is affected as well - an additional\n  charge will be incurred per image. This has already been taken into account in\n  FeedGen's price estimator.\n\n### Scoring / Evaluation\n\n#### Descriptions\n\nDescriptions with a score below `Min. Evaluation Approval Score` will not be\npre-approved. You can re-generate those by filtering on **Description Score**\nand removing the *Status* value in the **Generation Validation** tab.\n\n#### Titles\n\nFeedGen provides a score for generated titles between -1 and 1 that acts as a\nquality indicator. Positive scores indicate varying degrees of good quality,\nwhile negative scores represent uncertainty over the generated content. Like\ndescriptions, you may specify a minimum score (defaults to 0) that you would\nlike FeedGen to pre-approve.\n\nLet's take a closer look with some fictitous examples to better understand the\nscoring for titles:\n\n* **Original Title**: 2XU Men's Swim Compression Long Sleeve Top\n* **Original Description**: 2XU Men's Swim Compression Long Sleeve Top,\n  lightweight, breathable PWX fabric, UPF 50+ protects you from the sun.\n* **Generated Title**: 2XU Men's Swim Compression Long Sleeve Top Black Size M\n  PWX Fabric UV Protection\n* **Score**: -1\n* Reasoning: New words, namely \"UV Protection\", were added that may have been\n  *hallucinated* by the language model. Indeed, \"UV Protection\" is not\n  explicitly mentioned anywhere in the input feed. Examining the feed item more\n  clearly however surfaces that the description contains the value *UPF 50+*, so\n  the addition of *UV Protection* is actually a *positive* thing, but since we\n  have no way of assessing this (without applying a more granular semantic text\n  analysis) we default to penalising the score.\n\nLet's look at another example for the same product:\n\n* **Original Title**: 2XU Men's Swim Compression Long Sleeve Top\n* **Generated Title**: 2XU Men's Swim Compression Top Size M\n* **Score**: -0.5\n* Reasoning: Key information was removed from the title, namely \"Long Sleeve\",\n  which describes the type of the product. FeedGen identifies this information\n  by first examining the structure of titles via what we refer to as\n  **templates** in our uniquitous language, before diving deeper and comparing\n  the individual words that compose the titles. Let's check the templates for\n  our example:\n  * **Original Title Template**: `\u003cBrand\u003e \u003cGender\u003e \u003cCategory\u003e \u003cProduct Type\u003e`\n  * **Generated Title Template**: `\u003cBrand\u003e \u003cGender\u003e \u003cCategory\u003e \u003cProduct Type\u003e \u003cSize\u003e`\n  * As you can see no attributes were actually removed, but rather the\n    components of the `Product Type` attribute changed in a worse way, hence the\n    negative score.\n\n\u003e FeedGen is conservative in its scoring; it will assign a score of -0.5\n  whenever *any* words get removed, even if those words were promotional phrases\n  such as `get yours now` or `while stocks last`, which should not be part of\n  titles as per the [Best Practices](#best-practices) outlined by Merchant\n  Center (MC).\n\nAlright, so what makes a good title? Let's look at another example:\n\n* **Original Title**: 2XU Men's Swim Compression Long Sleeve Top\n* **Generated Title**: 2XU Men's Swim Compression Long Sleeve Top Size M\n* **Score**: 0.5\n* Reasoning: Nothing was changed or lost in the original title, and we added a\n  new attribute, \"Size\". If the product was being offered in different sizes,\n  this new title would now be vital in preventing all feed items for the product\n  from getting rejected by MC (due to their titles being duplicates).\n\nFinally, what's the ideal case? Let's take a look at one last example:\n\n* **Original Title**: 2XU Men's Swim Compression Long Sleeve Top\n* **Input - Color**: *missing*\n* **Generated Title**: 2XU Men's Swim Compression Long Sleeve Top Black Size M\n* **Output - Color**: Black\n* **Score**: 1\n* Reasoning: This is the best possible scenario; we optimised the title and\n  filled feed attribute gaps along the way, a score of 1 is definitely\n  well-deserved.\n\nSo in summary, the scoring systems works as follows:\n\n|Are there hallucinations?|Have we removed any words?|No change at all?|Have we optimised the title?|Did we fill in missing gaps or extract [new attributes](#feed-gaps-and-new-attributes)?|\n|-|-|-|-|-|\n|-1|-0.5|0|Add 0.5|Add 0.5|\n\nFeedGen also applies some basic MC compliance checks, such as titles and\ndescriptions must not be longer than 150 and 5000 characters, respectively. If\nthe generated content fails these checks, the value\n`Failed compliance checks` will be output in the **Status** column. As\nmentioned above, FeedGen will attempt to regenerate `Failed` items first\nwhenever the **Generate** button is clicked.\n\n### Feed Gaps and New Attributes\n\nFeedGen does not just fill gaps in your feed, but might also create completely\n**new** attributes that were not provided in the *Input Feed*. This is\ncontrollable via the few-shot prompting examples in the *Config* sheet; by\nproviding \"new\" attributes that do not exist in the input within those examples,\nFeedGen will attempt to *extract* values for those new attributes from other\nvalues in the input feed. Let's take a look at an example:\n\n|Original Title|Product Attributes in Original Title|Product Attributes in Generated Title|Generated Attribute Values|\n|---|---|---|---|\n|ASICS Women's Performance Running Capri Tight|Brand, Gender, Product Type| Brand, Gender, Product Type, **Fit**| ASICS, Women's Performance, Running Capri, Tight|\n\nNotice here how the **Fit** attribute was extracted out of *Product Type*.\nFeedGen would now attempt to do the same for all other products in the feed,\nso for example it will extract the value `Relaxed` as *Fit* from the title\n`Agave Men's Jeans Waterman Relaxed`. If you do not want those attributes to be\ncreated, make sure you only use attributes that exist in the input feed for your\nfew-shot prompting examples. Furthermore, those completely new feed attributes\nwill be prefixed with **feedgen-** in the **Output Feed** (e.g. feedgen-Fit) and\nwill be sorted to the end of the sheet to make it easier for you to locate and\ndelete should you not want to use them.\n\n### Best Practices\n\nWe recommend the following patterns for titles according to your business domain:\n\n|Domain|Recommended title structure|Example|\n|---|---|---|\n|Apparel|Brand + Gender + Product Type + Attributes (Color, Size, Material)|Ann Taylor Women’s Sweater, Black (Size 6)|\n|Consumable|Brand + Product Type + Attributes (Weight, Count)|TwinLab Mega CoQ10, 50 mg, 60 caps|\n|Hard Goods|Brand + Product + Attributes (Size, Weight, Quantity)|Frontgate Wicker Patio Chair Set, Brown, 4-Piece|\n|Electronics|Brand + Attribute + Product Type|Samsung 88” Smart LED TV with 4K 3D Curved Screen|\n|Books|Title + Type + Format (Hardcover, eBook) + Author|1,000 Italian Recipe Cookbook, Hardcover by Michele Scicolone|\n\nYou can rely on these patterns to generate the few-shot prompting examples\ndefined in the FeedGen `Config` worksheet, which will accordingly steer the\nvalues generated by the model.\n\nWe also suggest the following:\n\n* Provide as many product attributes as possible for enriching **description** generation.\n* Use **size**, **color**, and **gender / age group** for title generation, if available.\n* Do **NOT** use model numbers, prices or promotional text in titles.\n\n### Vertex AI Pricing and Quotas\n\nPlease refer to the Vertex AI\n[Pricing](https://cloud.google.com/vertex-ai/pricing#generative_ai_models) and\n[Quotas and Limits](https://cloud.google.com/vertex-ai/docs/quotas#request_quotas)\nguides for more information.\n\n### Using structured_title and structured_description\n\nAs of April 9, 2024 and as per the updated [Merchant Center product data specification](https://support.google.com/merchants/answer/14784710), users need to disclose whether generative AI was used to curate the text content for titles and descriptions.\nThe main challenge with this is that users cannot send both `title` and `structured_title`, or `description` and `structured_description` in the same feed, as the original column values will always trump the `structured_` variants.\nTherefore, users need to perform an additional series of steps *after* exporting the approved generations into FeedGen's **Output Feed** tab:\n\n1. Connect the FeedGen spreadsheet to Merchant Center as a [supplemental feed](https://support.google.com/merchants/answer/7439058).\n1. Create [feed rules](https://support.google.com/merchants/answer/7450276) to **clear** the title and description values along with the FeedGen supplemental feed.\n   1. You have to create 2 distinct feed rules as shown below:\n   \u003cimg src='./img/feed_rule_title.png' width=\"300px\" /\u003e\n   \u003cimg src='./img/feed_rule_description.png' width=\"289.5px\" /\u003e\n1. Rename the `title` and `description` columns in the **Output Feed** tab of FeedGen to `structured_title` and `structured_description`, respectively.\n1. Add the prefix `trained_algorithmic_media:` to all generated content.\n   \u003cbr/\u003e\u003cimg src='./img/output_feed_adjustment.png' width=\"300px\" /\u003e\u003cbr/\u003e\n   Refer to the detailed [structured_title](https://support.google.com/merchants/answer/6324415) and [structured_description](https://support.google.com/merchants/answer/6324468) attribute specs for more information.\n\nWe will be automating Steps #3 and #4 for you soon - stay tuned!\u003cbr/\u003e\n*Credits to [Glen Wilson](https://www.linkedin.com/in/glenmwilson/) and the team at [Solutions-8](https://sol8.com/) for the details and images.*\n\n## How to Contribute\n\nBeyond the information outlined in our [Contributing Guide](CONTRIBUTING.md),\nyou would need to follow these additional steps to build FeedGen locally:\n\n1. Make sure your system has an up-to-date installation of\n   [Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm).\n1. Navigate to the directory where the FeedGen source code lives.\n1. Run `npm install`.\n1. Run `npx @google/aside init` and click through the prompts.\n   * Input the Apps Script `Script ID` associated with your target Google Sheets\n     spreadsheet. You can find out this value by clicking on\n     `Extensions \u003e Apps Script` in the top navigation menu of your target sheet,\n     then navigating to `Project Settings` (the gear icon) in the resulting\n     [Apps Script](https://script.google.com) view.\n1. Run `npm run deploy` to build, test and deploy (via\n   [clasp](https://github.com/google/clasp)) all code to the target spreadsheet\n   / Apps Script project.\n\n## Community Spotlight\n\n* [Unlocking the Power of AI for Google Shopping Feed Optimization](https://blog.datatovalue.nl/google-shopping-feed-optimization-with-generative-ai-16d0ed996f1f) by Krisztián Korpa.\n* [AI-driven success: how to leverage the potential of Google FeedGen in PPC campaigns](https://www.adchieve.com/en/blog/leverage-potential-google-feed-gen/) by Alex van de Pol.\n* (German) [Generative KI: Home24 verbessert mit FeedGen Reichweite und Performance von Shopping Ads](https://www.thinkwithgoogle.com/intl/de-de/marketing-strategien/automatisierung/home24-feedgen-shopping-ads) - Think with Google.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle-marketing-solutions%2Ffeedgen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogle-marketing-solutions%2Ffeedgen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogle-marketing-solutions%2Ffeedgen/lists"}