이 페이지에서는 embedding() 함수가 테이블에 저장된 데이터와 pgvector 쿼리에서 작동하는 방식을 보여주는 워크플로 예시를 제공합니다.
이 예시에서는 일반 텍스트 입력을 사용하여 텍스트 의미의 대규모 언어 모델(LLM) 기반 시맨틱 파싱을 사용하는 데이터베이스에서 결과를 가져옵니다.
임베딩 워크플로 예시 시나리오
다음과 같은 측면에서 PostgreSQL용 Cloud SQL에서 실행되는 데이터베이스를 가정해 보세요.
데이터베이스에는 items 테이블이 포함되어 있습니다. 이 테이블의 각 행은 비즈니스에서 판매하는 상품을 설명합니다.
items 테이블에는 complaints 열이 포함되어 있습니다. 이 열에는 각 항목에 대해 로깅된 구매자 불만사항이 일반 텍스트로 저장됩니다.
이 데이터베이스에 항목에 대한 불만사항이 저장되어 있지만 이러한 불만사항은 일반 텍스트로 저장되므로 쿼리하기가 어렵습니다. 예를 들어 잘못된 색상의 상품을 받은 고객이 불만사항을 가장 많이 제기한 상품이 무엇인지 확인하려면 테이블에서 일반 SQL 쿼리를 수행하여 다양한 키워드 검색 유형을 찾으면 됩니다. 하지만 이 방법은 정확한 키워드가 포함된 행만 일치시킵니다.
예를 들어 SELECT * FROM item WHERE complaints LIKE
"%wrong color%"와 같은 기본 SQL 쿼리는 The picture shows a blue one, but the one I received was red만 포함된 complaints 필드가 있는 행을 반환하지 않습니다.
LLM 기반 임베딩을 사용하는 SQL 쿼리는 이 격차를 해소하는 데 도움이 될 수 있습니다. 임베딩을 적용하면 이 예시에서는 지정된 텍스트 프롬프트(예: '색상이 잘못되었습니다')와 의미론적으로 유사한 불만사항이 있는 상목의 테이블을 쿼리할 수 있습니다.
다음 단계에서는 앞에서 설명한 예시 시나리오에서 이를 사용 설정하는 방법을 보여줍니다.
테이블 준비
items 테이블의 콘텐츠에 LLM 기반 쿼리를 실행하기 전에 기존 데이터를 기반으로 임베딩을 저장하고 색인을 생성할 테이블을 준비해야 합니다.
임베딩을 저장할 열 만들기
임베딩을 저장할 테이블에 열을 추가합니다.
sql
ALTER TABLE items ADD COLUMN complaint_embedding vector(768);
이 예시에서는 768을 인수로 지정합니다. 이는 textembedding-gecko LLM에서 지원하는 측정기준 수이기 때문입니다. 자세한 내용은 임베딩 생성을 참조하세요.
이 예시에서는 vector 데이터 유형을 열에 적용하여 열 값과 함께 pgvector 함수와 연산자 사용을 간소화합니다.
새 열 채우기
embedding() 함수를 사용하여 complaints 열에 표시되는 각 행의 텍스트 값을 기준으로 이 새 열을 임베딩으로 채웁니다. 이 예시에서 Cloud SQL은 ID가 textembedding-gecko이고 버전이 004인 LLM을 사용하여 임베딩을 생성합니다.
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["이해하기 어려움","hardToUnderstand","thumb-down"],["잘못된 정보 또는 샘플 코드","incorrectInformationOrSampleCode","thumb-down"],["필요한 정보/샘플이 없음","missingTheInformationSamplesINeed","thumb-down"],["번역 문제","translationIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-08-19(UTC)"],[],[],null,["# Understand an example of an embedding workflow\n\n\u003cbr /\u003e\n\n[MySQL](/sql/docs/mysql/understand-example-embedding-workflow \"View this page for the MySQL database engine\") \\| PostgreSQL \\| SQL Server\n\n\u003cbr /\u003e\n\nThis page provides an example of a workflow that demonstrates how the\n[`embedding()`](/sql/docs/postgres/work-with-vectors#generate-an-embedding)\nfunction works\nwith the data that's stored in your tables and the\n[`pgvector` query functionality](/sql/docs/postgres/work-with-vectors#query).\nThe example\nuses plain-text input to fetch a result from a database that relies on large\nlanguage model (LLM)-driven semantic parsing of the text's meaning.\n\nAn example scenario of an embedding workflow\n--------------------------------------------\n\nImagine a database running on Cloud SQL for PostgreSQL with the following aspects:\n\n- The database contains a table: `items`. Each row in this table describes an\n item that your business sells.\n\n- The `items` table contains a column: `complaints`. This column stores\n buyer complaints that are logged about each item as plain text.\n\n- The database integrates with the [Vertex AI\n Model Garden](/model-garden), giving it access to the `textembedding-gecko` LLM.\n\nEven though this database stores complaints about items, these complaints are\nstored as plain text, making it challenging to query. For example, if you want\nto see which items have the most complaints from customers who received the\nwrong color of merchandise, then you can perform ordinary SQL queries on the\ntable, looking for various keyword matches. However, this approach matches only\nrows that contain those exact keywords.\n\nFor example, a basic SQL query such as `SELECT * FROM item WHERE complaints LIKE\n\"%wrong color%\"` doesn't return a row where the `complaints` field contains only\n`The picture shows a blue one, but the one I received was red`.\n\nSQL queries using LLM-powered embeddings can help bridge this gap. By\napplying embeddings, you can query the table in this example for items where\ncomplaints have semantic similarity to a given text prompt, such as \"It was the\nwrong color\".\n\nThe following steps show how to enable this in the example scenario described\nearlier.\n\nPrepare the table\n-----------------\n\nBefore you run LLM-based queries on the content of the `items` table, you must\nprepare the table to store and index embeddings based on your existing\ndata.\n\n### Create a column to store embeddings\n\nAdd a column to the table to store embeddings.\n`sql\nALTER TABLE items ADD COLUMN complaint_embedding vector(768);`\n\n\u003cbr /\u003e\n\nThis example specifies `768` as an argument because that's how many dimensions the `textembedding-gecko` LLM supports. For more information, see\n[Generate an embedding](/sql/docs/postgres/work-with-vectors#generate-an-embedding).\n\nThe example applies the `vector` data type to the column to simplify using `pgvector` functions and operators with the column's values.\n\n### Populate the new column\n\nUse the `embedding()`function to populate this new column with embeddings based\non the value of each row's text that appears in the `complaints` column. In this example,\nCloud SQL generates the embeddings using the LLM with the ID of\n`textembedding-gecko`, version `004`. \n\n UPDATE items SET complaint_embedding = embedding('text-embedding-005', complaints);\n\nThis example casts the `real[]` return value of `embedding()` into a `vector` value implicitly to store the value in the `vector` column that you created in [Create a column to store embeddings](#create-column).\n\n\u003cbr /\u003e\n\n### Create an index\n\nTo improve performance, add an index to the `items` table. \n\n CREATE INDEX complaint_embed_idx ON items\n USING hnsw (complaint_embedding vector_cosine_ops);\n\nFor more information on creating this type of index, see [Create a nearest-neighbor index](/sql/docs/postgres/work-with-vectors#index). Also, for more information on tuning the index by setting parameters, see [Query and index embeddings using `pgvector`](/sql/docs/postgres/work-with-vectors).\n\nRun LLM-powered queries with provided text\n------------------------------------------\n\nYou can now make semantic nearest-neighbor queries on the `items` table. The\nfollowing query uses the `\u003c-\u003e` operator that `pgvector`\nprovides\nto complete the following actions:\n\n- Sort the table's rows on semantic proximity to the text of `It was the wrong color`.\n- Return the top ten complaints.\n\nThe query displays the `id` and `name` values of the first sorted row. \n\n SELECT id, name FROM items\n ORDER BY complaint_embedding\n \u003c-\u003e embedding('text-embedding-005', 'It was the wrong color')::vector LIMIT 10;\n\nWhat's next\n-----------\n\n- [Build generative AI applications using Cloud SQL](/sql/docs/postgres/ai-overview)\n\n- [Integrate Cloud SQL with Vertex AI](/sql/docs/postgres/integrate-cloud-sql-with-vertex-ai)\n\n- [Work with vector embeddings](/sql/docs/postgres/work-with-vectors)\n\n- [Invoke online predictions from Cloud SQL instances](/sql/docs/postgres/invoke-online-predictions)\n\n- [Build LLM-powered applications using LangChain](/sql/docs/postgres/langchain)"]]