paint-brush
غواړئ د عکس او متن توضیحاتو سره یو څه وپلټئ؟ د ملټي موډل RAG هڅه وکړئلخوا@codingjaguar
232 لوستل

غواړئ د عکس او متن توضیحاتو سره یو څه وپلټئ؟ د ملټي موډل RAG هڅه وکړئ

لخوا Jiang Chen16m2024/11/27
Read on Terminal Reader

ډېر اوږد؛ لوستل

د Milvus په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو څرنګوالي او د AI سیسټمونو لپاره مختلف امکانات خلاصولو څرنګوالي په اړه ژور لارښود.
featured image - غواړئ د عکس او متن توضیحاتو سره یو څه وپلټئ؟ د ملټي موډل RAG هڅه وکړئ
Jiang Chen HackerNoon profile picture
0-item
1-item

دا مقاله د میلووس په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو څرنګوالي او د AI سیسټمونو لپاره مختلف امکانات خلاصولو څرنګوالي په اړه ژور لارښود چمتو کوي.


د یو واحد ډیټا ب formatه پورې محدود پاتې کیدل نور ښه ندي. لکه څنګه چې سوداګرۍ د مهمو پریکړو کولو لپاره په معلوماتو باندې خورا ډیر تکیه کوي، دوی په متفاوت بڼو کې د معلوماتو پرتله کولو وړتیا ته اړتیا لري. خوشبختانه، دودیز AI سیسټمونه چې د یو واحد ډیټا ډول پورې محدود دي ملټي موډل سیسټمونو ته لاره هواره کړې چې کولی شي پیچلي معلومات درک او پروسس کړي.


د ملټي موډل لټون او ملټي موډل بیا ترلاسه کولو - وده شوي نسل (RAG) سیسټمونو پدې وروستیو کې پدې برخه کې لوی پرمختګ ښودلی. دا سیسټمونه د متن، عکسونو او آډیو په ګډون ډیری ډوله ډاټا پروسس کوي ترڅو د شرایطو څخه خبرتیا ځوابونه چمتو کړي.


پدې بلاګ پوسټ کې ، موږ به بحث وکړو چې څنګه پراختیا کونکي کولی شي د میلووس په کارولو سره خپل ملټي موډل RAG سیسټم رامینځته کړي. موږ به تاسو ته د داسې سیسټم په جوړولو کې هم وغځوو چې کولی شي د متن او عکس ډیټا اداره کړي ، په ځانګړي توګه د ورته والي لټونونه ترسره کړي ، او د محصول اصلاح کولو لپاره د ژبې ماډل ګټه پورته کړي. نو، راځئ چې پیل وکړو.

Milvus څه شی دی؟

د ویکتور ډیټابیس یو ځانګړی ډول ډیټابیس دی چې د ویکتور سرایتونو ذخیره کولو ، شاخص کولو او بیرته ترلاسه کولو لپاره کارول کیږي ، کوم چې د ډیټا ریاضياتي نمایشونه دي چې تاسو ته اجازه درکوي د ډیټا پرتله کولو لپاره نه یوازې انډول بلکه سیمانټیک ورته والی. میلووس یو خلاص سرچینه ده، د لوړ فعالیت ویکتور ډیټابیس د پیمان لپاره جوړ شوی. تاسو کولی شئ دا په GitHub کې د Apache-2.0 جواز او د 30K ستورو څخه ډیر سره ومومئ.


Milvus د پراختیا کونکو سره مرسته کوي چې د لوی پیمانه ویکتور ډیټا اداره کولو او پوښتنو لپاره انعطاف وړ حل چمتو کړي. د دې موثریت Milvus د ژور زده کړې ماډلونو په کارولو سره د غوښتنلیکونو رامینځته کولو پراختیا کونکو لپاره غوره انتخاب رامینځته کوي ، لکه د بیا ترلاسه کولو وده شوي نسل (RAG) ، ملټي موډل لټون ، د سپارښتنې انجن ، او د انډول کشف کول.


Milvus د پراختیا کونکو اړتیاو سره سمون لپاره ډیری ګمارنې اختیارونه وړاندیز کوي. Milvus Lite یو لږ وزن لرونکی نسخه ده چې د Python غوښتنلیک دننه چلیږي او په محلي چاپیریال کې د پروټوټایپ غوښتنلیکونو لپاره مناسب دی. Milvus Standalone او Milvus Distributed د توزیع وړ او د تولید لپاره چمتو انتخابونه دي.

