دا مقاله د میلووس په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو څرنګوالي او د AI سیسټمونو لپاره مختلف امکانات خلاصولو څرنګوالي په اړه ژور لارښود چمتو کوي.
د یو واحد ډیټا ب formatه پورې محدود پاتې کیدل نور ښه ندي. لکه څنګه چې سوداګرۍ د مهمو پریکړو کولو لپاره په معلوماتو باندې خورا ډیر تکیه کوي، دوی په متفاوت بڼو کې د معلوماتو پرتله کولو وړتیا ته اړتیا لري. خوشبختانه، دودیز AI سیسټمونه چې د یو واحد ډیټا ډول پورې محدود دي ملټي موډل سیسټمونو ته لاره هواره کړې چې کولی شي پیچلي معلومات درک او پروسس کړي.
د ملټي موډل لټون او ملټي موډل بیا ترلاسه کولو - وده شوي نسل (RAG) سیسټمونو پدې وروستیو کې پدې برخه کې لوی پرمختګ ښودلی. دا سیسټمونه د متن، عکسونو او آډیو په ګډون ډیری ډوله ډاټا پروسس کوي ترڅو د شرایطو څخه خبرتیا ځوابونه چمتو کړي.
پدې بلاګ پوسټ کې ، موږ به بحث وکړو چې څنګه پراختیا کونکي کولی شي د میلووس په کارولو سره خپل ملټي موډل RAG سیسټم رامینځته کړي. موږ به تاسو ته د داسې سیسټم په جوړولو کې هم وغځوو چې کولی شي د متن او عکس ډیټا اداره کړي ، په ځانګړي توګه د ورته والي لټونونه ترسره کړي ، او د محصول اصلاح کولو لپاره د ژبې ماډل ګټه پورته کړي. نو، راځئ چې پیل وکړو.
د ویکتور ډیټابیس یو ځانګړی ډول ډیټابیس دی چې د ویکتور سرایتونو ذخیره کولو ، شاخص کولو او بیرته ترلاسه کولو لپاره کارول کیږي ، کوم چې د ډیټا ریاضياتي نمایشونه دي چې تاسو ته اجازه درکوي د ډیټا پرتله کولو لپاره نه یوازې انډول بلکه سیمانټیک ورته والی.
Milvus د پراختیا کونکو سره مرسته کوي چې د لوی پیمانه ویکتور ډیټا اداره کولو او پوښتنو لپاره انعطاف وړ حل چمتو کړي. د دې موثریت Milvus د ژور زده کړې ماډلونو په کارولو سره د غوښتنلیکونو رامینځته کولو پراختیا کونکو لپاره غوره انتخاب رامینځته کوي ، لکه د بیا ترلاسه کولو وده شوي نسل (RAG) ، ملټي موډل لټون ، د سپارښتنې انجن ، او د انډول کشف کول.
Milvus د پراختیا کونکو اړتیاو سره سمون لپاره ډیری ګمارنې اختیارونه وړاندیز کوي.
د سیسټم جوړولو دمخه، دا مهمه ده چې د دودیز متن پر بنسټ RAG او د ملټي موډل RAG ته د هغې ارتقاء پوه شئ.
د بیا ترلاسه کولو وده شوي نسل (RAG) د بهرنیو سرچینو څخه د متناسب معلوماتو ترلاسه کولو او د لوی ژبو ماډلونو (LLMs) څخه ډیر دقیق محصول رامینځته کولو میتود دی. دودیز RAG د LLM محصول ښه کولو لپاره خورا مؤثره ستراتیژي ده، مګر دا د متن معلوماتو پورې محدوده پاتې ده. په ډیری ریښتینې نړۍ غوښتنلیکونو کې، ډاټا د متن څخه بهر پراخیږي - د انځورونو، چارټونو، او نورو طریقو شاملول مهم شرایط وړاندې کوي.
ملټي موډل RAG د مختلف ډیټا ډولونو کارولو وړ کولو سره پورتني محدودیت په ګوته کوي ، LLMs ته غوره شرایط چمتو کوي.
په ساده ډول ووایاست، د ملټي موډل RAG سیسټم کې، د ترلاسه کولو اجزا د مختلف ډیټا ماډلونو کې اړونده معلومات لټوي، او د نسل اجزا د ترلاسه شوي معلوماتو پراساس ډیرې دقیقې پایلې رامینځته کوي.
د ویکتور سرایت او ورته والی لټون د ملټي موډل RAG دوه بنسټیز مفهومونه دي. راځئ چې دوی دواړه پوه کړو.
لکه څنګه چې بحث شوی، د ویکتور سرایتونه د ډیټا ریاضي / شمیري نمایشونه دي. ماشینونه دا نمایش د مختلف ډیټا ډولونو سیمانټیک معنی درک کولو لپاره کاروي ، لکه متن ، عکسونه او آډیو.
کله چې د طبیعي ژبې پروسس (NLP) کاروئ، د اسنادو ټوټې په ویکتورونو بدلیږي، او په معنی ډول ورته کلمې د ویکتور ځای کې نږدې ټکو ته نقشه کیږي. ورته د عکسونو لپاره ځي ، چیرې چې سرایتونه د سیمانټیک ځانګړتیاو استازیتوب کوي. دا موږ ته اجازه راکوي چې د میټریکونو لکه رنګ، جوړښت، او د شیانو شکلونه په عددي بڼه پوه کړو.
د ویکتور ایمبیډینګ کارولو اصلي هدف د ډیټا مختلف برخو ترمینځ د اړیکو او ورته والي ساتلو کې مرسته کول دي.
ورته لټون په ورکړل شوي ډیټا سیټ کې د معلوماتو موندلو او موندلو لپاره کارول کیږي. د ویکتور ایمبیډینګونو په شرایطو کې، د ورته والی لټون په ورکړل شوي ډیټاسیټ کې ویکتورونه ومومي کوم چې د پوښتنې ویکتور ته نږدې دي.
لاندې یو څو میتودونه دي چې معمولا د ویکتورونو ترمینځ ورته والي اندازه کولو لپاره کارول کیږي:
د ورته والي اندازه کولو انتخاب معمولا د غوښتنلیک ځانګړي ډیټا پورې اړه لري او دا چې څنګه پرمخ وړونکي ستونزې ته رسیدګي کوي.
کله چې په لویه پیمانه ډیټاسیټونو کې د ورته لټون ترسره کول، د محاسبې ځواک او سرچینې اړین دي خورا لوړ دي. دا هغه ځای دی چې نږدې نږدې ګاونډی (ANN) الګوریتمونه په کې راځي. د ANN الګوریتمونه د پام وړ سرعت لوړولو لپاره د لږ فیصدي یا مقدار دقت د سوداګرۍ لپاره کارول کیږي. دا دوی د لوی کچې غوښتنلیکونو لپاره مناسب انتخاب کوي.
Milvus د HNSW او DiskANN په ګډون پرمختللي ANN الګوریتمونه هم کاروي ترڅو د لوی ویکتور سرایت ډیټاسیټونو کې د ورته ورته ورته لټون ترسره کړي، پراختیا کونکو ته اجازه ورکوي چې په چټکۍ سره اړونده ډاټا ټکي ومومي. سربیره پردې، Milvus د نورو شاخص کولو الګوریتمونو ملاتړ کوي، لکه HSNW، IVF، CAGRA، او داسې نور، دا د ویکتور لټون خورا اغیزمن حل جوړوي.
اوس موږ مفکورې زده کړل، دا د میلووس په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو وخت دی. د دې مثال لپاره، موږ به د Milvus Lite (د Milvus لږ وزن نسخه، د تجربې او پروټوټایپ لپاره مثالی) د ویکتور ذخیره کولو او ترلاسه کولو لپاره، BGE د دقیق عکس پروسس کولو او سرایت کولو لپاره، او GPT-4o د پرمختللو پایلو بیا درجه بندي لپاره.
لومړی، تاسو به د خپل ډاټا ذخیره کولو لپاره د میلوس مثال ته اړتیا ولرئ. تاسو کولی شئ د پایپ په کارولو سره میلووس لایټ تنظیم کړئ ، د ډاکر په کارولو سره سیمه ایز مثال چل کړئ ، یا د زیلیز کلاوډ له لارې د وړیا کوربه شوي میلوس حساب لپاره لاسلیک وکړئ.
دوهم، تاسو د خپل RAG پایپ لاین لپاره LLM ته اړتیا لرئ، نو سر ته ورشئ
بیا، یو نوی لارښود او یو پایتون جوړ کړئ
د دې ټیوټوریل لپاره، تاسو به هم نصبولو ته اړتیا ولرئ
pip install -U pymilvus
pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm git clone https://github.com/FlagOpen/FlagEmbedding.git pip install -e FlagEmbedding
لاندې کمانډ به د مثال ډاټا ډاونلوډ کړي او محلي فولډر ته یې استخراج کړي "./images_folder"، چې پکې شامل دي:
wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz tar -xzf amazon_reviews_2023_subset.tar.gz
موږ به د بصری BGE ماډل "bge-visualized-base-en-v1.5" څخه کار واخلو ترڅو د عکسونو او متن دواړو لپاره امبډینګونه رامینځته کړي.
اوس د HuggingFace څخه وزن ډاونلوډ کړئ.
wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth
بیا، راځئ چې کوډ جوړ کړو.
import torch from visual_bge.modeling import Visualized_BGE class Encoder: def __init__(self, model_name: str, model_path: str): self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path) self.model.eval() def encode_query(self, image_path: str, text: str) -> list[float]: with torch.no_grad(): query_emb = self.model.encode(image=image_path, text=text) return query_emb.tolist()[0] def encode_image(self, image_path: str) -> list[float]: with torch.no_grad(): query_emb = self.model.encode(image=image_path) return query_emb.tolist()[0] model_name = "BAAI/bge-base-en-v1.5" model_path = "./Visualized_base_en_v1.5.pth" # Change to your own value if using a different model path encoder = Encoder(model_name, model_path)
دا برخه به تاسو ته لارښوونه وکړي چې څنګه زموږ ډیټابیس کې د دوی اړونده سرایتونو سره د مثال عکسونه پورته کړئ.
امبډینګونه تولید کړئ
لومړی، موږ اړتیا لرو چې په ډیټاسیټ کې د ټولو عکسونو لپاره سرایتونه جوړ کړو.
د ډیټا لارښود څخه ټول عکسونه پورته کړئ او ایمبیډینګونو ته یې واړوئ.
import os from tqdm import tqdm from glob import glob data_dir = ( "./images_folder" # Change to your own value if using a different data directory ) image_list = glob( os.path.join(data_dir, "images", "*.jpg") ) # We will only use images ending with ".jpg" image_dict = {} for image_path in tqdm(image_list, desc="Generating image embeddings: "): try: image_dict[image_path] = encoder.encode_image(image_path) except Exception as e: print(f"Failed to generate embedding for {image_path}. Skipped.") continue print("Number of encoded images:", len(image_dict))
پدې برخه کې، موږ به لومړی د ملټي موډل پوښتنې په کارولو سره اړونده عکسونه وپلټو او بیا به د LLM خدمت څخه کار واخلو ترڅو بیرته ترلاسه شوي پایلې بیا وټاکو او د توضیحاتو سره غوره ومومئ.
ملټي موډل لټون پرمخ وړئ
اوس موږ چمتو یو چې د عکس او متن لارښوونو څخه جوړ شوي پوښتنې سره پرمختللي ملټي موډل لټون ترسره کړو.
query_image = os.path.join( data_dir, "leopard.jpg" ) # Change to your own query image path query_text = "phone case with this image theme" query_vec = encoder.encode_query(image_path=query_image, text=query_text) search_results = milvus_client.search( collection_name=collection_name, data=[query_vec], output_fields=["image_path"], limit=9, # Max number of search results to return search_params={"metric_type": "COSINE", "params": {}}, # Search parameters )[0] retrieved_images = [hit.get("entity").get("image_path") for hit in search_results] print(retrieved_images)
پایله لاندې ښودل شوې:
['./images_folder/images/518Gj1WQ-RL._AC_.jpg', './images_folder/images/41n00AOfWhL._AC_.jpg'
د GPT-4o سره پایلې بیا درجه بندي کړئ
اوس، موږ به د ترلاسه شوي عکسونو درجه بندي کولو لپاره د GPT-4o څخه کار واخلو او غوره مطابقت لرونکي پایلې ومومئ. LLM به دا هم تشریح کړي چې ولې دا ورته درجه لري.
1. یو پینورامیک لید جوړ کړئ.
import numpy as np import cv2 img_height = 300 img_width = 300 row_count = 3 def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray: """ creates a 5x5 panoramic view image from a list of images args: images: list of images to be combined returns: np.ndarray: the panoramic view image """ panoramic_width = img_width * row_count panoramic_height = img_height * row_count panoramic_image = np.full( (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8 ) # create and resize the query image with a blue border query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8) query_image = Image.open(query_image_path).convert("RGB") query_array = np.array(query_image)[:, :, ::-1] resized_image = cv2.resize(query_array, (img_width, img_height)) border_size = 10 blue = (255, 0, 0) # blue color in BGR bordered_query_image = cv2.copyMakeBorder( resized_image, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=blue, ) query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize( bordered_query_image, (img_width, img_height) ) # add text "query" below the query image text = "query" font_scale = 1 font_thickness = 2 text_org = (10, img_height * 3 + 30) cv2.putText( query_image_null, text, text_org, cv2.FONT_HERSHEY_SIMPLEX, font_scale, blue, font_thickness, cv2.LINE_AA, ) # combine the rest of the images into the panoramic view retrieved_imgs = [ np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images ] for i, image in enumerate(retrieved_imgs): image = cv2.resize(image, (img_width - 4, img_height - 4)) row = i // row_count col = i % row_count start_row = row * img_height start_col = col * img_width border_size = 2 bordered_image = cv2.copyMakeBorder( image, border_size, border_size, border_size, border_size, cv2.BORDER_CONSTANT, value=(0, 0, 0), ) panoramic_image[ start_row : start_row + img_height, start_col : start_col + img_width ] = bordered_image # add red index numbers to each image text = str(i) org = (start_col + 50, start_row + 30) (font_width, font_height), baseline = cv2.getTextSize( text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2 ) top_left = (org[0] - 48, start_row + 2) bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5) cv2.rectangle( panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED ) cv2.putText( panoramic_image, text, (start_col + 10, start_row + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA, ) # combine the query image with the panoramic view panoramic_image = np.hstack([query_image_null, panoramic_image]) return panoramic_image
2. د پوښتنې عکس او ترلاسه شوي عکسونه په یوه پینورامیک لید کې د شاخصونو سره یوځای کړئ.
from PIL import Image combined_image_path = os.path.join(data_dir, "combined_image.jpg") panoramic_image = create_panoramic_view(query_image, retrieved_images) cv2.imwrite(combined_image_path, panoramic_image) combined_image = Image.open(combined_image_path) show_combined_image = combined_image.resize((300, 300)) show_combined_image.show()
3. پایلې بیا درجه بندي کړئ او توضیحات ورکړئ
موږ به ټول ګډ عکسونه د ملټي موډل LLM خدمت ته د مناسبو اشارو سره ولیږو ترڅو بیرته ترلاسه شوي پایلې د توضیحاتو سره درجه بندي کړو. یادونه: د LLM په توګه د GPT-4o فعالولو لپاره، تاسو اړتیا لرئ خپل چمتو کړئ
import requests import base64 openai_api_key = "sk-***" # Change to your OpenAI API Key def generate_ranking_explanation( combined_image_path: str, caption: str, infos: dict = None ) -> tuple[list[int], str]: with open(combined_image_path, "rb") as image_file: base64_image = base64.b64encode(image_file.read()).decode("utf-8") information = ( "You are responsible for ranking results for a Composed Image Retrieval. " "The user retrieves an image with an 'instruction' indicating their retrieval intent. " "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. " "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. " f"User instruction: {caption} \n\n" ) # add additional information for each image if infos: for i, info in enumerate(infos["product"]): information += f"{i}. {info}\n" information += ( "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. " "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent." ) headers = { "Content-Type": "application/json", "Authorization": f"Bearer {openai_api_key}", } payload = { "model": "gpt-4o", "messages": [ { "role": "user", "content": [ {"type": "text", "text": information}, { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}, }, ], } ], "max_tokens": 300, } response = requests.post( "https://api.openai.com/v1/chat/completions", headers=headers, json=payload ) result = response.json()["choices"][0]["message"]["content"] # parse the ranked indices from the response start_idx = result.find("[") end_idx = result.find("]") ranked_indices_str = result[start_idx + 1 : end_idx].split(",") ranked_indices = [int(index.strip()) for index in ranked_indices_str] # extract explanation explanation = result[end_idx + 1 :].strip() return ranked_indices, explanation
د درجه بندي وروسته د عکس شاخصونه ترلاسه کړئ او د غوره پایلې دلیل:
ranked_indices, explanation = generate_ranking_explanation( combined_image_path, query_text )
4. د وضاحت سره غوره پایله ښکاره کړئ
print(explanation) best_index = ranked_indices[0] best_img = Image.open(retrieved_images[best_index]) best_img = best_img.resize((150, 150)) best_img.show()
پایلې:
Reasons: The most suitable item for the user's query intent is index 6 because the instruction specifies a phone case with the theme of the image, which is a leopard. The phone case with index 6 has a thematic design resembling the leopard pattern, making it the closest match to the user's request for a phone case with the image theme.
په دې نوټ بوک کې بشپړ کوډ وګورئ. د دې ټیوټوریل سره د آنلاین ډیمو پیل کولو څرنګوالي په اړه د نورو معلوماتو لپاره ، مهرباني وکړئ مراجعه وکړئ
پدې بلاګ پوسټ کې ، موږ په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو په اړه بحث وکړ
د ملټي موډل RAG حلونه د AI سیسټمونو لپاره مختلف امکانات خلاصوي چې کولی شي په اسانۍ سره د ډیټا ډیری ډولونه پوه او پروسس کړي. ځینې عام امکانات شامل دي د عکس لټون انجنونه، د شرایطو غوره پایلې، او نور.