Chroma DB 사용자 가이드 : Python

Usage Guide

JavaScript Usage Guide

지속적인 Chroma 클라이언트 시작

import chromadb

Chroma를 구성하여 로컬 머신에서 저장하고 불러올 수 있습니다. 데이터는 자동으로 유지되며 시작 시에 불러올 수 있습니다(데이터가 존재하는 경우).

client = chromadb.PersistentClient(path="/path/to/save/to")

이 경로는 Chroma가 디스크에 데이터베이스 파일을 저장하고 시작할 때 불러오는 위치입니다.

한 번에 하나의 클라이언트만 사용하세요
동일한 경로에 로딩하고 저장하는 많은 클라이언트가 있으면 이상한 동작이 발생하거나 데이터가 삭제될 수 있습니다. 일반적인 관행으로, 애플리케이션에서 Chroma 클라이언트를 한 번 만들고, 많은 클라이언트를 만들지 않고 대신 전달하세요.

클라이언트 객체에는 몇 가지 유용한 메소드가 있습니다.

client.heartbeat() # 나노초 heartbeat을 반환합니다. 클라이언트가 연결되어 있는지 확인하는 데 유용합니다.
client.reset() # 데이터베이스를 비우고 완전히 재설정합니다. ⚠️ 이것은 파괴적이며 되돌릴 수 없습니다.

클라이언트/서버 모드에서 Chroma 실행

Chroma는 클라이언트/서버 모드에서 실행하도록 구성할 수도 있습니다. 이 모드에서 Chroma 클라이언트는 별도의 프로세스에서 실행 중인 Chroma 서버에 연결합니다.

Chroma 서버를 시작하려면 다음 명령을 실행하세요:

chroma run --path /db_path

그런 다음 Chroma HTTP 클라이언트를 사용하여 서버에 연결하세요:

import chromadb
chroma_client = chromadb.HttpClient(host='localhost', port=8000)

이게 다에요! 이 변경으로 Chroma의 API는 클라이언트-서버 모드에서 실행됩니다.

파이썬 HTTP 전용 클라이언트 사용

클라이언트-서버 모드에서 chroma를 실행하고 있다면, 전체 Chroma 라이브러리가 필요하지 않을 수 있습니다. 대신, 클라이언트 전용 라이브러리를 사용할 수 있습니다. 이 경우, chromadb-client 패키지를 설치할 수 있습니다. 이 패키지는 최소한의 의존성을 가진 서버용 가벼운 HTTP 클라이언트입니다.

pip install chromadb-client
import chromadb

#chroma 서버에 연결하기 위한 클라이언트 예제 설정
client = chromadb.HttpClient(host='localhost', port=8000)

chromadb-client 패키지는 전체 Chroma 라이브러리의 일부이며 모든 의존성을 포함하고 있지 않다는 점에 유의하세요. 전체 Chroma 라이브러리를 사용하려면 대신 chromadb 패키지를 설치할 수 있습니다. 가장 중요한 점은 기본 임베딩 함수가 없다는 것입니다. 임베딩 없이 문서를 추가(add)하려면, 수동으로 임베딩 함수를 지정하고 이에 대한 의존성을 설치해야 합니다.

컬렉션 사용

Chroma는 컬렉션 기본 요소를 사용하여 임베딩 컬렉션을 관리할 수 있게 해줍니다.

컬렉션 생성, 검사 및 삭제

Chroma는 URL에서 컬렉션 이름을 사용하기 때문에 몇 가지 제한 사항이 있습니다:

  • 이름의 길이는 3자에서 63자 사이여야 합니다.
  • 이름은 소문자 또는 숫자로 시작하고 끝나야 하며, 중간에는 점, 대시, 밑줄이 포함될 수 있습니다.
  • 이름에는 연속된 두 개의 점이 포함될 수 없습니다.
  • 이름은 유효한 IP 주소일 수 없습니다.

Chroma 컬렉션은 이름과 선택적인 임베딩 함수로 생성됩니다. 임베딩 함수를 제공하면, 컬렉션을 가져올 때마다 제공해야 합니다.

collection = client.create_collection(name="my_collection", embedding_function=emb_fn)
collection = client.get_collection(name="my_collection", embedding_function=emb_fn)

주의
나중에 get_collection을 원하면, 컬렉션을 생성할 때 제공한 임베딩 함수로 수행해야 합니다.

