Skip to content

Commit e349c50

Browse files
authored
[Bug: 1379] Added Multimodal support for Milvus for retriever component (opea-project#1381)
Added Multimodal support for Milvus for retriever component Fixes opea-project#1379 Co-authored-by: Jaini, Pallavi <pallavi.jaini@intel.com> Co-authored-by: Kavulya, Soila <soila.kavulya@intel.com> Signed-off-by: Ghosh, Soumyadip <soumyadip.ghosh@intel.com> Signed-off-by: Piroozan, Nariman <nariman.piroozan@intel.com> Signed-off-by: Shifani Rajabose <srajabose@habana.ai> Signed-off-by: pallavi.jaini <pallavi.jaini@intel.com>
1 parent c1d3c58 commit e349c50

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

comps/retrievers/deployment/docker_compose/compose.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,23 @@ services:
5757
minio:
5858
condition: service_healthy
5959

60+
retriever-milvus-multimodal:
61+
extends: retriever
62+
container_name: retriever-milvus-multimodal
63+
environment:
64+
RETRIEVER_COMPONENT_NAME: ${RETRIEVER_COMPONENT_NAME:-OPEA_RETRIEVER_MILVUS}
65+
RETRIEVER_TYPE: ${RETRIEVER_TYPE:-milvus}
66+
MILVUS_HOST: ${host_ip}
67+
BRIDGE_TOWER_EMBEDDING: ${BRIDGE_TOWER_EMBEDDING}
68+
COLLECTION_NAME: ${COLLECTION_NAME:-LangChainCollection}
69+
depends_on:
70+
standalone:
71+
condition: service_healthy
72+
etcd:
73+
condition: service_healthy
74+
minio:
75+
condition: service_healthy
76+
6077
retriever-neo4j:
6178
extends: retriever
6279
container_name: retriever-neo4j

comps/retrievers/src/integrations/milvus.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from comps import CustomLogger, EmbedDoc, OpeaComponent, OpeaComponentRegistry, ServiceType
1313

1414
from .config import (
15+
BRIDGE_TOWER_EMBEDDING,
1516
COLLECTION_NAME,
1617
HUGGINGFACEHUB_API_TOKEN,
1718
INDEX_PARAMS,
@@ -61,6 +62,11 @@ def _initialize_embedder(self):
6162
embeddings = HuggingFaceInferenceAPIEmbeddings(
6263
api_key=HUGGINGFACEHUB_API_TOKEN, model_name=model_id, api_url=TEI_EMBEDDING_ENDPOINT
6364
)
65+
elif BRIDGE_TOWER_EMBEDDING:
66+
logger.info("use bridge tower embedding")
67+
from comps.third_parties.bridgetower.src.bridgetower_embedding import BridgeTowerEmbedding
68+
69+
embeddings = BridgeTowerEmbedding()
6470
else:
6571
# create embeddings using local embedding model
6672
if logflag:

tests/retrievers/test_retrievers_milvus.sh

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ LOG_PATH="$WORKPATH/tests"
1616
export host_ip=$(hostname -I | awk '{print $1}')
1717
service_name="retriever-milvus etcd minio standalone"
1818
retriever_service_name="retriever-milvus"
19+
service_name_mm="retriever-milvus-multimodal etcd minio standalone"
1920

2021
function build_docker_images() {
2122
cd $WORKPATH
@@ -46,6 +47,23 @@ function start_service() {
4647
sleep 1m
4748
}
4849

50+
function start_multimodal_service() {
51+
export MINIO_PORT1=11611
52+
export MINIO_PORT2=11612
53+
export MILVUS_STANDALONE_PORT=11613
54+
export TEI_EMBEDDER_PORT=11614
55+
export HF_TOKEN=${HF_TOKEN}
56+
export COLLECTION_NAME="LangChainCollection"
57+
export LOGFLAG=True
58+
export BRIDGE_TOWER_EMBEDDING=true
59+
export RETRIEVER_TYPE="milvus"
60+
61+
cd $WORKPATH/comps/retrievers/deployment/docker_compose
62+
docker compose -f compose.yaml up ${service_name_mm} -d > ${LOG_PATH}/start_services_with_compose_multimodal.log
63+
64+
sleep 2m
65+
}
66+
4967
function validate_microservice() {
5068
local test_embedding="$1"
5169

@@ -72,12 +90,57 @@ function validate_microservice() {
7290
fi
7391
}
7492

93+
function validate_mm_microservice() {
94+
local test_embedding="$1"
95+
local container_name="$2"
96+
97+
export PATH="${HOME}/miniforge3/bin:$PATH"
98+
source activate
99+
URL="http://${host_ip}:$RETRIEVER_PORT/v1/retrieval"
100+
101+
# Test the retriever with a b64 image that should be passed through
102+
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST -d "{\"text\":\"test\",\"embedding\":${test_embedding},\"base64_image\":\"iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAFUlEQVR42mP8/5+hnoEIwDiqkL4KAcT9GO0U4BxoAAAAAElFTkSuQmCC\"}" -H 'Content-Type: application/json' "$URL")
103+
if [ "$HTTP_STATUS" -eq 200 ]; then
104+
echo "[ retriever ] HTTP status is 200. Checking content..."
105+
local CONTENT=$(curl -s -X POST -d "{\"text\":\"test\",\"embedding\":${test_embedding}}" -H 'Content-Type: application/json' "$URL" | tee ${LOG_PATH}/retriever.log)
106+
107+
if echo "$CONTENT" | grep -q "retrieved_docs"; then
108+
echo "[ retriever ] Content has retrieved_docs as expected."
109+
empty_search_results=$(echo "$CONTENT" | grep "\"retrieved_docs\":\[\]")
110+
if [ -z "$empty_search_results" ]; then
111+
# If search results are not empty, check for b64 image string
112+
if echo "$CONTENT" | grep -q "b64_img_str"; then
113+
echo "[ retriever ] Content has b64_img_str as expected."
114+
else
115+
echo "[ retriever ] Content does not include the b64_img_str: $CONTENT"
116+
docker logs ${container_name} >> ${LOG_PATH}/retriever.log
117+
exit 1
118+
fi
119+
fi
120+
else
121+
echo "[ retriever ] Content does not match the expected result: $CONTENT"
122+
docker logs ${container_name} >> ${LOG_PATH}/retriever.log
123+
exit 1
124+
fi
125+
else
126+
echo "[ retriever ] HTTP status is not 200. Received status was $HTTP_STATUS"
127+
docker logs ${container_name} >> ${LOG_PATH}/retriever.log
128+
exit 1
129+
fi
130+
}
131+
75132
function stop_docker() {
76133
cd $WORKPATH/comps/third_parties/milvus/deployment/docker_compose/
77134
docker compose -f compose.yaml down --remove-orphans
78135

136+
docker stop milvus-etcd
137+
docker rm milvus-etcd
138+
79139
cd $WORKPATH/comps/retrievers/deployment/docker_compose
80-
docker compose -f compose.yaml down --remove-orphans
140+
141+
docker compose -f compose.yaml down ${service_name} --remove-orphans
142+
docker compose -f compose.yaml down ${service_name_mm} --remove-orphans
143+
81144
cid=$(docker ps -aq --filter "name=tei-embedding-serving")
82145
if [[ ! -z "$cid" ]]; then docker stop $cid && docker rm $cid && sleep 1s; fi
83146
}
@@ -92,6 +155,14 @@ function main() {
92155
validate_microservice "$test_embedding"
93156

94157
stop_docker
158+
159+
start_multimodal_service
160+
test_embedding_multi=$(python -c "import random; embedding = [random.uniform(-1, 1) for _ in range(512)]; print(embedding)")
161+
validate_microservice "$test_embedding_multi" "$service_name_mm"
162+
validate_mm_microservice "$test_embedding_multi" "$service_name_mm"
163+
164+
stop_docker
165+
95166
echo y | docker system prune
96167

97168
}

0 commit comments

Comments
 (0)