ملټي موډل RAG: له متن څخه بهر پراخول

د سیسټم جوړولو دمخه، دا مهمه ده چې د دودیز متن پر بنسټ RAG او د ملټي موډل RAG ته د هغې ارتقاء پوه شئ.


د بیا ترلاسه کولو وده شوي نسل (RAG) د بهرنیو سرچینو څخه د متناسب معلوماتو ترلاسه کولو او د لوی ژبو ماډلونو (LLMs) څخه ډیر دقیق محصول رامینځته کولو میتود دی. دودیز RAG د LLM محصول ښه کولو لپاره خورا مؤثره ستراتیژي ده، مګر دا د متن معلوماتو پورې محدوده پاتې ده. په ډیری ریښتینې نړۍ غوښتنلیکونو کې، ډاټا د متن څخه بهر پراخیږي - د انځورونو، چارټونو، او نورو طریقو شاملول مهم شرایط وړاندې کوي.


ملټي موډل RAG د مختلف ډیټا ډولونو کارولو وړ کولو سره پورتني محدودیت په ګوته کوي ، LLMs ته غوره شرایط چمتو کوي.


په ساده ډول ووایاست، د ملټي موډل RAG سیسټم کې، د ترلاسه کولو اجزا د مختلف ډیټا ماډلونو کې اړونده معلومات لټوي، او د نسل اجزا د ترلاسه شوي معلوماتو پراساس ډیرې دقیقې پایلې رامینځته کوي.

د ویکتور ایمبیډینګ او ورته والی لټون پوهیدل

د ویکتور سرایت او ورته والی لټون د ملټي موډل RAG دوه بنسټیز مفهومونه دي. راځئ چې دوی دواړه پوه کړو.

د ویکتور سرایت

لکه څنګه چې بحث شوی، د ویکتور سرایتونه د ډیټا ریاضي / شمیري نمایشونه دي. ماشینونه دا نمایش د مختلف ډیټا ډولونو سیمانټیک معنی درک کولو لپاره کاروي ، لکه متن ، عکسونه او آډیو.


کله چې د طبیعي ژبې پروسس (NLP) کاروئ، د اسنادو ټوټې په ویکتورونو بدلیږي، او په معنی ډول ورته کلمې د ویکتور ځای کې نږدې ټکو ته نقشه کیږي. ورته د عکسونو لپاره ځي ، چیرې چې سرایتونه د سیمانټیک ځانګړتیاو استازیتوب کوي. دا موږ ته اجازه راکوي چې د میټریکونو لکه رنګ، جوړښت، او د شیانو شکلونه په عددي بڼه پوه کړو.


د ویکتور ایمبیډینګ کارولو اصلي هدف د ډیټا مختلف برخو ترمینځ د اړیکو او ورته والي ساتلو کې مرسته کول دي.

د ورته والی لټون

ورته لټون په ورکړل شوي ډیټا سیټ کې د معلوماتو موندلو او موندلو لپاره کارول کیږي. د ویکتور ایمبیډینګونو په شرایطو کې، د ورته والی لټون په ورکړل شوي ډیټاسیټ کې ویکتورونه ومومي کوم چې د پوښتنې ویکتور ته نږدې دي.


لاندې یو څو میتودونه دي چې معمولا د ویکتورونو ترمینځ ورته والي اندازه کولو لپاره کارول کیږي:

  1. د Euclidean فاصله : د ویکتور ځای کې د دوو نقطو ترمنځ د مستقیم کرښې فاصله اندازه کوي.
  2. د کوزین ورته والی : د دوو ویکتورونو تر منځ د زاویې کوزین اندازه کوي (د شدت پر ځای د دوی لوري ته تمرکز سره).
  3. د ټکي محصول : د اړوندو عناصرو یو ساده ضرب چې خلاص شوی.


د ورته والي اندازه کولو انتخاب معمولا د غوښتنلیک ځانګړي ډیټا پورې اړه لري او دا چې څنګه پرمخ وړونکي ستونزې ته رسیدګي کوي.