임베딩 함수는 텍스트를 입력으로 받아 토큰화와 임베딩을 수행합니다. 임베딩 함수가 제공되지 않으면, Chroma는 기본적으로 문장 변환기(sentence transfomer)를 사용합니다.

🧬 임베딩 함수에 대해 더 알아보고, 어떻게 자신만의 것을 만들 수 있는지 알아볼 수 있습니다.

기존 컬렉션은 이름으로 .get_collection을 사용하여 검색할 수 있으며, .delete_collection을 사용하여 삭제할 수 있습니다. 또한 .get_or_create_collection을 사용하여 컬렉션이 존재하면 가져오고, 존재하지 않으면 생성할 수 있습니다.

collection = client.get_collection(name="test")  # 이름으로 기존 컬렉션에서 컬렉션 객체를 가져옵니다. 찾을 수 없으면 예외가 발생합니다.
collection = client.get_or_create_collection(name="test")  # 이름으로 기존 컬렉션에서 컬렉션 객체를 가져옵니다. 존재하지 않으면 생성합니다.
client.delete_collection(name="my_collection")  # 컬렉션과 모든 관련 임베딩, 문서 및 메타데이터를 삭제합니다. ⚠️ 이것은 파괴적이며 되돌릴 수 없습니다.

컬렉션에는 몇 가지 유용한 메소드가 있습니다.

collection.peek()  # 컬렉션의 처음 10개 항목의 목록을 반환합니다.
collection.count()  # 컬렉션의 항목 수를 반환합니다.
collection.modify(name="new_name")  # 컬렉션의 이름을 변경합니다.

거리 함수 변경(Changing the distance function)

create_collection은 선택적으로 metadata 인수를 사용하여 hnsw:space의 값을 설정함으로써 임베딩 공간의 거리 방법을 사용자 정의할 수 있습니다.

 collection = client.create_collection(
        name="collection_name",
        metadata={"hnsw:space": "cosine"}  # 기본값은 l2입니다.
    )

hnsw:space에 대한 유효한 옵션은 “l2”, “ip”, “cosine”입니다. 기본값은 “l2″로 제곱 L2 노름(squared L2 norm)입니다.

거리매개변수방정식
제곱 L2‘l2’(d = \sum\left(A_i-B_i\right)^2)
내적‘ip’(d = 1.0 – \sum\left(A_i \times B_i\right) )
코사인 유사도‘cosine’(d = 1.0 – \frac{\sum\left(A_i \times B_i\right)}{\sqrt{\sum\left(A_i^2\right)} \cdot \sqrt{\sum\left(B_i^2\right)}})

컬렉션에 데이터 추가

.add를 사용하여 Chroma에 데이터를 추가합니다.

원본 문서:

collection.add(
    documents=["lorem ipsum...", "doc2", "doc3", ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

Chroma에 문서 리스트가 전달되면, 컬렉션의 임베딩 함수(컬렉션 생성 시 제공되지 않은 경우 기본값 사용)를 사용하여 자동으로 토큰화하고 임베딩합니다. Chroma는 또한 문서 자체를 저장합니다. 문서가 선택한 임베딩 함수를 사용하여 임베딩하기에 너무 큰 경우 예외가 발생합니다.

각 문서에는 고유한 ID가 있어야 합니다. 동일한 ID를 두 번 .add하려고 하면 초기 값만 저장됩니다. 각 문서에 대해 메타데이터 딕셔너리의 선택적 목록을 제공하여 추가 정보를 저장하고 필터링을 활성화할 수 있습니다.

또는, 문서와 관련된 임베딩의 목록을 직접 제공할 수 있으며, Chroma는 임베딩 없이 관련 문서를 저장합니다.

collection.add(
    documents=["doc1", "doc2", "doc3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

# 제공된 임베딩이 컬렉션과 동일한 차원이 아닌 경우 예외가 발생합니다.

문서를 다른 곳에 저장하고, Chroma에 임베딩과 메타데이터의 목록만 제공할 수도 있습니다. 아이디를 사용하여 다른 곳에 저장된 문서와 임베딩을 연결할 수 있습니다.

collection.add(
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

위 코드는 Chroma 컬렉션에 데이터를 추가하는 방법을 보여줍니다. 첫 번째 예제에서는 문서, 임베딩, 메타데이터, 및 아이디를 모두 제공하여 컬렉션에 데이터를 추가합니다. 임베딩의 차원이 컬렉션의 차원과 일치하지 않으면 예외가 발생합니다.

두 번째 예제에서는 문서를 다른 곳에 저장하고 Chroma에 임베딩과 메타데이터만 제공합니다. 이렇게 하면 아이디를 사용하여 다른 곳에 저장된 문서와 임베딩을 연결할 수 있습니다.

컬렉션 쿼리하기

Chroma 컬렉션은 .query 메소드를 사용하여 다양한 방법으로 쿼리할 수 있습니다.

query_embeddings 집합으로 쿼리할 수 있습니다.

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

쿼리는 각 query_embedding에 대해 가장 가까운 n_results 매치를 순서대로 반환합니다. 선택적으로 where 필터 딕셔너리를 제공하여 각 문서와 관련된 메타데이터별로 필터링할 수 있습니다. 또한, 선택적으로 where_document 필터 딕셔너리를 제공하여 문서의 내용별로 필터링할 수 있습니다.

제공된 query_embeddings가 컬렉션과 동일한 차원이 아닌 경우 예외가 발생합니다.

query_texts 집합으로도 쿼리할 수 있습니다. Chroma는 먼저 컬렉션의 임베딩 함수로 각 query_text를 임베딩한 후, 생성된 임베딩으로 쿼리를 수행합니다.

collection.query(
    query_texts=["doc10", "thus spake zarathustra", ...],
    n_results=10,
    where={"metadata_field": "is_equal_to_this"},
    where_document={"$contains":"search_string"}
)

id를 사용하여 컬렉션에서 항목을 검색할 수도 있습니다.

collection.get(
    ids=["id1", "id2", "id3", ...],
    where={"style": "style1"}
)

.getwherewhere_document 필터를 지원합니다. 아이디가 제공되지 않으면, wherewhere_document 필터와 일치하는 컬렉션의 모든 항목을 반환합니다.

반환할 데이터 선택하기
get 또는 query를 사용할 때 include 매개변수를 사용하여 반환할 데이터를 지정할 수 있습니다 – embeddings, documents, metadatasquery의 경우 distances 중 어떤 데이터든 선택할 수 있습니다. 기본적으로 Chroma는 문서, 메타데이터를 반환하며, query의 경우 결과의 거리를 반환합니다. 성능을 위해 embeddings는 기본적으로 제외되며 ids는 항상 반환됩니다. query 또는 get 메소드의 includes 매개변수에 포함된 필드 이름의 배열을 전달하여 반환할 항목을 지정할 수 있습니다.

# 문서와 id만 가져오기
collection.get({
    include: [ "documents" ]
})

collection.query({
    queryEmbeddings: [[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    include: [ "documents" ]
})

이 예제에서는 include 매개변수를 사용하여 documentsids만 반환하도록 지정합니다. 이 방법을 사용하면 필요한 데이터만 선택적으로 반환할 수 있어, 성능을 개선하고 불필요한 데이터 전송을 줄일 수 있습니다.

Where 필터 사용하기

Chroma는 메타데이터와 문서 내용을 기준으로 쿼리를 필터링하는 것을 지원합니다. where 필터는 메타데이터를 기준으로 필터링하는 데 사용되며, where_document 필터는 문서 내용을 기준으로 필터링하는 데 사용됩니다.

  1. 메타데이터 필터링 (where 필터):
    • where 필터를 사용하면 특정 메타데이터 필드의 값이 특정 조건을 충족하는 문서를 필터링할 수 있습니다.
    • 예를 들어, {"metadata_field": "is_equal_to_this"}와 같은 where 필터는 metadata_field라는 메타데이터 필드의 값이 "is_equal_to_this"인 문서만 반환합니다.

collection.query( query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...], n_results=10, where={"metadata_field": "is_equal_to_this"} )

  1. 문서 내용 필터링 (where_document 필터):
    • where_document 필터를 사용하면 문서 내용이 특정 문자열을 포함하는 문서를 필터링할 수 있습니다.
    • 예를 들어, {"$contains":"search_string"}와 같은 where_document 필터는 문서 내용에 "search_string"이 포함된 문서만 반환합니다.

pythonCopy code

collection.query( query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...], n_results=10, where_document={"$contains":"search_string"} )

이러한 필터를 사용하면 쿼리 결과를 더욱 세밀하게 제어할 수 있어, 특정 조건을 충족하는 문서만 검색하거나 반환할 수 있습니다.

메타데이터 필터링
메타데이터를 필터링하려면 쿼리에 where 필터 딕셔너리를 제공해야 합니다. 딕셔너리는 다음 구조를 가져야 합니다:

{
    "metadata_field": {
        <Operator>: <Value>
    }
}

메타데이터 필터링은 다음 연산자를 지원합니다:

  • $eq – 동일 (문자열, 정수, 부동 소수점)
  • $ne – 동일하지 않음 (문자열, 정수, 부동 소수점)
  • $gt – 큼 (정수, 부동 소수점)
  • $gte – 크거나 같음 (정수, 부동 소수점)
  • $lt – 작음 (정수, 부동 소수점)
  • $lte – 작거나 같음 (정수, 부동 소수점)

예를 들어, 특정 메타데이터 필드의 값이 10보다 큰 문서만 검색하려면 다음과 같이 쿼리를 작성할 수 있습니다:

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={"metadata_field": {"$gt": 10}}
)

이 예에서 metadata_field는 필터링하려는 메타데이터 필드의 이름이며, $gt 연산자는 ‘크다’를 나타냅니다. 이 쿼리는 metadata_field의 값이 10보다 큰 문서만 반환합니다.

$eq 연산자 사용하기는 where 필터를 사용하는 것과 동일합니다.

{
    "metadata_field": "search_string"
}

# 이것은 아래와 동일합니다

{
    "metadata_field": {
        "$eq": "search_string"
    }
}

참고
Where 필터는 키가 존재하는 임베딩만 검색합니다. 만약 collection.get(where={"version": {"$ne": 1}})를 검색한다면, 키 version이 없는 메타데이터는 반환되지 않습니다.

이는 where 필터를 사용할 때 특정 키가 존재하는 메타데이터만 검색 대상이 됨을 의미합니다. 이렇게 하면 필터링을 더욱 세밀하게 제어할 수 있어, 특정 조건을 충족하는 메타데이터를 가진 문서만 검색하거나 반환할 수 있습니다.

문서 내용으로 필터링하기
문서 내용을 기준으로 필터링하려면 쿼리에 where_document 필터 딕셔너리를 제공해야 합니다. 딕셔너리는 다음 구조를 가져야 합니다:

# search_string을 찾아서 필터링하기
{
    "$contains": "search_string"
}

이 구조를 사용하면, search_string을 포함하는 문서만 쿼리 결과로 반환됩니다. 이렇게 하면 특정 키워드나 구문을 포함하는 문서를 찾는 데 유용하며, 해당 필터는 문서의 내용을 기준으로 쿼리를 수행합니다.

예를 들어, 특정 문자열이 포함된 문서를 검색하려면 다음과 같이 쿼리를 작성할 수 있습니다:

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where_document={"$contains": "search_string"}
)

이 예에서 "$contains": "search_string" 필터는 search_string 문자열이 포함된 문서만 반환하도록 지정합니다.

논리 연산자 사용하기
$and$or 논리 연산자를 사용하여 여러 필터를 결합할 수도 있습니다.

$and 연산자는 리스트에 있는 모든 필터와 일치하는 결과를 반환합니다.

{
    "$and": [
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        },
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        }
    ]
}

$or 연산자는 리스트에 있는 필터 중 어떤 것과도 일치하는 결과를 반환합니다.

{
    "$or": [
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        },
        {
            "metadata_field": {
                <Operator>: <Value>
            }
        }
    ]
}

