Lychee Rerank MM代码实例调用API实现图文-图文重排序的Python实践指南1. 引言为什么需要多模态重排序想象一下这样的场景你在电商平台搜索适合夏天的连衣裙系统返回了几十件商品。有些确实是连衣裙但可能是秋冬款式有些是夏装但却是上衣或短裤。传统搜索只能基于文本匹配无法理解图片内容与查询意图的深层关联。这就是Lychee Rerank MM要解决的问题。作为一个基于Qwen2.5-VL的多模态重排序系统它能够同时理解文字和图片内容精准判断查询与文档之间的语义匹配度。无论你是要处理电商商品检索、多媒体内容推荐还是跨模态搜索这个工具都能大幅提升结果的相关性。本文将手把手教你如何通过Python代码调用Lychee Rerank MM的API实现图文-图文的重排序功能。即使你是刚接触多模态AI的开发者也能快速上手。2. 环境准备与API基础2.1 安装必要的Python库在开始之前确保你的Python环境版本在3.8以上然后安装以下依赖库pip install requests pillow numpy python-multipart这些库分别用于requests发送HTTP请求到API端点pillow处理图像文件numpy数值计算和处理python-multipart处理多部分表单数据包含图像2.2 API端点与参数说明Lychee Rerank MM提供了简单的RESTful API接口主要参数包括查询内容query可以是纯文本、图片URL或图文混合文档列表documents需要排序的候选文档集合指令instruction可选参数指导模型如何理解任务默认的API端点通常是http://localhost:8080/api/rerank如果你在本地部署3. 基础调用图文到图文的重排序3.1 准备测试数据首先我们准备一些示例数据。假设我们有一个电商搜索场景用户查询是红色连衣裙夏季新款我们有一组候选商品需要重新排序import requests from PIL import Image import base64 from io import BytesIO # 用户查询 - 图文混合 query { text: 红色连衣裙夏季新款, image_url: https://example.com/summer_dress_query.jpg # 用户可能上传的参考图片 } # 候选文档列表 - 每个文档包含文本和图片 documents [ { text: 红色雪纺连衣裙夏季新款透气, image_url: https://example.com/product1.jpg }, { text: 蓝色牛仔裤春秋款式, image_url: https://example.com/product2.jpg }, { text: 红色羊毛连衣裙冬季厚款, image_url: https://example.com/product3.jpg }, { text: 夏季短袖红色连衣裙, image_url: https://example.com/product4.jpg } ]3.2 构建API请求现在我们来构建完整的API请求def encode_image_to_base64(image_path): 将本地图片转换为base64编码 with Image.open(image_path) as img: buffered BytesIO() img.save(buffered, formatJPEG) return base64.b64encode(buffered.getvalue()).decode(utf-8) def rerank_query(query, documents, api_urlhttp://localhost:8080/api/rerank): 调用重排序API # 构建请求数据 payload { query: query, documents: documents, instruction: Given a web search query, retrieve relevant passages that answer the query. } try: # 发送POST请求 response requests.post(api_url, jsonpayload) response.raise_for_status() # 检查请求是否成功 # 解析返回结果 result response.json() return result except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) return None # 调用示例 result rerank_query(query, documents) if result: print(重排序结果:, result)4. 处理本地图片的完整示例在实际应用中你可能需要处理本地存储的图片。下面是一个完整的示例import os import requests import base64 from PIL import Image from io import BytesIO class LycheeRerankClient: def __init__(self, base_urlhttp://localhost:8080): self.base_url base_url self.rerank_endpoint f{base_url}/api/rerank def encode_image(self, image_path): 将图片文件转换为base64字符串 if not os.path.exists(image_path): raise FileNotFoundError(f图片文件不存在: {image_path}) with Image.open(image_path) as img: # 统一调整图片大小避免过大分辨率 img.thumbnail((512, 512)) buffered BytesIO() img.save(buffered, formatJPEG, quality85) return base64.b64encode(buffered.getvalue()).decode(utf-8) def rerank(self, query_text, query_image_pathNone, documentsNone): 执行重排序 参数: - query_text: 查询文本 - query_image_path: 查询图片路径可选 - documents: 文档列表每个文档包含text和image_path # 准备查询数据 query_data {text: query_text} if query_image_path: query_data[image_base64] self.encode_image(query_image_path) # 准备文档数据 processed_docs [] for doc in documents: doc_data {text: doc[text]} if image_path in doc: doc_data[image_base64] self.encode_image(doc[image_path]) processed_docs.append(doc_data) # 构建请求 payload { query: query_data, documents: processed_docs, instruction: Given a web search query, retrieve relevant passages that answer the query. } # 发送请求 try: response requests.post(self.rerank_endpoint, jsonpayload, timeout30) response.raise_for_status() return response.json() except Exception as e: print(f重排序请求失败: {e}) return None # 使用示例 if __name__ __main__: client LycheeRerankClient() # 定义查询 query_text 寻找适合海滩度假的红色长裙 query_image_path path/to/query_image.jpg # 用户提供的参考图片 # 定义候选文档 documents [ {text: 红色雪纺长裙夏季海滩度假款, image_path: path/to/doc1.jpg}, {text: 蓝色牛仔裤休闲款式, image_path: path/to/doc2.jpg}, {text: 红色羊毛冬季长裙, image_path: path/to/doc3.jpg}, {text: 碎花沙滩裙夏季新款, image_path: path/to/doc4.jpg} ] # 执行重排序 result client.rerank(query_text, query_image_path, documents) if result: print(排序前文档:) for i, doc in enumerate(documents): print(f{i1}. {doc[text]}) print(\n排序后结果:) for item in result.get(results, []): print(f文档索引: {item[index]}, 得分: {item[score]:.4f}, 文本: {documents[item[index]][text]})5. 高级技巧与最佳实践5.1 批量处理优化当需要处理大量文档时可以考虑分批处理以避免内存溢出def batch_rerank(client, query, all_documents, batch_size10): 分批处理大量文档 results [] for i in range(0, len(all_documents), batch_size): batch_docs all_documents[i:ibatch_size] batch_result client.rerank( query[text], query.get(image_path), batch_docs ) if batch_result: # 调整索引以反映全局位置 for item in batch_result.get(results, []): item[original_index] i item[index] results.extend(batch_result[results]) # 对所有结果进行全局排序 results.sort(keylambda x: x[score], reverseTrue) return results5.2 错误处理与重试机制增强API调用的稳定性import time from tenacity import retry, stop_after_attempt, wait_exponential class RobustRerankClient(LycheeRerankClient): retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def rerank_with_retry(self, query_text, query_image_pathNone, documentsNone): 带重试机制的重排序 try: return self.rerank(query_text, query_image_path, documents) except requests.exceptions.ConnectionError: print(连接失败等待重试...) time.sleep(5) raise except requests.exceptions.Timeout: print(请求超时等待重试...) time.sleep(3) raise5.3 结果解析与可视化对重排序结果进行深入分析def analyze_results(original_docs, rerank_results): 分析重排序结果 print( 重排序分析报告 ) # 计算相关性分布 scores [item[score] for item in rerank_results] avg_score sum(scores) / len(scores) max_score max(scores) min_score min(scores) print(f平均相关性得分: {avg_score:.4f}) print(f最高得分: {max_score:.4f}) print(f最低得分: {min_score:.4f}) print(f得分范围: {max_score - min_score:.4f}) # 识别最相关和最不相关的文档 top_doc_idx rerank_results[0][original_index] bottom_doc_idx rerank_results[-1][original_index] print(f\n最相关文档: {original_docs[top_doc_idx][text]}) print(f最不相关文档: {original_docs[bottom_doc_idx][text]}) # 识别得分高于阈值的文档 relevant_docs [item for item in rerank_results if item[score] 0.5] print(f\n相关性高于0.5的文档数量: {len(relevant_docs)}/{len(rerank_results)}) return { average_score: avg_score, relevant_count: len(relevant_docs), top_document: original_docs[top_doc_idx], bottom_document: original_docs[bottom_doc_idx] }6. 实际应用场景示例6.1 电商商品搜索优化def optimize_ecommerce_search(query_text, product_list): 电商搜索优化 query_text: 用户搜索词 product_list: 商品列表每个商品包含title, description, image_path client LycheeRerankClient() # 转换为API所需的文档格式 documents [] for product in product_list: # 组合标题和描述作为文本 text f{product[title]}. {product[description]} documents.append({ text: text, image_path: product[image_path] }) # 执行重排序 results client.rerank(query_text, None, documents) # 返回排序后的商品ID列表 sorted_products [] for item in results.get(results, []): original_idx item[index] sorted_products.append({ product_id: product_list[original_idx][id], score: item[score], rank: len(sorted_products) 1 }) return sorted_products6.2 多媒体内容推荐def recommend_media_content(user_query, content_list): 多媒体内容推荐 user_query: 用户查询文本或图文 content_list: 内容列表包含文本描述和封面图 client LycheeRerankClient() # 判断查询类型 if isinstance(user_query, dict) and image in user_query: # 图文查询 query_text user_query.get(text, ) query_image user_query[image] results client.rerank(query_text, query_image, content_list) else: # 纯文本查询 results client.rerank(user_query, None, content_list) return results7. 总结通过本文的实践指南你应该已经掌握了如何使用Python调用Lychee Rerank MM API实现图文-图文的重排序功能。关键要点包括环境配置简单只需几个Python库即可开始调用API数据结构清晰查询和文档都支持文本、图片或图文混合格式灵活的应用可以根据需要处理本地图片或网络图片强大的功能基于Qwen2.5-VL的多模态理解能力提供精准的相关性评分在实际应用中记得根据你的具体场景调整参数和处理逻辑。比如电商场景可能更关注商品标题和主图而内容推荐场景可能需要考虑更丰富的上下文信息。Lychee Rerank MM的多模态重排序能力为各种搜索和推荐场景提供了强大的技术基础通过合理的API调用和结果处理你可以显著提升系统的用户体验和业务效果。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。