多模态 AI 是零售业的未来吗?使用 GPT-4 Vision 和 MongoDB 矢量搜索探索智能产品发现

news2024/11/18 3:44:19

生成式人工智能如何重新定义零售盈利能力

        欢迎来到雲闪世界。想象一下这样的购物体验:您上传了一张心仪服装或商品的照片。片刻之后,您便会收到来自您喜爱的商店的个性化、AI 驱动的类似商品推荐。这是一种革命性的零售体验,由一款创新应用实现,该应用将生成式 AI 的强大功能(特别是GPT-4 Vision 等多模态模型)与 MongoDB 强大的数据管理功能相结合。

添加图片注释,不超过 140 字(可选)

这款应用不仅仅是一个概念,它已经变成了现实,改变了消费者发现产品的方式以及零售商与客户联系的方式。通过利用 GPT-4 Vision 的尖端功能进行图像分析和利用 MongoDB 进行高效数据处理,这款应用站在了智能产品发现新时代的前沿。

在本文中,我们将仔细研究这款应用的工作原理,剖析其代码以了解人工智能与数据库管理之间的相互作用。我们将探索它如何创造无缝且直观的用户体验,不仅让客户满意,还为零售商提供宝贵的见解。那么,让我们踏上这段技术探索之旅,了解这款应用如何重塑零售格局。

该应用程序在零售业的实际应用

该应用程序在零售业的实际应用

该应用程序的影响远远超出了技术创新的范围;它正在改变零售业格局。从小型精品店到大型百货商店,零售商都在利用这款应用程序以更有意义和个性化的方式与客户建立联系。

  • 时尚零售:在时尚界,这款应用改变了游戏规则。用户上传他们喜欢的服装或配饰的图片,应用会从零售商的库存中提供类似的选择。这不仅提高了客户满意度,还增加了销售额,因为用户可以发现他们可能找不到的产品。

作者创作的动画(附注:我尝试使用 draw io 来实现动态边缘)

  • 家具和家居装饰:对于家具和家居装饰零售商,该应用可帮助客户找到与其现有家具相匹配或互补的物品,从而打造出统一的室内设计体验。这增强了客户参与度并简化了购物流程。

智能产品发现应用程序的架构概述

我们的智能产品发现应用程序的架构是一系列简化的交互和流程,旨在向用户提供精准的产品推荐。它的工作原理如下:

应用程序架构概述

  1. 用户互动:旅程从用户通过用户友好界面上传他们喜欢的产品图像开始。
  2. 图像分析:然后由 GPT-4 Vision 处理上传的图像,对图像进行分析以了解其内容和上下文。
  3. 向量嵌入:GPT-4 的分析被转换成向量嵌入,它们是适合数据库查询的数值表示。
  4. MongoDB 向量搜索:使用嵌入,MongoDB 在其产品目录中进行向量搜索,以查找视觉和上下文相似的项目。
  5. 产品推荐:然后向用户展示与其初始形象最接近的一系列产品。

这种架构不仅有利于实现当前的功能,而且还可扩展以适应未来的发展,为应用程序的运行提供强大的框架。

GPT-4 视觉的作用

生成式人工智能,尤其是 GPT-4 Vision,是这一革命性应用的核心。这一人工智能模型是 OpenAI 的一项创新,旨在以非凡的准确度处理和解读图像。GPT-4 Vision 的功能不仅限于图像识别;它擅长掌握上下文细微差别、精确定位复杂细节,甚至根据视觉内容生成富有洞察力的描述和建议。这种能力对于我们的应用至关重要,因为用户可以上传所需产品或服装的图片,并期待获得精确且相关的建议。

MongoDB 在管理数据和向量搜索方面的强大功能

MongoDB 以其作为 NoSQL 数据库的稳健性而闻名,在管理此应用程序所涉及的大量数据方面发挥着关键作用。它的灵活性、可扩展性和快速处理能力使其非常适合处理大型和多样化的数据集,这是零售应用程序中的常见情况。在我们的应用程序中,MongoDB 不仅存储详细的产品信息(包括图像和描述),而且还利用其矢量搜索功能。此功能使数据库能够根据从图像中派生的向量(数字数组)执行有效的搜索。通过将图像数据转换为矢量格式,MongoDB 可以快速筛选大量集合以找到在视觉上与用户上传的图像相似的产品,从而快速而精确地补充 AI 的分析。

零售业中人工智能与数据库管理的协同作用

GPT-4 Vision 与 MongoDB 的集成,尤其是后者的矢量搜索功能,为零售业提供了一个强大的工具。GPT-4 Vision 的高级图像分析功能使应用程序能够从上传的图像中辨别用户偏好,而 MongoDB 则高效地处理产品数据库,方便快速访问相关信息。这种双重功能不仅提升了用户体验,还为零售商提供了强大的工具,可以更准确地了解和满足客户的偏好。

使用 Streamlit、OpenAI 和 MongoDB 实现增强型产品发现

设置和用户交互功能