예를 들어, 두 개의 서로 다른 메타데이터 필드의 값이 특정 조건을 충족하는 문서를 찾으려면 $and 연산자를 사용할 수 있습니다.

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={
        "$and": [
            {"metadata_field1": {"$eq": "value1"}},
            {"metadata_field2": {"$gt": 10}}
        ]
    }
)

이 예에서는 metadata_field1의 값이 "value1"이고 metadata_field2의 값이 10보다 큰 문서만 반환합니다.

반대로, 두 조건 중 하나만 충족하는 문서를 찾으려면 $or 연산자를 사용할 수 있습니다.

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={
        "$or": [
            {"metadata_field1": {"$eq": "value1"}},
            {"metadata_field2": {"$gt": 10}}
        ]
    }
)

이 예에서는 metadata_field1의 값이 "value1"이거나 metadata_field2의 값이 10보다 큰 문서를 반환합니다.

포함 연산자 사용하기 ($in$nin)
다음 포함 연산자가 지원됩니다:

  • $in – 값이 미리 정의된 목록에 포함됨 (문자열, 정수, 부동 소수점, 불린)
  • $nin – 값이 미리 정의된 목록에 포함되지 않음 (문자열, 정수, 부동 소수점, 불린)

$in 연산자는 메타데이터 속성이 제공된 목록의 일부인 결과를 반환합니다:

{
  "metadata_field": {
    "$in": ["value1", "value2", "value3"]
  }
}

$nin 연산자는 메타데이터 속성이 제공된 목록의 일부가 아닌 결과를 반환합니다:

{
  "metadata_field": {
    "$nin": ["value1", "value2", "value3"]
  }
}

실용적인 예시:
포함 연산자를 사용하는 방법에 대한 추가 예제와 데모는 여기 제공된 노트북을 참조하십시오.

예를 들어, 특정 메타데이터 필드의 값이 미리 정의된 목록 중 하나와 일치하는 문서를 찾으려면 다음과 같이 쿼리를 작성할 수 있습니다:

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    n_results=10,
    where={
        "metadata_field": {
            "$in": ["value1", "value2", "value3"]
        }
    }
)

이 예에서 $in 연산자는 metadata_field의 값이 ["value1", "value2", "value3"] 목록 중 하나와 일치하는 문서만 반환하도록 지정합니다.

컬렉션 내 데이터 업데이트하기

컬렉션의 항목 중 어떤 속성이든 .update를 사용하여 업데이트할 수 있습니다.

collection.update(
    ids=["id1", "id2", "id3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

컬렉션에 ID가 없으면 오류가 기록되고 업데이트가 무시됩니다. 문서가 해당 임베딩 없이 제공되면 임베딩이 컬렉션의 임베딩 함수로 다시 계산됩니다.

제공된 임베딩이 컬렉션과 같은 차원이 아니면 예외가 발생합니다.

Chroma는 기존 항목을 업데이트하거나 아직 존재하지 않으면 추가하는 upsert 연산도 지원합니다.

collection.upsert(
    ids=["id1", "id2", "id3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

컬렉션에 ID가 없으면 해당 항목이 add에 따라 생성됩니다. 기존 ID가 있는 항목은 update에 따라 업데이트됩니다.

이렇게 하면, 기존 데이터를 수정하거나 필요한 경우 새 데이터를 컬렉션에 추가할 수 있어 데이터 관리가 더 유연해집니다.

컬렉션에서 데이터 삭제하기

Chroma는 .delete를 사용하여 ID별로 컬렉션의 항목을 삭제하는 것을 지원합니다. 각 항목과 관련된 임베딩, 문서, 메타데이터가 삭제됩니다. ⚠️ 당연히 이는 파괴적인 작업이며, 취소할 수 없습니다.

collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

.deletewhere 필터도 지원합니다. ID가 제공되지 않으면, where 필터와 일치하는 컬렉션의 모든 항목을 삭제합니다.

이 코드 스니펫을 통해, 특정 조건을 충족하는 항목을 삭제하거나, 컬렉션에서 특정 ID의 항목을 삭제할 수 있습니다. 이렇게 하면 데이터 관리가 더욱 간편해지며, 불필요한 또는 오래된 데이터를 효과적으로 정리할 수 있습니다.

인증(Authentication)

서버/클라이언트 모드에서만 Chroma를 인증을 사용하도록 구성할 수 있습니다.

지원되는 인증 방법은 다음과 같습니다:

인증 방법기본 인증 (Pre-emptive)정적 API 토큰
설명RFC 7617 기본 인증으로 user:password를 base64 인코딩된 Authorization 헤더 사용.정적 인증 토큰을 Authorization: Bearer 또는 X-Chroma-Token: 헤더에 사용.
상태알파알파
서버 측 지원✅ 알파✅ 알파
클라이언트/파이썬✅ 알파✅ 알파
클라이언트/JS✅ 알파✅ 알파

기본 인증 (Pre-emptive)은 사용자 이름과 비밀번호를 base64로 인코딩하여 HTTP Authorization 헤더에 포함시켜 인증을 수행합니다. 이 방식은 RFC 7617에 따라 구현되며, Chroma 서버와 클라이언트 모두에서 알파 상태로 지원됩니다.

정적 API 토큰 방식은 Authorization: Bearer <token> 또는 X-Chroma-Token: <token> 헤더에 토큰을 포함시켜 인증을 수행합니다. 이 방식도 Chroma 서버와 클라이언트 모두에서 알파 상태로 지원됩니다.

이 두 인증 방법 모두 Chroma를 보안 환경에서 실행하고 외부 접근을 제어하기 위한 방법을 제공합니다. 인증 방법을 선택할 때 애플리케이션의 보안 요구 사항과 어떤 방식이 더 적합한지 고려해야 합니다.

기본 인증(Basic Authentication)

서버 설정

서버 측 자격 증명 생성
보안 관행
비밀번호를 안전하게 저장하는 것이 좋은 보안 관행입니다. 아래 예시에서는 bcrypt를 사용하여 평문 비밀번호를 해시합니다(현재 Chroma 서버 측 인증에서 지원되는 유일한 해시).

비밀번호 해시를 생성하려면 다음 명령을 실행하세요. 시스템에 htpasswd가 설치되어 있어야 한다는 점에 유의하세요.

htpasswd -Bbn admin admin > server.htpasswd

서버 실행
다음 환경 변수를 설정하세요:

export CHROMA_SERVER_AUTH_CREDENTIALS_FILE="server.htpasswd"
export CHROMA_SERVER_AUTH_CREDENTIALS_PROVIDER='chromadb.auth.providers.HtpasswdFileServerAuthCredentialsProvider'
export CHROMA_SERVER_AUTH_PROVIDER='chromadb.auth.basic.BasicAuthServerProvider'

그리고 서버를 평소처럼 실행하세요:

chroma run --path /db_path

위의 명령어와 설정은 Chroma 서버에서 기본 인증을 활성화하고 설정하는 방법을 보여줍니다. server.htpasswd 파일에 저장된 자격 증명을 사용하여 인증을 수행하며, 이는 chromadb.auth.providers.HtpasswdFileServerAuthCredentialsProviderchromadb.auth.basic.BasicAuthServerProvider를 사용하여 처리됩니다.

이 설정을 통해 Chroma 서버에 기본 인증을 구성할 수 있으며, 이는 서버에 대한 보안 접근을 제어하는 데 도움이 됩니다.

클라이언트 설정

기본 인증을 사용하여 Chroma 클라이언트를 설정하려면 아래와 같이 코드를 작성할 수 있습니다.

import chromadb
from chromadb.config import Settings

client = chromadb.HttpClient(
  settings=Settings(chroma_client_auth_provider="chromadb.auth.basic.BasicAuthClientProvider",
                    chroma_client_auth_credentials="admin:admin"))
client.heartbeat()  # 인증 여부와 관계없이 작동해야 함 - 이는 공개 엔드포인트입니다.

client.get_version()  # 인증 여부와 관계없이 작동해야 함 - 이는 공개 엔드포인트입니다.

client.list_collections()  # 이는 보호된 엔드포인트이며 인증이 필요합니다.

이 코드는 기본 인증을 사용하여 Chroma 클라이언트를 설정하고, 몇 가지 엔드포인트를 테스트합니다.

정적 API 토큰 인증

토큰은 영숫자 ASCII 문자열이어야 하며, 대소문자를 구분합니다.

서버 설정

현재 정적 API 토큰 인증 구현은 ENV 기반 토큰만 지원합니다.

서버 실행

다음 환경 변수를 설정합니다:

export CHROMA_SERVER_AUTH_CREDENTIALS="test-token"
export CHROMA_SERVER_AUTH_CREDENTIALS_PROVIDER="chromadb.auth.token.TokenConfigServerAuthCredentialsProvider"
export CHROMA_SERVER_AUTH_PROVIDER="chromadb.auth.token.TokenAuthServerProvider"

클라이언트 설정

import chromadb
from chromadb.config import Settings

client = chromadb.HttpClient(
    settings=Settings(chroma_client_auth_provider="chromadb.auth.token.TokenAuthClientProvider",
                      chroma_client_auth_credentials="test-token"))
client.heartbeat()  # 인증 여부와 관계없이 작동해야 함 - 이는 공개 엔드포인트입니다.

client.get_version()  # 인증 여부와 관계없이 작동해야 함 - 이는 공개 엔드포인트입니다.

client.list_collections()  # 이는 보호된 엔드포인트이며 인증이 필요합니다.

이 코드 스니펫은 정적 API 토큰을 사용하여 Chroma 클라이언트를 설정하고, 몇 가지 엔드포인트를 테스트합니다. 이 설정을 통해 클라이언트는 보호된 엔드포인트에 접근하기 위해 필요한 인증을 수행할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다