1부에서는 PostgreSQL을 pgVector 설정으로 다루었고, 2부에서는 OpenAI 임베딩을 사용하여 벡터 검색을 구현했습니다. 이 마지막 부분에서는 Ollama를 사용하여 로컬에서 벡터 검색을 실행하는 방법을 보여줍니다. ✨
Ollama를 사용하면 다음을 통해 AI 모델을 로컬에서 실행할 수 있습니다.
OpenAI의 1536차원과 비교하여 768차원 벡터를 생성하는 Ollama의 nomic-embed-text 모델을 사용하겠습니다.
Docker 설정에 Ollama를 추가하려면 compose.yml에 다음 서비스를 추가하세요.
services: db: # ... (existing db service) ollama: image: ollama/ollama container_name: ollama-service ports: - "11434:11434" volumes: - ollama_data:/root/.ollama data_loader: # ... (existing data_loader service) environment: - OLLAMA_HOST=ollama depends_on: - db - ollama volumes: pgdata: ollama_data:
그런 다음 서비스를 시작하고 모델을 가져옵니다.
docker compose up -d # Pull the embedding model docker compose exec ollama ollama pull nomic-embed-text # Test embedding generation curl http://localhost:11434/api/embed -d '{ "model": "nomic-embed-text", "input": "Hello World" }'
Ollama 임베딩을 저장하기 위해 데이터베이스 업데이트:
-- Connect to the database docker compose exec db psql -U postgres -d example_db -- Add a column for Ollama embeddings ALTER TABLE items ADD COLUMN embedding_ollama vector(768);
새로 설치하려면 postgres/schema.sql을 업데이트하세요.
CREATE TABLE items ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, item_data JSONB, embedding vector(1536), # OpenAI embedding_ollama vector(768) # Ollama );
Ollama Python 라이브러리를 설치하려면 요구사항.txt를 업데이트하세요.
ollama==0.3.3
다음은 Ollama 임베딩을 추가하기 위한 load_data.py 업데이트의 예입니다.
import ollama # New import def get_embedding_ollama(text: str): """Generate embedding using Ollama API""" response = ollama.embed( model='nomic-embed-text', input=text ) return response["embeddings"][0] def load_books_to_db(): """Load books with embeddings into PostgreSQL""" books = fetch_books() for book in books: description = ( f"Book titled '{book['title']}' by {', '.join(book['authors'])}. " f"Published in {book['first_publish_year']}. " f"This is a book about {book['subject']}." ) # Generate embeddings with both OpenAI and Ollama embedding = get_embedding(description) # OpenAI embedding_ollama = get_embedding_ollama(description) # Ollama # Store in the database store_book(book["title"], json.dumps(book), embedding, embedding_ollama)
이것은 명확성을 위해 단순화된 버전입니다. 전체 소스코드는 여기에 있습니다.
보시다시피 Ollama API 구조는 OpenAI와 유사합니다!
Ollama 임베딩을 사용하여 유사한 항목을 검색하는 검색어:
-- View first 5 dimensions of an embedding SELECT name, (replace(replace(embedding_ollama::text, '[', '{'), ']', '}')::float[])[1:5] as first_dimensions FROM items; -- Search for books about web development: WITH web_book AS ( SELECT embedding_ollama FROM items WHERE name LIKE '%Web%' LIMIT 1 ) SELECT item_data->>'title' as title, item_data->>'authors' as authors, embedding_ollama <=> (SELECT embedding_ollama FROM web_book) as similarity FROM items ORDER BY similarity LIMIT 3;
CREATE INDEX ON items USING ivfflat (embedding_ollama vector_cosine_ops) WITH (lists = 100);
대규모 데이터세트를 처리하는 경우 GPU 지원을 통해 임베딩 생성 속도를 크게 높일 수 있습니다. 자세한 내용은 Ollama Docker 이미지를 참고하세요.
Ollama 도서관은 Ollama 서비스를 어디서 찾을 수 있는지 알아야 합니다. data_loader 서비스에서 OLLAMA_HOST 환경 변수를 설정합니다:
data_loader: environment: - OLLAMA_HOST=ollama
모델을 수동으로 당기기:
docker compose exec ollama ollama pull nomic-embed-text
또는 ollama.pull(
Feature | OpenAI | Ollama |
---|---|---|
Vector Dimensions | 1536 | 768 |
Privacy | Requires API calls | Fully local |
Cost | Pay per API call | Free |
Speed | Network dependent | ~50ms/query |
Setup | API key needed | Docker only |
이 튜토리얼에서는 Ollama를 사용하여 로컬 벡터 검색을 설정하는 방법만 다루었습니다. 실제 애플리케이션에는 다음과 같은 추가 기능이 포함되는 경우가 많습니다.
FastAPI로 구축된 간단한 API를 포함한 전체 소스 코드는 GitHub에서 확인할 수 있습니다. PR과 피드백을 환영합니다!
질문이나 의견이 있으신가요? 아래에 댓글을 남겨주세요! ?
위 내용은 Ollama를 사용하여 벡터 검색을 구현하는 부분의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!