该应用程序用户界面的核心是使用 Streamlit 构建的,Streamlit 是一款使用 Python 创建交互式 Web 应用程序的强大工具。您的代码首先要导入基本库,包括 Streamlit ( st)、OpenAI 和 MongoDB ( MongoClient)。该应用程序利用 Streamlit 创建了一个用户友好的界面,用户可以在其中上传产品图像、与 AI 交互进行分析以及查看产品推荐。关键功能(如upload_photo和 )products_from_photo定义了核心用户交互,指导用户完成上传图像和接收 AI 驱动的洞察的过程。

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">导入</span>streamlit<span style="color:#aa0d91">作为</span>st
<span style="color:#aa0d91">导入</span>o​​penai
<span style="color:#aa0d91">从</span>openai<span style="color:#aa0d91">导入</span>OpenAI
<span style="color:#aa0d91">从</span>pymongo<span style="color:#aa0d91">导入</span>MongoClient
<span style="color:#aa0d91">导入</span>o​​s
<span style="color:#aa0d91">导入</span>base64
<span style="color:#aa0d91">导入</span>请求
<span style="color:#aa0d91">导入</span>json 


<span style="color:#007400"># MongoDB 和 OPENAI 设置</span>
MONGO_URI = os.environ[ <span style="color:#c41a16">"MONGO_URI"</span> ] 

OPENAI_API_KEY = os.environ[ <span style="color:#c41a16">"OPENAI_API_KEY"</span> ] 

<span style="color:#007400"># 使用 OpenAI 的 API 获取给定文本的嵌入的函数。</span>
<span style="color:#aa0d91">def </span> get_embedding ( <span style="color:#5c2699">text</span> ): 
    client = OpenAI() 
    response = client.embeddings.create( 
    <span style="color:#5c2699">input</span> =text, 
    model= <span style="color:#c41a16">"text-embedding-ada-002"</span>
     ) 
    <span style="color:#aa0d91">return</span> response.data[ <span style="color:#1c00cf">0</span> ].embedding 


<span style="color:#007400"># 将图像编码为 base64 的函数</span>
<span style="color:#aa0d91">def </span> encode_image ( <span style="color:#5c2699">image_bytes</span> ): 
    <span style="color:#aa0d91">return</span> base64.b64encode(image_bytes).decode( <span style="color:#c41a16">'utf-8'</span> ) 

<span style="color:#007400"># 处理图像上传的函数</span>
<span style="color:#aa0d91">def </span> upload_photo (): 
    st.header( <span style="color:#c41a16">"上传您的产品照片"</span> ) 
    <span style="color:#007400"># 创建列</span>
    uploaded_image = st.file_uploader( <span style="color:#c41a16">"选择照片并上传"</span> , <span style="color:#5c2699">type</span> =[ <span style="color:#c41a16">'jpg'</span> , <span style="color:#c41a16">'png'</span> ]) 
    col1, col2, col3 = st.columns([ <span style="color:#1c00cf">1</span> , <span style="color:#1c00cf">2</span> , <span style="color:#1c00cf">1</span> ]) <span style="color:#007400"># 根据需要调整比例</span>
    <span style="color:#aa0d91">with</span> col1: 
        <span style="color:#007400"># 用于间距的空列</span>
        st.write( <span style="color:#c41a16">""</span> ) 

    <span style="color:#aa0d91">with</span> col2: 
        <span style="color:#007400"># 实际的文件上传器</span>
        
        <span style="color:#aa0d91">if</span> uploaded_image<span style="color:#aa0d91">不是</span> <span style="color:#aa0d91">None</span>  : <span style="color:#007400"># 将文件读取为字节:</span>             bytes_data = uploaded_image.getvalue() #<span style="color:#aa0d91">将</span><span style="color:#007400">上传的图像保存到会话状态</span>            st.session_state[ <span style="color:#c41a16">'uploaded_image'</span> ] = bytes_data <span style="color:#007400"># 转换为 Streamlit 可以用来显示图像的格式:</span>             st.image(bytes_data, caption= <span style="color:#c41a16">'Uploaded photo'</span> , use_column_width= <span style="color:#aa0d91">True</span> ) <span style="color:#aa0d91">with</span> col3: <span style="color:#007400"># 用于间距的空列</span>        st.write( <span style="color:#c41a16">""</span> )
            

            

            

    
        
</span></span></span></span>

OpenAI 的 GPT-4 Vision 用于图像分析

