diff --git a/README.md b/README.md index 86f58da8d2..5db8f26861 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,6 @@ The initially supported `Microservices` are described in the below table. More ` A `Microservices` can be created by using the decorator `register_microservice`. Taking the `embedding microservice` as an example: ```python -from langchain_community.embeddings import HuggingFaceHubEmbeddings - from comps import register_microservice, EmbedDoc, ServiceType, TextDoc diff --git a/comps/retrievers/deployment/docker_compose/compose.yaml b/comps/retrievers/deployment/docker_compose/compose.yaml index 708f7819d0..2d82f6570c 100644 --- a/comps/retrievers/deployment/docker_compose/compose.yaml +++ b/comps/retrievers/deployment/docker_compose/compose.yaml @@ -3,6 +3,7 @@ include: - ../../../third_parties/elasticsearch/deployment/docker_compose/compose.yaml + - ../../../third_parties/milvus/deployment/docker_compose/compose.yaml - ../../../third_parties/opensearch/deployment/docker_compose/compose.yaml - ../../../third_parties/neo4j/deployment/docker_compose/compose.yaml - ../../../third_parties/pgvector/deployment/docker_compose/compose.yaml @@ -49,6 +50,12 @@ services: depends_on: tei-embedding-serving: condition: service_healthy + standalone: + condition: service_healthy + etcd: + condition: service_healthy + minio: + condition: service_healthy retriever-neo4j: extends: retriever diff --git a/comps/retrievers/src/README_elasticsearch.md b/comps/retrievers/src/README_elasticsearch.md index 6ff1728995..5905c48b4d 100644 --- a/comps/retrievers/src/README_elasticsearch.md +++ b/comps/retrievers/src/README_elasticsearch.md @@ -50,6 +50,7 @@ Please refer to this [readme](../../third_parties/elasticsearch/src/README.md). ```bash export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" +export HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_ELASTICSEARCH" python opea_retrievers_microservice.py ``` @@ -64,6 +65,7 @@ export ES_CONNECTION_STRING="http://localhost:9200" export INDEX_NAME=${your_index_name} export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_ELASTICSEARCH" +export HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} ``` ### 2.2 Build Docker Image @@ -83,7 +85,8 @@ You can choose one as needed. ### 2.3 Run Docker with CLI (Option A) ```bash -docker run -d --name="retriever-elasticsearch" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e ES_CONNECTION_STRING=$ES_CONNECTION_STRING -e INDEX_NAME=$INDEX_NAME -e TEI_ENDPOINT=$TEI_ENDPOINT opea/retriever:latest +docker run -d --name="retriever-elasticsearch" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e ES_CONNECTION_STRING=$ES_CONNECTION_STRING -e INDEX_NAME=$INDEX_NAME -e TEI_EMBEDDING_ENDPOINT=${TEI_EMBEDDING_ENDPOINT} +-e HUGGINGFACEHUB_API_TOKEN=${HUGGINGFACEHUB_API_TOKEN} opea/retriever:latest ``` ### 2.4 Run Docker with Docker Compose (Option B) diff --git a/comps/retrievers/src/README_milvus.md b/comps/retrievers/src/README_milvus.md index 178112c279..d3f94562f9 100644 --- a/comps/retrievers/src/README_milvus.md +++ b/comps/retrievers/src/README_milvus.md @@ -22,12 +22,13 @@ export MILVUS_HOST=${your_milvus_host_ip} export MILVUS_PORT=19530 export COLLECTION_NAME=${your_collection_name} export TEI_EMBEDDING_ENDPOINT=${your_emdding_endpoint} +export HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} ``` ### Start Retriever Service ```bash -export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" +export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:${your_embedding_port}" export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_MILVUS" python opea_retrievers_microservice.py ``` @@ -44,7 +45,7 @@ docker build -t opea/retriever:latest --build-arg https_proxy=$https_proxy --bui ### Run Docker with CLI (Option A) ```bash -docker run -d --name="retriever-milvus-server" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e TEI_EMBEDDING_ENDPOINT=${your_emdding_endpoint} -e MILVUS_HOST=${your_milvus_host_ip} -e RETRIEVER_COMPONENT_NAME=$RETRIEVER_COMPONENT_NAME opea/retriever:latest +docker run -d --name="retriever-milvus-server" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e no_proxy=$no_proxy -e TEI_EMBEDDING_ENDPOINT=${your_emdding_endpoint} -e MILVUS_HOST=${your_milvus_host_ip} -e HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} -e RETRIEVER_COMPONENT_NAME=$RETRIEVER_COMPONENT_NAME opea/retriever:latest ``` ### Run Docker with Docker Compose (Option B) diff --git a/comps/retrievers/src/README_opensearch.md b/comps/retrievers/src/README_opensearch.md index 0984553a0c..ee7cf6f39e 100644 --- a/comps/retrievers/src/README_opensearch.md +++ b/comps/retrievers/src/README_opensearch.md @@ -44,6 +44,7 @@ Please refer to this [readme](../../third_parties/opensearch/src/README.md). ```bash export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_OPENSEARCH" +export HUGGINGFACEHUB_API_TOKEN=${your_hf_token} python opea_retrievers_microservice.py ``` diff --git a/comps/retrievers/src/README_vdms.md b/comps/retrievers/src/README_vdms.md index 1e699cf291..7bfef451ec 100644 --- a/comps/retrievers/src/README_vdms.md +++ b/comps/retrievers/src/README_vdms.md @@ -65,6 +65,7 @@ Please refer to this [readme](../../third_parties/vdms/src/README.md). ```bash export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" +export HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_VDMS" python opea_retrievers_microservice.py ``` @@ -77,6 +78,7 @@ python opea_retrievers_microservice.py export RETRIEVE_MODEL_ID="BAAI/bge-base-en-v1.5" export INDEX_NAME=${your_index_name or collection_name} export TEI_EMBEDDING_ENDPOINT="http://${your_ip}:6060" +export HUGGINGFACEHUB_API_TOKEN=${your_hf_api_token} export RETRIEVER_COMPONENT_NAME="OPEA_RETRIEVER_VDMS" ``` @@ -97,7 +99,7 @@ You can choose one as needed. ### 2.3 Run Docker with CLI (Option A) ```bash -docker run -d --name="retriever-vdms-server" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e INDEX_NAME=$INDEX_NAME -e TEI_EMBEDDING_ENDPOINT=$TEI_EMBEDDING_ENDPOINT -e RETRIEVER_COMPONENT_NAME=$RETRIEVER_COMPONENT_NAME opea/retriever:latest +docker run -d --name="retriever-vdms-server" -p 7000:7000 --ipc=host -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e INDEX_NAME=$INDEX_NAME -e TEI_EMBEDDING_ENDPOINT=$TEI_EMBEDDING_ENDPOINT -e HUGGINGFACEHUB_API_TOKEN=${HUGGINGFACEHUB_API_TOKEN} -e RETRIEVER_COMPONENT_NAME=$RETRIEVER_COMPONENT_NAME opea/retriever:latest ``` ### 2.4 Run Docker with Docker Compose (Option B) diff --git a/comps/retrievers/src/integrations/config.py b/comps/retrievers/src/integrations/config.py index 3ffced0820..45149c0e4b 100644 --- a/comps/retrievers/src/integrations/config.py +++ b/comps/retrievers/src/integrations/config.py @@ -44,8 +44,9 @@ def get_boolean_env_var(var_name, default_value=False): # Embedding model EMBED_MODEL = os.getenv("EMBED_MODEL", "BAAI/bge-base-en-v1.5") LOCAL_EMBEDDING_MODEL = os.getenv("LOCAL_EMBEDDING_MODEL", "maidalun1020/bce-embedding-base_v1") -TEI_EMBEDDING_ENDPOINT = os.getenv("TEI_EMBEDDING_ENDPOINT") +TEI_EMBEDDING_ENDPOINT = os.getenv("TEI_EMBEDDING_ENDPOINT", "") BRIDGE_TOWER_EMBEDDING = os.getenv("BRIDGE_TOWER_EMBEDDING", False) +HUGGINGFACEHUB_API_TOKEN = os.getenv("HUGGINGFACEHUB_API_TOKEN", "") # Directory pathss current_file_path = os.path.abspath(__file__) @@ -122,7 +123,6 @@ def format_redis_conn_from_env(): COLLECTION_NAME = os.getenv("COLLECTION_NAME", "rag_milvus") # TEI configuration TEI_EMBEDDING_MODEL = os.environ.get("TEI_EMBEDDING_MODEL", "/home/user/bce-embedding-base_v1") -TEI_EMBEDDING_ENDPOINT = os.environ.get("TEI_EMBEDDING_ENDPOINT", "") os.environ["OPENAI_API_BASE"] = TEI_EMBEDDING_ENDPOINT os.environ["OPENAI_API_KEY"] = "Dummy key" diff --git a/comps/retrievers/src/integrations/elasticsearch.py b/comps/retrievers/src/integrations/elasticsearch.py index 08b358e398..72dc2952f4 100644 --- a/comps/retrievers/src/integrations/elasticsearch.py +++ b/comps/retrievers/src/integrations/elasticsearch.py @@ -5,12 +5,13 @@ import os from elasticsearch import Elasticsearch -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_elasticsearch import ElasticsearchStore from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType -from .config import EMBED_MODEL, ES_CONNECTION_STRING, ES_INDEX_NAME, TEI_EMBEDDING_ENDPOINT +from .config import EMBED_MODEL, ES_CONNECTION_STRING, ES_INDEX_NAME, HUGGINGFACEHUB_API_TOKEN, TEI_EMBEDDING_ENDPOINT logger = CustomLogger("es_retrievers") logflag = os.getenv("LOGFLAG", False) @@ -40,7 +41,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: diff --git a/comps/retrievers/src/integrations/milvus.py b/comps/retrievers/src/integrations/milvus.py index b78c33c024..a8655a29c5 100644 --- a/comps/retrievers/src/integrations/milvus.py +++ b/comps/retrievers/src/integrations/milvus.py @@ -3,14 +3,21 @@ import os -from typing import List, Optional -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_milvus.vectorstores import Milvus from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType -from .config import COLLECTION_NAME, INDEX_PARAMS, LOCAL_EMBEDDING_MODEL, MILVUS_URI, TEI_EMBEDDING_ENDPOINT +from .config import ( + COLLECTION_NAME, + HUGGINGFACEHUB_API_TOKEN, + INDEX_PARAMS, + LOCAL_EMBEDDING_MODEL, + MILVUS_URI, + TEI_EMBEDDING_ENDPOINT, +) logger = CustomLogger("milvus_retrievers") logflag = os.getenv("LOGFLAG", False) @@ -28,7 +35,6 @@ def __init__(self, name: str, description: str, config: dict = None): super().__init__(name, ServiceType.RETRIEVER.name.lower(), description, config) self.embedder = self._initialize_embedder() - self.client = self._initialize_client() health_status = self.check_health() if not health_status: logger.error("OpeaMilvusRetriever health check failed.") @@ -38,7 +44,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: @@ -70,7 +91,14 @@ def check_health(self) -> bool: if logflag: logger.info("[ check health ] start to check health of milvus") try: - _ = self.client.client.list_collections() + client = Milvus( + embedding_function=self.embedder, + collection_name=COLLECTION_NAME, + connection_args={"uri": MILVUS_URI}, + index_params=INDEX_PARAMS, + auto_id=True, + ) + _ = client.client.list_collections() if logflag: logger.info("[ check health ] Successfully connected to Milvus!") return True @@ -89,21 +117,29 @@ async def invoke(self, input: EmbedDoc) -> list: if logflag: logger.info(input) + my_milvus = Milvus( + embedding_function=self.embedder, + collection_name=COLLECTION_NAME, + connection_args={"uri": MILVUS_URI}, + index_params=INDEX_PARAMS, + auto_id=True, + ) + if input.search_type == "similarity": - search_res = await self.client.asimilarity_search_by_vector(embedding=input.embedding, k=input.k) + search_res = await my_milvus.asimilarity_search_by_vector(embedding=input.embedding, k=input.k) elif input.search_type == "similarity_distance_threshold": if input.distance_threshold is None: raise ValueError("distance_threshold must be provided for " + "similarity_distance_threshold retriever") - search_res = await self.client.asimilarity_search_by_vector( + search_res = await my_milvus.asimilarity_search_by_vector( embedding=input.embedding, k=input.k, distance_threshold=input.distance_threshold ) elif input.search_type == "similarity_score_threshold": - docs_and_similarities = await self.client.asimilarity_search_with_relevance_scores( + docs_and_similarities = await my_milvus.asimilarity_search_with_relevance_scores( query=input.text, k=input.k, score_threshold=input.score_threshold ) search_res = [doc for doc, _ in docs_and_similarities] elif input.search_type == "mmr": - search_res = await self.client.amax_marginal_relevance_search( + search_res = await my_milvus.amax_marginal_relevance_search( query=input.text, k=input.k, fetch_k=input.fetch_k, lambda_mult=input.lambda_mult ) diff --git a/comps/retrievers/src/integrations/opensearch.py b/comps/retrievers/src/integrations/opensearch.py index 30514d7107..229ee078e2 100644 --- a/comps/retrievers/src/integrations/opensearch.py +++ b/comps/retrievers/src/integrations/opensearch.py @@ -6,7 +6,8 @@ from typing import Callable, List, Union import numpy as np -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_community.vectorstores import OpenSearchVectorSearch from pydantic import conlist @@ -15,6 +16,7 @@ from .config import ( EMBED_MODEL, + HUGGINGFACEHUB_API_TOKEN, OPENSEARCH_INDEX_NAME, OPENSEARCH_INITIAL_ADMIN_PASSWORD, OPENSEARCH_URL, @@ -49,7 +51,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: diff --git a/comps/retrievers/src/integrations/pgvector.py b/comps/retrievers/src/integrations/pgvector.py index 164a382473..81d913c2d2 100644 --- a/comps/retrievers/src/integrations/pgvector.py +++ b/comps/retrievers/src/integrations/pgvector.py @@ -4,12 +4,13 @@ import os -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_community.vectorstores import PGVector from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType -from .config import EMBED_MODEL, PG_CONNECTION_STRING, PG_INDEX_NAME, TEI_EMBEDDING_ENDPOINT +from .config import EMBED_MODEL, HUGGINGFACEHUB_API_TOKEN, PG_CONNECTION_STRING, PG_INDEX_NAME, TEI_EMBEDDING_ENDPOINT logger = CustomLogger("pgvector_retrievers") logflag = os.getenv("LOGFLAG", False) @@ -39,7 +40,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: diff --git a/comps/retrievers/src/integrations/pinecone.py b/comps/retrievers/src/integrations/pinecone.py index c8c048a42b..a6713d84ed 100644 --- a/comps/retrievers/src/integrations/pinecone.py +++ b/comps/retrievers/src/integrations/pinecone.py @@ -5,13 +5,14 @@ import os import time -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_pinecone import PineconeVectorStore from pinecone import Pinecone, ServerlessSpec from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType -from .config import EMBED_MODEL, PINECONE_API_KEY, PINECONE_INDEX_NAME, TEI_EMBEDDING_ENDPOINT +from .config import EMBED_MODEL, HUGGINGFACEHUB_API_TOKEN, PINECONE_API_KEY, PINECONE_INDEX_NAME, TEI_EMBEDDING_ENDPOINT logger = CustomLogger("pinecone_retrievers") logflag = os.getenv("LOGFLAG", False) @@ -41,7 +42,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: diff --git a/comps/retrievers/src/integrations/vdms.py b/comps/retrievers/src/integrations/vdms.py index 5e5b1731fa..9b8d500da6 100644 --- a/comps/retrievers/src/integrations/vdms.py +++ b/comps/retrievers/src/integrations/vdms.py @@ -3,9 +3,9 @@ import os -import time -from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceHubEmbeddings +from fastapi import HTTPException +from langchain_community.embeddings import HuggingFaceBgeEmbeddings, HuggingFaceInferenceAPIEmbeddings from langchain_community.vectorstores.vdms import VDMS, VDMS_Client from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType @@ -13,6 +13,7 @@ from .config import ( DISTANCE_STRATEGY, EMBED_MODEL, + HUGGINGFACEHUB_API_TOKEN, SEARCH_ENGINE, TEI_EMBEDDING_ENDPOINT, VDMS_HOST, @@ -52,7 +53,22 @@ def _initialize_embedder(self): # create embeddings using TEI endpoint service if logflag: logger.info(f"[ init embedder ] TEI_EMBEDDING_ENDPOINT:{TEI_EMBEDDING_ENDPOINT}") - embeddings = HuggingFaceHubEmbeddings(model=TEI_EMBEDDING_ENDPOINT) + if not HUGGINGFACEHUB_API_TOKEN: + raise HTTPException( + status_code=400, + detail="You MUST offer the `HUGGINGFACEHUB_API_TOKEN` when using `TEI_EMBEDDING_ENDPOINT`.", + ) + import requests + + response = requests.get(TEI_EMBEDDING_ENDPOINT + "/info") + if response.status_code != 200: + raise HTTPException( + status_code=400, detail=f"TEI embedding endpoint {TEI_EMBEDDING_ENDPOINT} is not available." + ) + model_id = response.json()["model_id"] + embeddings = HuggingFaceInferenceAPIEmbeddings( + api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT + ) else: # create embeddings using local embedding model if logflag: diff --git a/comps/third_parties/milvus/deployment/docker_compose/compose.yaml b/comps/third_parties/milvus/deployment/docker_compose/compose.yaml index abc6ae1883..7eef87687c 100644 --- a/comps/third_parties/milvus/deployment/docker_compose/compose.yaml +++ b/comps/third_parties/milvus/deployment/docker_compose/compose.yaml @@ -61,7 +61,3 @@ services: depends_on: - "etcd" - "minio" - -networks: - default: - name: milvus diff --git a/tests/retrievers/test_retrievers_milvus.sh b/tests/retrievers/test_retrievers_milvus.sh index 05bd69601a..0dc8146f84 100644 --- a/tests/retrievers/test_retrievers_milvus.sh +++ b/tests/retrievers/test_retrievers_milvus.sh @@ -13,7 +13,8 @@ echo "TAG=${TAG}" WORKPATH=$(dirname "$PWD") LOG_PATH="$WORKPATH/tests" export host_ip=$(hostname -I | awk '{print $1}') -service_name="retriever-milvus" +service_name="retriever-milvus etcd minio standalone" +retriever_service_name="retriever-milvus" function build_docker_images() { cd $WORKPATH @@ -27,7 +28,7 @@ function build_docker_images() { } function start_service() { - export MINIO_PORT1=11611 # 11600-11699 + export MINIO_PORT1=11611 export MINIO_PORT2=11612 export MILVUS_STANDALONE_PORT=11613 export TEI_EMBEDDER_PORT=11614 @@ -38,13 +39,6 @@ function start_service() { export TEI_EMBEDDING_ENDPOINT="http://${host_ip}:${TEI_EMBEDDER_PORT}" export MILVUS_HOST=${host_ip} - # wget https://raw.githubusercontent.com/milvus-io/milvus/v2.4.9/configs/milvus.yaml - # wget https://github.com/milvus-io/milvus/releases/download/v2.4.9/milvus-standalone-docker-compose.yml -O docker-compose.yml - # sed '/- \${DOCKER_VOLUME_DIRECTORY:-\.}\/volumes\/milvus:\/var\/lib\/milvus/a \ \ \ \ \ \ - \${DOCKER_VOLUME_DIRECTORY:-\.}\/milvus.yaml:\/milvus\/configs\/milvus.yaml' -i docker-compose.yml - - cd $WORKPATH/comps/third_parties/milvus/deployment/docker_compose/ - docker compose -f compose.yaml up -d > ${LOG_PATH}/start_services_with_compose_milvus.log - cd $WORKPATH/comps/retrievers/deployment/docker_compose docker compose -f compose.yaml up ${service_name} -d > ${LOG_PATH}/start_services_with_compose.log @@ -67,12 +61,12 @@ function validate_microservice() { echo "[ retriever ] Content is as expected." else echo "[ retriever ] Content does not match the expected result: $CONTENT" - docker logs ${service_name} >> ${LOG_PATH}/retriever.log + docker logs ${retriever_service_name} >> ${LOG_PATH}/retriever.log exit 1 fi else echo "[ retriever ] HTTP status is not 200. Received status was $HTTP_STATUS" - docker logs ${service_name} >> ${LOG_PATH}/retriever.log + docker logs ${retriever_service_name} >> ${LOG_PATH}/retriever.log exit 1 fi } diff --git a/tests/retrievers/test_retrievers_neo4j_on_intel_hpu.sh b/tests/retrievers/test_retrievers_neo4j_on_intel_hpu.sh index a819e2e485..89dde5d4b2 100644 --- a/tests/retrievers/test_retrievers_neo4j_on_intel_hpu.sh +++ b/tests/retrievers/test_retrievers_neo4j_on_intel_hpu.sh @@ -39,8 +39,6 @@ function build_docker_images() { } function start_service() { - export NEO4J_PORT1=11631 - export NEO4J_PORT2=11632 export TEI_EMBEDDER_PORT=11633 export LLM_ENDPOINT_PORT=11634 export RETRIEVER_PORT=11635 @@ -52,7 +50,7 @@ function start_service() { export LLM_MODEL_ID="meta-llama/Meta-Llama-3.1-8B-Instruct" export TGI_LLM_ENDPOINT="http://${host_ip}:${LLM_ENDPOINT_PORT}" export DATAPREP_SERVICE_ENDPOINT="http://${host_ip}:6004" - export NEO4J_URI="bolt://${host_ip}:${NEO4J_PORT2}" + export NEO4J_URI="bolt://${host_ip}:7687" export NEO4J_USERNAME="neo4j" export NEO4J_PASSWORD="neo4jtest" export no_proxy="localhost,127.0.0.1,"${host_ip} @@ -65,9 +63,10 @@ function start_service() { # dataprep neo4j # Not testing openai code path since not able to provide key for cicd docker run -d --name="test-comps-retrievers-neo4j-llama-index-dataprep" -p 6004:5000 -v ./data:/data --ipc=host -e TGI_LLM_ENDPOINT=$TGI_LLM_ENDPOINT \ - -e TEI_EMBEDDING_ENDPOINT=$TEI_EMBEDDING_ENDPOINT -e TEI_ENDPOINT=$TEI_EMBEDDING_ENDPOINT -e EMBEDDING_MODEL_ID=$EMBEDDING_MODEL_ID -e LLM_MODEL_ID=$LLM_MODEL_ID -e host_ip=$host_ip -e no_proxy=$no_proxy \ - -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e NEO4J_URL="bolt://${host_ip}:${NEO4J_PORT2}" -e NEO4J_USERNAME="neo4j" \ - -e NEO4J_PASSWORD="neo4jtest" -e HF_TOKEN=$HF_TOKEN -e MAX_INPUT_LEN=$MAX_INPUT_TOKENS -e LOGFLAG=True -e DATAPREP_COMPONENT_NAME="OPEA_DATAPREP_NEO4J_LLAMAINDEX" opea/dataprep-neo4j-llamaindex:comps + -e TEI_EMBEDDING_ENDPOINT=$TEI_EMBEDDING_ENDPOINT -e EMBEDDING_MODEL_ID=$EMBEDDING_MODEL_ID -e LLM_MODEL_ID=$LLM_MODEL_ID -e host_ip=$host_ip -e no_proxy=$no_proxy \ + -e http_proxy=$http_proxy -e https_proxy=$https_proxy -e NEO4J_URL="bolt://${host_ip}:7687" -e NEO4J_USERNAME="neo4j" \ + -e NEO4J_PASSWORD="neo4jtest" -e HF_TOKEN=$HF_TOKEN -e MAX_INPUT_TOKENS=$MAX_INPUT_TOKENS -e LOGFLAG=True \ + -e DATAPREP_COMPONENT_NAME="OPEA_DATAPREP_NEO4J_LLAMAINDEX" opea/dataprep-neo4j-llamaindex:comps sleep 1m @@ -118,7 +117,7 @@ function validate_service() { function validate_microservice() { # validate neo4j-apoc validate_service \ - "${host_ip}:${NEO4J_PORT1}" \ + "${host_ip}:7474" \ "200 OK" \ "neo4j-apoc" \ "neo4j-apoc" \ diff --git a/tests/retrievers/test_retrievers_opensearch.sh b/tests/retrievers/test_retrievers_opensearch.sh index ae49c41a90..e8bb64850f 100644 --- a/tests/retrievers/test_retrievers_opensearch.sh +++ b/tests/retrievers/test_retrievers_opensearch.sh @@ -14,6 +14,7 @@ WORKPATH=$(dirname "$PWD") LOG_PATH="$WORKPATH/tests" export host_ip=$(hostname -I | awk '{print $1}') service_name="opensearch-vector-db tei-embedding-serving retriever-opensearch" +retriever_service_name="retriever-opensearch" function build_docker_images() { cd $WORKPATH @@ -34,6 +35,7 @@ function start_service() { export OPENSEARCH_INITIAL_ADMIN_PASSWORD="StRoNgOpEa0)" export EMBEDDING_MODEL_ID="BAAI/bge-base-en-v1.5" export TEI_EMBEDDING_ENDPOINT="http://${host_ip}:${TEI_EMBEDDER_PORT}" + export HUGGINGFACEHUB_API_TOKEN=${HF_TOKEN} export OPENSEARCH_URL="http://${host_ip}:${OPENSEARCH_PORT1}" export INDEX_NAME="file-index" @@ -60,13 +62,13 @@ function validate_microservice() { echo "[ retriever ] Content is as expected." else echo "[ retriever ] Content does not match the expected result: $CONTENT" - docker logs ${service_name} >> ${LOG_PATH}/retriever.log + docker logs ${retriever_service_name} >> ${LOG_PATH}/retriever.log docker logs tei-embedding-serving >> ${LOG_PATH}/tei.log exit 1 fi else echo "[ retriever ] HTTP status is not 200. Received status was $HTTP_STATUS" - docker logs ${service_name} >> ${LOG_PATH}/retriever.log + docker logs ${retriever_service_name} >> ${LOG_PATH}/retriever.log docker logs tei-embedding-serving >> ${LOG_PATH}/tei.log exit 1 fi @@ -80,14 +82,14 @@ function stop_docker() { } function main() { - stop_service + stop_docker build_docker_images start_service validate_microservice - stop_service + stop_docker echo y | docker system prune } diff --git a/tests/retrievers/test_retrievers_vdms.sh b/tests/retrievers/test_retrievers_vdms.sh index 732fd91134..42a1d550e5 100644 --- a/tests/retrievers/test_retrievers_vdms.sh +++ b/tests/retrievers/test_retrievers_vdms.sh @@ -37,7 +37,7 @@ function start_service() { export TEI_EMBEDDING_ENDPOINT="http://${host_ip}:${TEI_EMBEDDER_PORT}" export INDEX_NAME="rag-vdms" export VDMS_USE_CLIP=0 #set to 1 if openai clip embedding should be used - export HF_TOKEN=${HF_TOKEN} + export HUGGINGFACEHUB_API_TOKEN=${HF_TOKEN} export LOGFLAG=True cd $WORKPATH/comps/retrievers/deployment/docker_compose