کله چې په لویه پیمانه ډیټاسیټونو کې د ورته لټون ترسره کول، د محاسبې ځواک او سرچینې اړین دي خورا لوړ دي. دا هغه ځای دی چې نږدې نږدې ګاونډی (ANN) الګوریتمونه په کې راځي. د ANN الګوریتمونه د پام وړ سرعت لوړولو لپاره د لږ فیصدي یا مقدار دقت د سوداګرۍ لپاره کارول کیږي. دا دوی د لوی کچې غوښتنلیکونو لپاره مناسب انتخاب کوي.


Milvus د HNSW او DiskANN په ګډون پرمختللي ANN الګوریتمونه هم کاروي ترڅو د لوی ویکتور سرایت ډیټاسیټونو کې د ورته ورته ورته لټون ترسره کړي، پراختیا کونکو ته اجازه ورکوي چې په چټکۍ سره اړونده ډاټا ټکي ومومي. سربیره پردې، Milvus د نورو شاخص کولو الګوریتمونو ملاتړ کوي، لکه HSNW، IVF، CAGRA، او داسې نور، دا د ویکتور لټون خورا اغیزمن حل جوړوي.


د ملووس سره ملټي موډل RAG جوړول

اوس موږ مفکورې زده کړل، دا د میلووس په کارولو سره د ملټي موډل RAG سیسټم رامینځته کولو وخت دی. د دې مثال لپاره، موږ به د Milvus Lite (د Milvus لږ وزن نسخه، د تجربې او پروټوټایپ لپاره مثالی) د ویکتور ذخیره کولو او ترلاسه کولو لپاره، BGE د دقیق عکس پروسس کولو او سرایت کولو لپاره، او GPT-4o د پرمختللو پایلو بیا درجه بندي لپاره.

شرطونه

لومړی، تاسو به د خپل ډاټا ذخیره کولو لپاره د میلوس مثال ته اړتیا ولرئ. تاسو کولی شئ د پایپ په کارولو سره میلووس لایټ تنظیم کړئ ، د ډاکر په کارولو سره سیمه ایز مثال چل کړئ ، یا د زیلیز کلاوډ له لارې د وړیا کوربه شوي میلوس حساب لپاره لاسلیک وکړئ.


دوهم، تاسو د خپل RAG پایپ لاین لپاره LLM ته اړتیا لرئ، نو سر ته ورشئ OpenAI او د API کیلي ترلاسه کړئ. وړیا درجه د دې کوډ کار کولو لپاره کافي ده.


بیا، یو نوی لارښود او یو پایتون جوړ کړئ مجازی چاپیریال (یا هر هغه ګامونه واخلئ چې تاسو یې د Python اداره کولو لپاره کاروئ).


د دې ټیوټوریل لپاره، تاسو به هم نصبولو ته اړتیا ولرئ pymilvus کتابتون، کوم چې د Milvus رسمي Python SDK دی، او یو څو عام وسیلې.

Milvus Lite تنظیم کړئ

 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"، چې پکې شامل دي:


  • انځورونه: یوه فرعي ټولګه د ایمیزون بیاکتنې 2023 د کټګوریو شاوخوا 900 عکسونه لري چې د "سازلو"، "د ګرځنده تلیفونونو_او_لوازمو"، او "برقیاتو" څخه دي.
  • د پوښتنې یوه بیلګه انځور: leopard.jpg


 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 فعالولو لپاره، تاسو اړتیا لرئ خپل چمتو کړئ OpenAI API کیلي له مخکې نه.


 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 سیسټم رامینځته کولو په اړه بحث وکړ میلووس (د خلاصې سرچینې ویکتور ډیټابیس). موږ پوښلي چې څنګه پرمخ وړونکي کولی شي Milvus تنظیم کړي، د عکس ډیټا بار کړي، د ورته لټون پلټنه ترسره کړي، او د LLM څخه کار واخلي ترڅو د ډیرو دقیقو ځوابونو لپاره بیرته ترلاسه شوي پایلې بیا ځای پرځای کړي.


د ملټي موډل RAG حلونه د AI سیسټمونو لپاره مختلف امکانات خلاصوي چې کولی شي په اسانۍ سره د ډیټا ډیری ډولونه پوه او پروسس کړي. ځینې عام امکانات شامل دي د عکس لټون انجنونه، د شرایطو غوره پایلې، او نور.