该应用程序的一个关键方面是它与 OpenAI 的 GPT-4 Vision 模型的集成,这在以下函数中显而易见analyze_image。此功能获取用户上传的图像,将其编码为 base64 格式,然后将其发送到 GPT-4 模型进行分析。AI 模型会解释图像并提供详细的见解,然后将其用于增强用户对类似产品的搜索。GPT-4 Vision 的集成使该应用程序能够以复杂而细致的方式理解和处理用户偏好。

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#007400"># 使用 OpenAI 的 GPT-4 Vision 模型分析图像的函数</span>
<span style="color:#aa0d91">def </span> analyze_image ( <span style="color:#5c2699">image_bytes, user_prompt</span> ): 
    <span style="color:#007400"># 将图像转换为 base64 字符串</span>
    base64_image = encode_image(image_bytes) 

    <span style="color:#007400"># OpenAI API 密钥 - 确保用您的实际 API 密钥替换“YOUR_OPENAI_API_KEY”</span>
     api_key = OPENAI_API_KEY 
    
    headers = { 
        <span style="color:#c41a16">“Content-Type”</span>:<span style="color:#c41a16">“application/json”</span>,
        <span style="color:#c41a16">“Authorization”</span>:<span style="color:#c41a16">f“Bearer <span style="color:#000000">{api_key}</span> ”</span>
     } 

    payload = { 
        <span style="color:#c41a16">“model”</span>:<span style="color:#c41a16">“gpt-4-vision-preview”</span>,
        <span style="color:#c41a16">“messages”</span>:[ 
            { 
                <span style="color:#c41a16">“role”</span>:<span style="color:#c41a16">“user”</span>,
                <span style="color:#c41a16">“content”</span>:[ 
                    { 
                        <span style="color:#c41a16">“type”</span>:<span style="color:#c41a16">“text”</span>,
                        <span style="color:#c41a16">“text”</span>:user_prompt   <span style="color:#007400"># 用户提示替换静态问题</span>
                    },
                    { 
                        <span style="color:#c41a16">“type”</span>:<span style="color:#c41a16">“image_url”</span>,
                        <span style="color:#c41a16">“image_url”</span>:{ 
                            <span style="color:#c41a16">“url”</span>:<span style="color:#c41a16">f"data:image/jpeg;base64, <span style="color:#000000">{base64_image}</span> "</span> , 
                            <span style="color:#c41a16">"detail"</span> : <span style="color:#c41a16">"high"</span>
                         } 
                    } 
                ] 
            } 
        ], 
        <span style="color:#c41a16">"max_tokens"</span> : <span style="color:#1c00cf">300</span>
     } 

    <span style="color:#007400"># 向 OpenAI API 发送发布请求</span>
    response = request.post( <span style="color:#c41a16">"https://api.openai.com/v1/chat/completions"</span> , headers=headers, json=payload) 
    <span style="color:#5c2699">print</span> (response) 

    response_js = response.json() 

    <span style="color:#007400"># 从第一个选择中提取内容</span>
    content = response_js.get( <span style="color:#c41a16">'choices'</span> , [{}])[ <span style="color:#1c00cf">0</span> ].get( <span style="color:#c41a16">'message'</span> , {}).get( <span style="color:#c41a16">'content'</span> , <span style="color:#c41a16">''</span> ) 

    <span style="color:#007400"># 确保响应正常</span>
    <span style="color:#aa0d91">if</span> response.status_code == <span style="color:#1c00cf">200</span> : 
        <span style="color:#aa0d91">try</span> : 
            response_js = response.json() 

            <span style="color:#007400"># 提取内容</span>
            content = response_js.get( <span style="color:#c41a16">'choices'</span> , [{}])[ <span style="color:#1c00cf">0</span> ].get( <span style="color:#c41a16">'消息'</span> , {}).get( <span style="color:#c41a16">'内容'</span> ,<span style="color:#c41a16">''</span> ) 

            <span style="color:#007400"># 查找 JSON 对象的开始和结束</span>
            json_start_index = content.find( <span style="color:#c41a16">'{'</span> ) 
            json_end_index = content.rfind(<span style="color:#c41a16">'}'</span> ) 

            <span style="color:#aa0d91">if</span> json_start_index != - <span style="color:#1c00cf">1 </span> <span style="color:#aa0d91">and</span> json_end_index != - <span style="color:#1c00cf">1</span> : 
                <span style="color:#007400"># 仅提取有效的 JSON 部分</span>
                content = content[json_start_index:json_end_index+ <span style="color:#1c00cf">1</span> ] 

            <span style="color:#007400"># 调试:打印内容</span>
            <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"收到内容:"</span> , content) 

            <span style="color:#aa0d91">if</span> content: 
                <span style="color:#007400"># 将内容解析为 JSON</span>
                 content_dict = json.loads(content) 
                product_list = content_dict.get( <span style="color:#c41a16">'product_list'</span> , {}) 
                st.session_state[ <span style="color:#c41a16">'product_list'</span> ] = product_list 
                <span style="color:#aa0d91">if </span> <span style="color:#aa0d91">not </span> <span style="color:#5c2699">isinstance</span> (product_list, <span style="color:#5c2699">dict</span> ): 
                    <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"product_list 不是字典。"</span> ) 
                    <span style="color:#aa0d91">return</span> {} 
                <span style="color:#aa0d91">return</span> product_list 
            <span style="color:#aa0d91">else</span> : 
                <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"响应中未收到任何内容。"</span> ) 
                <span style="color:#aa0d91">return</span> {} 

        <span style="color:#aa0d91">except</span> json.JSONDecodeError <span style="color:#aa0d91">as</span> e: 
            <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"无法解码 JSON:"</span> , e) 
            <span style="color:#aa0d91">return</span> {} 

    <span style="color:#aa0d91">else</span> : 
        <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">f"API 请求失败,状态代码为:<span style="color:#000000">{response.status_code}</span> “</span>)
        <span style="color:#aa0d91">返回</span>{}</span></span></span></span>

MongoDB 集成用于数据管理和向量搜索

