尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于大语言模型与RAG的AI导购系统:从原理到工程实践

基于大语言模型与RAG的AI导购系统:从原理到工程实践 最近在跟一些做电商和内容社区的朋友交流时大家普遍提到一个痛点用户面对海量商品和笔记决策成本越来越高传统的搜索和推荐虽然精准但总感觉少了点“人情味”和“即时性”。用户想要的不再仅仅是“找到”更是“帮我选”。恰好业内也传出小红书正在内部测试由道玄团队主导的“AI导购”功能这无疑是对这一用户需求和技术趋势的精准回应。本文将从技术实现的角度深入探讨如何构建一个类似“AI导购”的智能推荐与对话系统。我们将聚焦于后端服务的核心架构涵盖从需求理解、多模态信息处理、大模型应用到最终生成个性化导购建议的全链路。无论你是对AI落地电商场景感兴趣的后端开发者还是希望了解大模型如何与业务系统结合的技术爱好者都能从本文中获得一套可复现的实战方案。1. 背景与核心概念什么是“AI导购”在深入技术细节之前我们首先要明确“AI导购”的核心价值。它不是一个简单的问答机器人也不是一个加强版的搜索框。通俗理解你可以把它想象成一个24小时在线、精通全平台商品与内容、且完全了解你个人喜好的超级购物顾问。它不仅能回答“防晒霜哪个牌子好”这种问题更能基于你的肤质油性/干性、使用场景日常通勤/海边度假、预算范围甚至是你最近收藏的某篇关于“极简护肤”的笔记为你综合筛选、对比并生成一份专属的购买建议清单。专业定义“AI导购”是一个融合了自然语言处理NLP、计算机视觉CV、知识图谱KG和大语言模型LLM的复杂系统。其核心目标是通过多轮、深度的自然语言交互理解用户的复杂、模糊甚至感性的购物需求并调用结构化的商品、内容、用户数据生成可信、可解释、可执行的个性化导购方案。与传统功能的区别与传统搜索搜索是被动的依赖用户输入明确的关键词。AI导购是主动的通过对话澄清、追问来挖掘用户的潜在需求。与传统推荐系统推荐系统是“沉默”的根据历史行为进行单方面推送。AI导购是“对话式”的允许用户实时反馈“这个太贵了”、“我不喜欢这个颜色”实现动态调整。与客服机器人客服机器人主要解决售后和标准流程问题。AI导购的核心是售前决策支持需要更深的领域知识和推理能力。2. 环境准备与版本说明构建这样一个系统我们需要一个模块化、可扩展的后端技术栈。以下是我们演示环境的核心组件与版本请注意实际生产环境需要根据流量和复杂度进行集群化部署。操作系统Linux (Ubuntu 20.04 LTS 或 CentOS 7)编程语言Python 3.9 (用于AI模型服务、业务逻辑)核心框架FastAPI 0.104用于构建高性能、异步的API服务非常适合处理AI模型调用这类I/O密集型操作。LangChain 0.1用于编排和大语言模型LLM的交互流程连接工具、记忆和知识库。大语言模型LLM服务方案一本地/私有化使用ollama运行qwen:7b、llama2:7b等开源模型。适合对数据隐私要求高、希望控制成本的场景。方案二API调用使用 OpenAI GPT-4/3.5-Turbo、百度文心一言、阿里通义千问等商业API。开发快捷效果稳定但需考虑网络和成本。本文示例将采用方案二OpenAI API进行演示但架构设计是通用的。向量数据库ChromaDB或Milvus。用于存储商品、笔记内容的向量化嵌入Embeddings实现语义相似度检索。传统数据库PostgreSQL 13。用于存储结构化的用户信息、商品元数据、交互日志等。缓存Redis 7.0。用于缓存会话状态、热门商品信息、模型结果以提升响应速度。消息队列RabbitMQ 3.11或Kafka。用于解耦耗时的任务如内容向量化、日志分析、异步通知。项目结构预览ai_shopping_assistant/ ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI 应用入口 │ ├── api/ │ │ ├── __init__.py │ │ └── endpoints.py # API路由 │ ├── core/ │ │ ├── config.py # 配置管理 │ │ └── security.py # 认证鉴权 │ ├── services/ │ │ ├── llm_service.py # LLM 交互封装 │ │ ├── retrieval_service.py # 向量检索服务 │ │ └── dialogue_service.py # 对话流程管理 │ ├── models/ │ │ ├── database.py # SQLAlchemy ORM 模型 │ │ └── pydantic_models.py # 请求/响应模型 │ └── agents/ │ └── shopping_agent.py # 核心AI导购智能体 ├── requirements.txt └── .env.example3. 核心架构与原理拆解一个完整的“AI导购”后端其核心流程可以抽象为以下几个关键环节我们将逐一拆解其原理和实现要点。3.1 用户意图理解与对话管理这是对话的起点。当用户输入“我想去露营需要买点东西预算1000左右”时系统需要意图识别判断用户是想“获取购物清单”而非“查询露营地点”。槽位填充提取关键信息实体如“活动露营”、“品类装备/食品”、“预算1000元”。对话状态管理维护当前会话的上下文。例如用户接下来问“那帐篷呢”系统需要知道“那”指的是“露营”这个上下文。技术实现可以使用专门的NLU引擎如Rasa也可以利用大语言模型LLM强大的零样本/小样本理解能力。我们将采用后者通过设计精妙的System Prompt来引导LLM完成这项任务。3.2 多源信息检索与知识融合理解意图后系统需要从“知识库”中寻找答案。这个知识库是多元的结构化数据商品数据库价格、品牌、SKU、标签。非结构化数据用户笔记图文内容、商品详情页文案、用户评论。用户画像数据历史浏览、收藏、购买记录。技术实现对于非结构化文本笔记、评论我们使用文本嵌入模型如text-embedding-ada-002将其转换为向量存入向量数据库。检索时将用户问题也向量化进行相似度搜索找到最相关的笔记片段。对于结构化数据通过传统数据库查询结合用户画像进行过滤和排序。最终将检索到的商品列表、相关笔记片段、用户画像片段融合成一个结构化的“上下文”提供给LLM。3.3 大语言模型推理与内容生成这是产生智能的核心。我们将上一步准备好的“上下文”和当前“用户问题”一起提交给LLM并赋予它一个明确的“导购员”角色。System Prompt 设计示例你是一个专业、贴心的小红书AI购物助手。你的目标是根据用户的需求和提供的参考资料生成一份个性化、实用、可信的购物建议。 参考资料包括相关商品列表、用户笔记片段、用户历史偏好。 请严格按照以下格式输出 1. **需求理解**用一句话总结用户的核心需求。 2. **推荐清单**列出3-5个推荐商品每个商品包含名称、推荐理由结合笔记和用户偏好、参考价格、注意事项。 3. **下一步建议**询问用户是否对某个品类更感兴趣或者是否需要更详细的对比。 务必基于参考资料进行推荐如果资料不足请诚实告知用户并尝试询问更具体的信息。不要编造不存在的商品信息。3.4 工具调用与行动执行高级的AI导购不仅能说还能“做”。例如用户说“把第一个加入我的收藏夹”AI需要调用“添加收藏”的API。这就是LLM的“Function Calling”或“Tool Use”能力。原理我们预先定义好一系列工具函数的描述如add_to_favorites(item_id: str)。在对话中LLM会判断是否需要调用工具并生成符合工具参数的JSON数据。后端服务解析后执行对应的业务逻辑。4. 完整实战案例构建一个简易AI导购后端服务下面我们以“露营装备推荐”为场景搭建一个最小可行版本MVP的后端服务。4.1 项目初始化与依赖安装创建项目目录并安装核心依赖。mkdir ai_shopping_assistant cd ai_shopping_assistant python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate创建requirements.txt文件fastapi0.104.1 uvicorn[standard]0.24.0 langchain0.1.0 langchain-openai0.0.2 # 使用OpenAI openai1.6.1 chromadb0.4.22 # 向量数据库 psycopg2-binary2.9.9 # PostgreSQL驱动 redis5.0.1 pydantic2.5.0 pydantic-settings2.1.0 python-multipart0.0.6安装依赖pip install -r requirements.txt4.2 核心服务层实现首先创建配置和LLM服务封装。文件app/core/config.pyfrom pydantic_settings import BaseSettings from pydantic import SecretStr class Settings(BaseSettings): # API Keys (从环境变量读取切勿硬编码) openai_api_key: SecretStr database_url: str postgresql://user:passwordlocalhost:5432/shopping_db redis_url: str redis://localhost:6379/0 class Config: env_file .env settings Settings()文件app/services/llm_service.pyimport os from langchain_openai import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage from app.core.config import settings class LLMService: def __init__(self): # 初始化LangChain封装的OpenAI模型 self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.7, # 创造性导购需要一定灵活性 openai_api_keysettings.openai_api_key.get_secret_value(), max_tokens1000 ) async def generate_guide(self, user_query: str, context: str) - str: 生成导购建议 system_prompt SystemMessage(content( 你是一个专业的小红书露营装备导购。请根据用户问题和以下参考资料提供亲切、专业、实用的购买建议。\n f参考资料\n{context}\n 回答需结构化包含需求理解、推荐清单含理由、预算分配建议。 )) human_message HumanMessage(contentuser_query) try: response await self.llm.agenerate(messages[[system_prompt, human_message]]) return response.generations[0][0].text except Exception as e: # 实际项目中应有更细致的错误处理和降级策略 return f抱歉我暂时无法处理你的请求。错误信息{str(e)} llm_service LLMService()4.3 检索服务实现模拟为了简化我们模拟一个检索过程而不是真实连接向量库和数据库。文件app/services/retrieval_service.pyfrom typing import List, Dict import json class RetrievalService: def __init__(self): # 模拟一个内存中的“知识库” self.mock_products [ {id: 1, name: 轻量自动帐篷, category: 帐篷, price: 399, tags: [轻便, 自动开合], desc: 适合新手3秒速开。}, {id: 2, name: 便携卡式炉, category: 炊具, price: 199, tags: [小巧, 防风], desc: 火力稳定方便携带。}, {id: 3, name: 防潮垫, category: 睡眠, price: 89, tags: [加厚, 环保], desc: 有效隔离地面湿气。}, {id: 4, name: LED露营灯, category: 照明, price: 129, tags: [长续航, 多档调光], desc: USB充电续航72小时。}, ] self.mock_notes [ {id: 101, content: 第一次露营千万别买太贵的帐篷这款自动帐对女生超级友好, relates_to: [1]}, {id: 102, content: 卡式炉是露营的灵魂煮面烧水都靠它防风款雨天也能用。, relates_to: [2]}, ] async def retrieve(self, query: str) - Dict: 模拟检索过程返回融合的上下文信息 # 实际项目中这里会进行 # 1. 向量检索相关笔记 # 2. 数据库查询相关商品 # 3. 融合并去重 filtered_products [p for p in self.mock_products if any(tag in query for tag in p[tags]) or p[category] in query] if not filtered_products: filtered_products self.mock_products[:2] # 默认返回前两个 context { related_products: filtered_products, related_notes: self.mock_notes, budget_tips: 总预算1000元的话建议帐篷占40%炊具和照明各占30%。 } return context retrieval_service RetrievalService()4.4 智能体与API端点创建智能体来编排整个对话流程并暴露API。文件app/agents/shopping_agent.pyfrom app.services.llm_service import llm_service from app.services.retrieval_service import retrieval_service import json class ShoppingAgent: async def process_query(self, user_id: str, session_id: str, query: str) - dict: 处理用户查询的核心智能体。 1. 检索上下文。 2. 调用LLM生成建议。 3. 格式化返回。 # 1. 检索相关信息 context_dict await retrieval_service.retrieve(query) context_str json.dumps(context_dict, ensure_asciiFalse, indent2) # 2. 调用LLM生成导购内容 guide_text await llm_service.generate_guide(query, context_str) # 3. 构造响应 (实际可更复杂如解析LLM输出的结构化数据) response { session_id: session_id, user_query: query, recommendation: guide_text, retrieved_context: context_dict # 调试用生产环境可移除 } return response shopping_agent ShoppingAgent()文件app/api/endpoints.pyfrom fastapi import APIRouter, HTTPException from app.agents.shopping_agent import shopping_agent from app.models.pydantic_models import ChatRequest, ChatResponse import uuid router APIRouter() router.post(/chat, response_modelChatResponse) async def chat_with_assistant(request: ChatRequest): 用户与AI导购对话的主端点。 需要传入用户ID和查询内容会话ID可选不传则新建。 session_id request.session_id or str(uuid.uuid4()) try: agent_response await shopping_agent.process_query( user_idrequest.user_id, session_idsession_id, queryrequest.message ) return ChatResponse( session_idsession_id, replyagent_response[recommendation] ) except Exception as e: raise HTTPException(status_code500, detailfAI导购服务暂时不可用: {str(e)})文件app/models/pydantic_models.pyfrom pydantic import BaseModel, Field class ChatRequest(BaseModel): user_id: str Field(..., description用户唯一标识) message: str Field(..., description用户输入的查询消息) session_id: str | None Field(None, description会话ID用于多轮对话) class ChatResponse(BaseModel): session_id: str Field(..., description本次会话的ID) reply: str Field(..., descriptionAI导购的回复内容)4.5 应用主入口与运行文件app/main.pyfrom fastapi import FastAPI from app.api.endpoints import router as api_router from app.core.config import settings app FastAPI(titleAI Shopping Assistant API, version1.0.0) # 包含API路由 app.include_router(api_router, prefix/api/v1) app.get(/) async def root(): return {message: AI Shopping Assistant Backend is running.} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)4.6 运行与验证设置环境变量在项目根目录创建.env文件。OPENAI_API_KEY你的OpenAI_API密钥启动服务cd ai_shopping_assistant uvicorn app.main:app --reload --host 0.0.0.0 --port 8000测试API使用curl或 Postman 等工具。curl -X POST http://localhost:8000/api/v1/chat \ -H Content-Type: application/json \ -d { user_id: test_user_123, message: 我想去露营需要买点基础装备预算1000左右 }预期结果你会收到一个JSON响应其中reply字段包含了AI生成的、基于我们模拟数据的结构化露营装备购买建议包括需求理解、推荐清单和预算分配。5. 常见问题与排查思路在开发和部署此类系统时你可能会遇到以下典型问题。问题现象可能原因排查步骤与解决方案LLM响应慢或超时1. 网络延迟高。2. 模型负载大。3. 提示词Prompt过长或过于复杂。1. 检查到API服务的网络状况。2. 考虑使用更快的模型如gpt-3.5-turbo或配置合理的超时时间。3. 优化Prompt精简上下文信息使用摘要或筛选。AI回答“ hallucination ”幻觉推荐不存在的商品1. 检索到的上下文信息不足或无关。2. System Prompt 约束力不够。3. LLM的temperature参数过高。1. 加强检索系统确保返回的信息相关且准确。2. 在Prompt中明确指令“必须基于提供的参考资料回答如果资料中没有请明确告知用户不知道。”3. 适当降低temperature如从0.7调到0.3减少随机性。多轮对话中AI忘记之前聊过的内容1. 未正确维护和传递对话历史。2. 会话ID丢失或未匹配。1. 在每次请求中将完整的对话历史或最近N轮作为上下文发送给LLM。2. 使用向量数据库或缓存Redis持久化存储会话状态确保通过session_id能准确找回历史。向量检索返回结果不相关1. 文本嵌入Embedding模型不匹配。2. 检索时相似度阈值设置不当。3. 原始文本未清洗或分块不合理。1. 确保索引和查询使用相同的Embedding模型。2. 调整相似度分数阈值过滤低分结果。3. 对入库文本进行预处理去噪、分段使其成为语义完整的“块”。服务并发能力差吞吐量低1. LLM API调用是同步阻塞的。2. 未使用缓存。3. 数据库查询未优化。1. 使用异步框架如FastAPI并利用LangChain的异步接口agenerate。2. 对频繁查询的LLM结果、用户画像、商品元数据进行缓存Redis。3. 对数据库和向量数据库建立合适索引。将耗时操作如内容向量化放入消息队列异步处理。6. 最佳实践与工程建议将AI导购从Demo推向生产环境需要关注以下工程化细节6.1 提示词Prompt工程结构化输出要求LLM以JSON、XML或特定标记格式输出便于后端解析实现真正的工具调用。少样本学习Few-Shot在Prompt中提供1-3个高质量的输入输出示例能极大提升模型在特定任务上的表现。角色与边界明确、反复地定义AI的角色、能力和限制。例如“你是一名专注于美妆的导购不回答与购物无关的问题。”迭代与评估建立Prompt版本管理机制并通过人工评估或自动化测试如检查输出是否包含必填字段来持续优化。6.2 检索增强生成RAG优化混合检索结合向量检索语义相似和关键词检索精确匹配取长补短。重排序Re-ranking先用向量检索召回大量候选再用一个更精细的模型对结果进行重排序提升Top结果的相关性。元数据过滤在向量检索时结合商品类目、价格区间、品牌等结构化字段进行过滤使结果更精准。6.3 性能与成本缓存策略对常见的、结果变化不频繁的查询如“防晒霜推荐”的最终结果进行缓存。对Embedding结果进行缓存。异步化所有I/O密集型操作LLM调用、数据库查询、网络请求都应使用异步非阻塞模式。成本监控商业LLM API按Token收费必须建立监控对异常长度的Prompt或高频调用设置告警。考虑对输入文本进行摘要、截断以节省Token。6.4 安全、合规与可解释性内容安全在LLM输入和输出端设置过滤层防止生成不当、偏见或有害内容。数据隐私用户对话历史、个人信息必须加密存储并建立严格的访问控制。考虑使用可本地部署的开源模型以满足数据不出域的要求。可解释性与可控性记录每一次AI推荐的“决策依据”即检索到了哪些商品和笔记当用户质疑时可以提供参考来源增加信任度。为运营人员提供干预接口可以手动修正或屏蔽某些推荐。6.5 架构扩展性插件化工具将“查天气”、“比价”、“加入收藏”等功能设计成独立的工具Tool让LLM通过Function Calling动态调用使AI导购的能力持续扩展。多模态集成未来可接入图像理解模型让用户直接上传图片问“这件衣服搭配什么帽子好”实现真正的“图文并茂”式导购。AB测试与评估设计线上AB测试框架对比不同Prompt、不同检索策略、不同模型版本的效果用点击率、转化率、用户满意度等业务指标驱动系统迭代。
返回列表