Semantic Search

July 19, 2026 ยท View on GitHub

Code-Graph-RAG supports intent-based code search using UniXcoder embeddings. Find functions by describing what they do rather than by exact names.

Installation

Semantic search requires the semantic extra:

pip install 'code-graph-rag[semantic]'

Qdrant is the default vector store. To use Milvus Lite for semantic vectors, install the milvus extra and set:

pip install 'code-graph-rag[semantic,milvus]'
export CGR_VECTOR_STORE_BACKEND=milvus
export MILVUS_URI="./.milvus_code_embeddings.db"

You can also point MILVUS_URI at a self-hosted open-source Milvus endpoint, such as http://localhost:19530.

OpenAI-Compatible Embedding Providers

By default embeddings are computed locally with UniXcoder (requires the semantic extra's torch/transformers). Alternatively, any OpenAI-compatible embeddings endpoint (OpenAI, Ollama, vLLM, LM Studio, and others) can compute them server-side, so torch and transformers are not needed locally; only the vector store dependency (qdrant-client or the milvus extra) is required:

pip install 'code-graph-rag' qdrant-client
export CGR_EMBEDDING_PROVIDER=openai
export OPENAI_EMBEDDING_BASE_URL="http://localhost:11434/v1"  # default: https://api.openai.com/v1
export OPENAI_EMBEDDING_MODEL="nomic-embed-text"              # default: text-embedding-3-small
export OPENAI_EMBEDDING_API_KEY="sk-..."                      # optional; falls back to OPENAI_API_KEY

Additional settings:

VariableDefaultPurpose
OPENAI_EMBEDDING_DIMENSIONSunsetForwarded as the dimensions request parameter for models that support truncated output
OPENAI_EMBEDDING_BATCH_SIZE128Snippets per HTTP request
OPENAI_EMBEDDING_TIMEOUT60Request timeout in seconds

The vector store dimension must match the embedding model's output. UniXcoder produces 768-dimensional vectors (the default), while text-embedding-3-small produces 1536; set QDRANT_VECTOR_DIM (or MILVUS_VECTOR_DIM) accordingly, or use OPENAI_EMBEDDING_DIMENSIONS to request 768-dimensional output. Cached embeddings are keyed per provider and model, so switching models never replays vectors from another embedding space.

Usage

Generate Code Embeddings

from cgr import embed_code

embedding = embed_code("def authenticate(user, password): ...")
print(f"Embedding dimension: {len(embedding)}")

Search by Description

In the interactive CLI, you can search semantically:

  • "error handling functions"
  • "authentication code"
  • "database connection setup"

The system returns potential matches with similarity scores.

How It Works

UniXcoder is a unified cross-modal pre-trained model that supports both code understanding and generation. Code-Graph-RAG uses it to create embeddings that capture the semantic meaning of code, enabling searches based on what code does rather than what it's named.