该应用程序巧妙地集成了 MongoDB,以实现有效的数据管理。该connect_mongodb功能与存储产品数据的 MongoDB 数据库建立连接。然后查询该数据库以根据 AI 的分析检索相关产品信息。该功能利用了 MongoDB 强大的向量搜索功能,find_similar_documents改变了游戏规则。它允许应用程序根据 GPT-4 模型生成的向量表示(嵌入)对类似产品进行有效搜索,从而确保产品推荐的准确性和相关性。

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#007400"># 连接到 MongoDB 服务器并返回集合。def </span>
<span style="color:#aa0d91">connect_mongodb</span>  ():     mongo_client = MongoClient(MONGO_URI)     db = mongo_client[ <span style="color:#c41a16">"produit"</span> ]     collection = db[ <span style="color:#c41a16">"retailProducts"</span> ] <span style="color:#aa0d91">return</span> collection # 函数根据提供的<span style="color:#007400">嵌入在 MongoDB 中查找类似文档。</span><span style="color:#aa0d91">def </span>find_similar_documents ( <span style="color:#5c2699">embedding</span> ):     collection = connect_mongodb()     documents = <span style="color:#5c2699">list</span> (collection.aggregate([         { <span style="color:#c41a16">“$vectorSearch”</span>:{ <span style="color:#c41a16">“index”</span>:<span style="color:#c41a16">“vector_index”</span>,<span style="color:#c41a16">“path”</span>:<span style="color:#c41a16">“nameEmbeddings”</span>,<span style="color:#c41a16">“queryVector”</span>:embedding,<span style="color:#c41a16">“numCandidates”</span>:<span style="color:#1c00cf">10</span>,<span style="color:#c41a16">“limit”</span>:<span style="color:#1c00cf">1</span>             }         },        { <span style="color:#c41a16">“$project”</span>:{ <span style="color:#c41a16">“_id”</span>:<span style="color:#1c00cf">0</span>,<span style="color:#c41a16">“name”</span>:<span style="color:#1c00cf">1</span>,<span style="color:#c41a16">“subcategory”</span>:<span style="color:#1c00cf">1</span>,<span style="color:#c41a16">“model”</span>:<span style="color:#1c00cf">1</span>,<span style="color:#c41a16">“id”</span>:<span style="color:#1c00cf">1</span>,<span style="color:#c41a16">“variation_0_image”</span>:<span style="color:#1c00cf">1</span>,<span style="color:#c41a16">“raw_price”</span>:<span style="color:#1c00cf">1</span> }}     ]))<span style="color:#5c2699">打印</span>(documents)<span style="color:#aa0d91">返回</span>文档



    


 



        
            
            
            
            
            




    
    </span></span></span></span>

Vector Search:增强产品匹配

向量搜索是一项关键功能,使该应用程序能够找到在视觉和上下文上符合用户兴趣的产品。该应用程序使用 OpenAI 的 GPT-4 为文本描述创建嵌入,然后 MongoDB 使用该嵌入进行向量搜索。该过程在函数中很明显product_Recommandation,其中生成嵌入并用于查询 MongoDB 中的类似项目。这种方法可确保应用程序的产品建议高度相关且与用户的初始图像查询紧密相关。

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">def </span> product_Recommandation ( <span style="color:#5c2699">product_list</span> ): 
    <span style="color:#007400"># 为搜索结果初始化一个空列表</span>
    search_results = [] 

    <span style="color:#007400"># 检查 product_list 是否有效</span>
    <span style="color:#aa0d91">if </span> <span style="color:#aa0d91">not </span> <span style="color:#5c2699">isinstance</span> (product_list, <span style="color:#5c2699">dict</span> ): 
        <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"无效的产品列表。应为字典。"</span> ) 
        <span style="color:#aa0d91">return</span> search_results 

    <span style="color:#007400"># 遍历列表中的产品</span>
    <span style="color:#aa0d91">for</span> key, value <span style="color:#aa0d91">in</span> product_list.items(): 
        result = <span style="color:#c41a16">f" <span style="color:#000000">{key}</span> : <span style="color:#000000">{value}</span> \n" </span>
        <span style="color:#5c2699">print</span> (result) 
        product_embedding = get_embedding(result) 
        <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">f"正在搜索:<span style="color:#000000">{key}</span> : <span style="color:#000000">{value}</span> "</span> ) 
        documents = find_similar_documents(product_embedding) 

        <span style="color:#007400"># 将找到的文档添加到搜索结果中</span>
        search_results.extend(documents) 

    <span style="color:#007400"># 返回找到的文档列表</span>
    <span style="color:#aa0d91">return</span> search_results</span></span></span></span>

在 MongoDB 上创建向量搜索索引以查找类似产品。

<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">{ 
  <span style="color:#836c28">“fields” </span>: [ 
    { 
      <span style="color:#836c28">“numDimensions” </span>: <span style="color:#1c00cf">1536 </span>,
      <span style="color:#836c28">“path” </span>: <span style="color:#c41a16">“nameEmbeddings” </span>,
      <span style="color:#836c28">“similarity” </span>: <span style="color:#c41a16">“余弦” </span>,
      <span style="color:#836c28">“type” </span>: <span style="color:#c41a16">“vector” </span>
    } 
  ] 
}</span></span></span></span>

用户界面演练

该应用由 Streamlit 提供支持,界面简洁直观,可引导用户完成无缝的产品发现之旅。从用户与应用交互的那一刻起,他们就会看到一个简单的菜单,这要归功于 Streamlit 的侧边栏功能。选项 — “上传照片”、“照片中的产品”和“显示产品” — 一目了然,即使是技术专业知识最少的人也可以使用该应用。

  • 上传图片:该upload_photo功能是用户的起点。在这里,他们可以轻松上传他们感兴趣的产品的照片。该应用程序使用 Streamlit 的文件上传器,支持各种图像格式,确保用户可以轻松上传图像。
  • 人工智能驱动的产品分析:一旦上传图片,该products_from_photo功能就会接管。用户可以在文本区域中输入他们的查询或偏好,启动 GPT-4 Vision 模型来分析图片。此功能体现了该应用程序将人工智能的复杂性与用户的简单性相结合的能力。
  • 产品推荐:用户旅程的最后一步是查看产品。该show_products功能显示 MongoDB 矢量搜索的结果,为用户提供类似产品的列表,并附有图片和说明。此功能不仅展示了该应用程序的技术实力,还展示了其对用户满意度的关注。
<span style="color:rgba(0, 0, 0, 0.8)"><span style="background-color:#ffffff"><span style="background-color:#f9f9f9"><span style="color:#242424">
<span style="color:#007400"># 处理图像上传的函数</span>

<span style="color:#aa0d91">def </span> upload_photo (): 
    st.header( <span style="color:#c41a16">"上传您的产品照片"</span> ) 
    <span style="color:#007400"># 创建列</span>
    uploaded_image = st.file_uploader( <span style="color:#c41a16">"选择照片并上传"</span> , <span style="color:#5c2699">type</span> =[ <span style="color:#c41a16">'jpg'</span> , <span style="color:#c41a16">'png'</span> ]) 
    col1, col2, col3 = st.columns([ <span style="color:#1c00cf">1</span> , <span style="color:#1c00cf">2</span> , <span style="color:#1c00cf">1</span> ]) <span style="color:#007400"># 根据需要调整比例</span>
    <span style="color:#aa0d91">with</span> col1: 
        <span style="color:#007400"># 用于间距的空列</span>
        st.write( <span style="color:#c41a16">""</span> ) 

    <span style="color:#aa0d91">with</span> col2: 
        <span style="color:#007400"># 实际的文件上传器</span>
        
        <span style="color:#aa0d91">if</span> uploaded_image<span style="color:#aa0d91">不是</span> <span style="color:#aa0d91">None</span>  : <span style="color:#007400"># 将文件读取为字节:</span><span style="color:#aa0d91">bytes_data</span>             = uploaded_image.getvalue() <span style="color:#007400"># 将上传的图像保存到会话状态</span>            st.session_state[ <span style="color:#c41a16">'uploaded_image'</span> ] = bytes_data <span style="color:#007400"># 转换为 Streamlit 可以用来显示图像的格式:</span>             st.image(bytes_data, caption= <span style="color:#c41a16">'上传的照片'</span> , use_column_width= <span style="color:#aa0d91">True</span> ) <span style="color:#aa0d91">with</span> col3:<span style="color:#007400"># 用于间距的空列</span>        st.write( <span style="color:#c41a16">“”</span> ) <span style="color:#007400"># 用于处理聊天机器人交互和产品提取的函数</span><span style="color:#aa0d91">def </span>products_from_photo():    st.header(<span style="color:#c41a16">“从您的照片中提取产品”</span>)    user_prompt =(<span style="color:#c41a16">“您是一个有用的AI助手,从照片中提取服装产品,每种产品都采用单独的JSON格式,“ </span><span style="color:#c41a16">”用法语简单描述和颜色。 " </span><span style="color:#c41a16">"您应该严格遵循格式,但不是内容:" </span><span style="color:#c41a16">"```{\"product_list\": {\"{产品类别}\": \"{产品描述}\", \"{产品类别}\": " </span><span style="color:#c41a16">"\"{产品描述}\", \"{产品类别}\": \"{产品描述}\", " </span><span style="color:#c41a16">"\"{产品类别}\": \"{产品描述}\"}```"</span> )     user_input = st.text_area( <span style="color:#c41a16">"要求AI提取服装细节:"</span> , user_prompt, height= <span style="color:#1c00cf">200</span> ) <span style="color:#007400"># 从会话状态中检索上传的图像</span>    bytes_data = st.session_state.get( <span style="color:#c41a16">'uploaded_image'</span> , <span style="color:#aa0d91">None</span> ) <span style="color:#aa0d91">if</span> bytes_data:         st.write( <span style="color:#c41a16">"图像存在。</span>" )         col1, col2, col3 = st.columns([ <span style="color:#1c00cf">1</span> , <span style="color:#1c00cf">2</span> , <span style="color:#1c00cf">1</span> ])
            

            

            

    
        



 

    

                   
                   
                   
                   
                   


    

    
    

<span style="color:#007400"># 根据需要调整比例</span>
        <span style="color:#aa0d91">with</span> col1: 
            <span style="color:#007400"># 用于间隔的空列</span>
            st.write( <span style="color:#c41a16">""</span> ) 

        <span style="color:#aa0d91">with</span> col2: 
            <span style="color:#007400"># 实际文件上传者</span>
            
            st.image(bytes_data, caption= <span style="color:#c41a16">'Uploaded Outfit'</span> , use_column_width= <span style="color:#aa0d91">True</span> ) 
        <span style="color:#aa0d91">with</span> col3: 
            <span style="color:#007400"># 用于间隔的空列</span>
            st.write( <span style="color:#c41a16">""</span> ) 
   
    <span style="color:#aa0d91">else</span> : 
        st.write( <span style="color:#c41a16">"尚未上传图像。"</span> ) 
    <span style="color:#aa0d91">if</span> st.button( <span style="color:#c41a16">"Extract"</span> ):
        <span style="color:#aa0d91">如果</span>bytes_data<span style="color:#aa0d91">不是</span> <span style="color:#aa0d91">None</span> <span style="color:#aa0d91">并且</span>user_input: <span style="color:#007400"># 使用图像字节和用户提示调用 analyze_image 函数</span>            result = analyze_image(bytes_data, user_input) <span style="color:#aa0d91">#</span> <span style="color:#007400">处理结果并提取服装元素描述</span><span style="color:#007400"># 结果处理将取决于响应的结构</span>            st.write(result)   <span style="color:#007400"># 用于显示原始结果的占位符</span><span style="color:#007400"># 用于显示推荐产品的函数</span><span style="color:#aa0d91">def </span>show_products ():     st.header( <span style="color:#c41a16">"Show Products from Vector Search"</span> ) <span style="color:#007400"># 检查 'product_list' 是否可用在会话状态中</span><span style="color:#aa0d91">if </span><span style="color:#c41a16">'product_list' </span><span style="color:#aa0d91">in</span> st.session_state <span style="color:#aa0d91">and</span> st.session_state[ <span style="color:#c41a16">'product_list'</span> ]:         product_list = st.session_state[ <span style="color:#c41a16">'product_list'</span> ] <span style="color:#007400"># 假设 product_list 是一个字典</span><span style="color:#aa0d91">if </span><span style="color:#5c2699">isinstance</span> (product_list, <span style="color:#5c2699">dict</span> ):             st.subheader( <span style="color:#c41a16">"Current Product List:"</span> ) <span style="color:#007400"># 临时字典存储修改</span>            modified_product_list = {} <span style="color:#aa0d91">for</span> category, description <span style="color:#aa0d91">in</span> product_list.items():                 st.text( <span style="color:#c41a16">f"Category: </span><span style="color:#c41a16"><span style="color:#000000">{category}</span></span><span style="color:#c41a16"> "</span> )                 modified_description = st.text_area( <span style="color:#c41a16">f"Modify description for </span><span style="color:#c41a16"><span style="color:#000000">{category}</span></span><span style="color:#c41a16"> "</span> , value=description)                 modified_product_list[category] ​​= modified_description <span style="color:#aa0d91">if</span> st.button( <span style="color:#c41a16">"Update and Search Similar Products"</span> ): <span style="color:#007400"># 使用修改后的产品列表更新会话状态</span>                st.session_state[ <span style="color:#c41a16">'product_list'</span> ] = modified_product_list <span style="color:#007400"># 使用更新后的产品列表调用 product_Recommandation 函数</span>
            

            
            



 


    
      


        
         


            


            




            
                


                
                vector_search_results = product_Recommandation(modified_product_list) 

                <span style="color:#007400"># 显示搜索结果</span>
                <span style="color:#aa0d91">if</span> vector_search_results: 
                    st.subheader( <span style="color:#c41a16">"搜索结果:"</span> ) 
                    st.subheader( <span style="color:#c41a16">"搜索结果:"</span> ) 
                    <span style="color:#aa0d91">for</span> product <span style="color:#aa0d91">in</span> vector_search_results: 
                        product_name = product.get( <span style="color:#c41a16">"name"</span> , <span style="color:#c41a16">"未知产品名称"</span> ) 
                        product_subcategory = product.get( <span style="color:#c41a16">'subcategory'</span> , <span style="color:#c41a16">'未知'</span> ) 
                        product_image_url = product.get( <span style="color:#c41a16">"variation_0_image"</span> , <span style="color:#c41a16">""</span> ) 

                        <span style="color:#007400"># 调试:打印图片网址</span>
                        <span style="color:#5c2699">print</span> ( <span style="color:#c41a16">"尝试显示图片网址:"</span> , product_image_url) 

                        st.write(product_name) 
                        st.write( <span style="color:#c41a16">f"子类别:<span style="color:#000000">{product_subcategory}</span> "</span> ) 

                        <span style="color:#007400"># 如果网址存在,则显示图片</span>
                        <span style="color:#aa0d91">if</span> product_image_url: 
                            <span style="color:#aa0d91">try</span> : 
                                col1, col2, col3 = st.columns([ <span style="color:#1c00cf">1</span> , <span style="color:#1c00cf">2</span> , <span style="color:#1c00cf">1</span> ]) <span style="color:#007400"># 根据需要调整比例</span>
                                <span style="color:#aa0d91">with</span> col1: 
                                    <span style="color:#007400"># 空列用于间隔</span>
                                    st.write( <span style="color:#c41a16">""</span> ) 

                                <span style="color:#aa0d91">with</span> col2: 
                                    <span style="color:#007400"># 实际的文件上传者</span>
                                    st.image(product_image_url, caption=product_name, use_column_width= <span style="color:#aa0d91">True</span> ) 
                                <span style="color:#aa0d91">with</span> col3: 
                                    <span style="color:#007400"># 空列用于间隔</span>
                                    st.write( <span style="color:#c41a16">""</span> ) 
                                
                            <span style="color:#aa0d91">except</span> Exception <span style="color:#aa0d91">as</span> e: 
                                st.error( <span style="color:#c41a16">f"显示图像时出错:<span style="color:#000000">{e}</span> "</span> ) 
                        <span style="color:#aa0d91">else</span> : 
                            st.write( <span style="color:#c41a16">"此产品没有可用图像。"</span> ) 
                        <span style="color:#007400">#st.write(product.get("name", "未知产品名称")) </span>
                        <span style="color:#007400">#st.write(f"子类别: {product.get('subcategory', 'Unknown')}") </span>
                        <span style="color:#007400">#st.image(product.get("image_url", ""), caption=product.get("name", "产品名称"), use_column_width=True) </span>
                <span style="color:#aa0d91">else</span> : 
                    st.write( <span style="color:#c41a16">"未找到类似产品。</span>“ )

        <span style="color:#aa0d91">否则</span>:
            st.error(<span style="color:#c41a16">“产品列表的格式不符合要求,请检查数据源。”</span> ) 
    <span style="color:#aa0d91">else</span> : 
        st.write( <span style="color:#c41a16">“未找到产品列表,请先分析一张图片。”</span> )</span></span></span></span>

您可以在我的 Github 上找到完整代码:GitHub - cozypet/multimodalProductsFinder

展示应用程序的界面和功能

该应用程序的界面展示了以用户为中心的设计和功能。通过一系列屏幕截图,我们可以直观地看到从图片上传到产品推荐的无缝过程。

主页 — 欢迎垫

主页是一个简洁、易于导航的起点,邀请用户探索应用程序的各种功能,如人工智能分析和交互式推荐。

主页

上传——第一次互动

上传页面非常简单,提供简单的拖放或文件选择方法,供用户上传他们想要找到的产品图像。

分析——人工智能驱动的洞察

在分析部分,用户提示人工智能从他们的照片中提取产品详细信息,突出显示该应用程序实时响应的人工智能集成。

结果 — 发现产品

最后,结果页面向用户展示应用程序识别的视觉上相似的产品,并包含详细信息和查看更多内容的选项,有效地展示了应用程序的端到端功能。

结论

零售业中 AI 与 MongoDB 的整合展示了提高投资回报率的明确途径。通过个性化购物体验,这项技术不仅可以提高销售额,还可以培养客户忠诚度。利用此类应用程序的零售商可以期望在竞争激烈的数字市场中实现更高的效率、更高的转化率,并最终实现更强劲的财务业绩。

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零到一,数据恢复不求人!2024年四款全免费神器,轻松搞定

活在这个电脑手机满天飞的时代&#xff0c;我们天天跟数据打交道。工作文件、家庭照片、视频&#xff0c;这些都是我们的宝贝&#xff0c;一旦没了或者出问题&#xff0c;那可真够呛。好在我们有高科技帮忙&#xff0c;数据恢复现在也不是啥大问题。今儿个&#xff0c;我要给你…

数说故事 | 2024巴黎奥运会,“谷子文化”出圈了

全红婵金牌&#xff0c;全网沸腾。 摘金之后全妹的痛包&#xff08;itabag&#xff0c;是指挂满人物徽章和玩偶等周边的包包&#xff0c;因为这样的包会让人感觉“奇怪和夸张&#xff0c;日语的“痛”有此含义&#xff0c;所以被称为“痛包”&#xff09;&#xff0c;也让二次…

多模态大模型(MLLM):架构篇

**【导读】**多模态大模型主要是以LLM作为核心决策模块&#xff0c;主流架构有两种&#xff1a;LLM as Discrete Scheduler/Controller和LLM as joint part of system&#xff0c;第一种LLM充当任务调度的作用&#xff0c;第二种LLM通过Encoder-LLM-Decoder结构作为系统的关键连…

探索Python性能优化的神秘力量:Line Profiler

文章目录 探索Python性能优化的神秘力量&#xff1a;Line Profiler第一部分&#xff1a;背景第二部分&#xff1a;库简介第三部分&#xff1a;安装指南第四部分&#xff1a;基本使用方法第五部分&#xff1a;实际应用场景场景1&#xff1a;数据分析场景2&#xff1a;机器学习模…

Docker 离线下载镜像(本地)

最近很多离线下载镜像的网站挂了&#xff0c;可以选择 docker hub 下载上传到服务器 Docker desktop image-tools ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/04174b8cefe3445596e09b1e82d9253b.png 保存后&#xff0c;就可以上传服务器&#xff0c;通过 dock…

音频合成剪辑工具推荐哪个?5款高效工具不容小觑

在探索音乐和声音的世界中&#xff0c;我发现了几款令人兴奋的音频剪辑软件&#xff0c;它们不仅功能强大&#xff0c;而且完全免费。作为一个热衷于音频制作的爱好者&#xff0c;我深知找到一款既经济又高效的工具是多么重要。 今天&#xff0c;我想跟大家分享我的一些发现&a…

jeecg部署后端到ubuntu

安装java17 java -versionsudo apt updatesudo apt install openjdk-17-jre-headless安装tomcat 更新源 sudo apt update在apt中搜索tomcat sudo apt search tomcat安装tomcat10和tomcat10-admin sudo apt install tomcat9 tomcat9-admin启动tomcat sudo systemctl start…

C语言小练习(伍)

练习&#xff1a; 利用指针变量将一个数组中的数据反向输出。 void renew(int *p,int len) {for(int i len - 1;i > 0;i--){printf("%d",*(pi));} }int main() {int a[5] {1,2,3,4,5};int len1 sizeof(a) / sizeof(int);renew(a,len1);return 0; }运行结果: …

AI文生图新纪元:FLUX.1领衔,多款顶尖模型汇聚趋动云社区

前言 近期&#xff0c;SD(Stable Diffusion)原班人马(跳槽后新成立团队——Black Forest Lab)开源模型 FLUX.1&#xff0c;或成文生图模型新霸主&#xff01; FLUX.1 系列包含 pro、dev、schnell 3 个模型。主要在文字生成、复杂指令遵循和人手生成上具备优势。 FLUX.1pro&a…

爆学C++之类和对象(上)

1.类的定义 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。 • …

IDEA中设置类和方法的注释

分两步设置&#xff1a; 第一个设置是创建类的时候自动加的注解 第二个设置是快捷键为方法增加的注解 类的时候自动加的注解设置 注释模版 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end /** * Description: TODO * Auth…

IOPaint部署,在服务器Ubuntu22.04系统下——点动科技

这里写目录标题 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安装CUDA2.5 环境变量配置 二、安装miniconda环境…

2024年第九届机器人与自动化工程国际会议(ICRAE 2024)即将召开!

2024年第九届机器人与自动化工程国际会议(ICRAE 2024)将于11月15-17日在新加坡举办。ICRAE 2024会议旨在为机器人与自动化工程等领域的专家学者建立一个广泛有效的学术交流平台&#xff0c;以便让参会人员及时了解行业发展动态、掌握最新技术&#xff0c;促使我们快速、准确地解…

在scss中如何使用hover(Vue项目)

在scss中如何使用hover&#xff08;Vue项目&#xff09; 最近在Vue项目中&#xff0c;想实现在鼠标悬浮时&#xff0c;修改鼠标指向的模块样式&#xff0c;但使用的是scss&#xff0c;写法是什么样的呢&#xff1f; 效果图&#xff1a; 实现代码&#xff1a; .content {widt…

Android系统和开发--安全性和权限管理 SELinux 策略 安全架构

学习android权限知识 SElinux chmod -R 777 ./ setenforce 0 adb root su fastboot oem at-unlock-vboot adb disable-verity Android权限 Android系统是基于Linux内核构建的&#xff0c;因此它继承了Linux的权限管理机制。Android应用需要通过声明权限来访问系统的某些功能&…

使用docker compose一键部署redis服务

使用docker compose一键部署redis服务 1、创建安装目录 mkdir /data/redis/ -p && cd /data/redis2、创建docker-compose.yml文件 version: 3 services:redis:image: registry.cn-hangzhou.aliyuncs.com/xiaopangpang/redis:7.0.5container_name: redisrestart: al…

Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

一、背景知识 进程即正在执行的一个过程。进程是对正在运行的程序的一个抽象。 进程的概念起源于操作系统&#xff0c;是操作系统最核心的概念&#xff0c;也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 一&#xff09…

专利审查信息查询

1 登录国知局 国家知识产权局 政务服务平台 (cnipa.gov.cn) 进入网上办事 2 中国及多国专利审查信息查询 3 输入条件 弹出窗口 下载。 我们学校没有授权电子申请&#xff0c;没有办法&#xff0c;得自己关注&#xff01;

MySQL-进阶篇-存储引擎

文章目录 1. MySQL 的体系结构1.1 连接层1.2 服务层1.3 存储引擎层1.4 存储层 2. 存储引擎2.1 存储引擎简介2.2 查看数据库支持的引擎2.3 指定存储引擎2.4 InnoDB 引擎2.4.1 InnoDB 的特点2.4.2 与 InnoDB 有关的磁盘文件2.4.3 InnoDB 的逻辑结构 2.5 MyISAM 引擎2.5.1 MyISAM …

虚拟机安装centos7-NAT网络模式安装

1、打开虚拟机&#xff0c;点击编辑&#xff0c;选择虚拟网络配置器 2、选择VMnet8的NAT类型 3、点击NAT设置&#xff0c;修改网关 4、点击应用及确定&#xff0c;如果你的子网IP及子网掩码没有的情况下&#xff0c;请优先设置 5、点击文件&#xff0c;选择新建虚拟机 6、选择典…