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

资讯详情

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

从零构建AI社交应用:基于大模型与Agent的陪伴系统实战

从零构建AI社交应用:基于大模型与Agent的陪伴系统实战 最近在技术社区和招聘网站上一个趋势越来越明显各大互联网公司都在加速布局AI原生应用尤其是社交和内容领域。作为内容社区的头部玩家小红书被曝出正在加大AI投入重点布局AI社交方向并开启了AI陪伴产品的自研。这不仅仅是业务新闻更是一个强烈的技术信号意味着对具备AI应用开发、大模型工程化、智能体Agent构建能力的工程师需求将迎来爆发。对于开发者而言这既是机遇也是挑战。机遇在于新的技术栈和产品形态将创造大量高价值的岗位挑战在于从传统的Web/App开发转向AI驱动的应用开发需要掌握一套全新的工具链和工程思维。本文将从一个一线开发者的视角系统拆解如何从零开始构建一个具备“AI社交”或“AI陪伴”雏形的应用原型。我们将聚焦于AI Agent开发、大模型API集成、对话系统设计以及工程化部署等核心环节提供一套完整、可复现的实战方案。1. 背景与核心概念什么是AI社交与AI陪伴在深入代码之前我们需要厘清几个关键概念这有助于我们理解要构建的是什么。AI社交通常指以人工智能为核心驱动力的新型社交互动模式。它不再是简单的人与人通过平台连接而是引入了AI作为社交的参与者或增强者。例如AI角色互动用户可以与由AI驱动的虚拟角色如历史人物、动漫角色、自定义伴侣进行深度、个性化的对话和互动。社交内容AI化AI辅助用户生成更优质的社交内容如文案、图片、视频或智能匹配兴趣相投的用户和内容。社交体验增强通过AI理解对话上下文和用户情绪提供更自然的聊天建议、话题引导或情感支持。AI陪伴是AI社交的一个核心子集它更侧重于提供情感价值与长期陪伴感。其产品形态可能是一个独立的虚拟伙伴App或嵌入在现有社交产品中的功能模块。关键技术点在于让AI具备长期记忆、一致的人设、情感理解与回应以及多模态交互文字、语音、图像能力。从技术实现上看这类应用的核心是“大模型 Agent智能体”架构。大模型LLM如GPT-4、Claude、文心一言、通义千问等提供强大的自然语言理解和生成能力是AI的“大脑”。Agent智能体一个可以感知环境用户输入、进行思考调用工具、检索记忆、做出决策生成回复、执行动作并持续学习的软件实体。它围绕大模型构建负责处理复杂的交互逻辑。我们接下来的实战就将围绕构建一个简单的、具有记忆和人设的对话型AI Agent展开。2. 环境准备与版本说明我们将使用Python作为主要开发语言这是目前AI应用开发最活跃的生态。项目将基于LangChain框架它是一个用于开发由大语言模型驱动的应用程序的流行框架能极大简化Agent、记忆、工具链的构建过程。基础环境操作系统macOS / Linux (推荐) 或 Windows (WSL2)Python版本 3.9包管理工具pip 或 conda核心依赖库及版本建议我们将创建一个requirements.txt文件来管理依赖。# requirements.txt langchain0.1.0 langchain-community0.0.10 # 社区工具和集成 langchain-openai0.0.5 # OpenAI官方集成 openai1.0.0 # OpenAI Python SDK chromadb0.4.22 # 向量数据库用于记忆存储 tiktoken # OpenAI token计数 python-dotenv # 管理环境变量 fastapi0.104.0 # 构建API服务 uvicorn[standard] # ASGI服务器 pydantic2.0 # 数据验证大模型API准备本文示例将使用OpenAI的GPT模型因为它具有优秀的对话能力和广泛的工具调用支持。你需要准备一个OpenAI API Key。前往 OpenAI平台 注册并获取API Key。重要请妥善保管你的API Key不要将其硬编码在代码中或提交到版本控制系统。项目结构预览在开始前我们先规划一下项目目录。ai_companion_demo/ ├── .env # 存储环境变量如API KEY ├── requirements.txt # 项目依赖 ├── app/ │ ├── __init__.py │ ├── main.py # FastAPI应用入口 │ ├── agents/ # Agent相关代码 │ │ ├── __init__.py │ │ └── companion_agent.py # 核心Agent类 │ ├── memory/ # 记忆模块 │ │ ├── __init__.py │ │ └── vector_memory.py # 基于向量数据库的记忆 │ └── config.py # 配置文件 └── tests/ # 测试目录3. 核心组件与原理拆解一个基本的AI陪伴Agent通常由以下几个核心组件构成理解它们是如何协作的至关重要。3.1 大模型集成与提示工程大模型是Agent的基石。我们通过API调用大模型并通过提示词Prompt来引导其行为。一个设计良好的提示词决定了AI的角色、说话风格和任务边界。关键点系统提示词System Prompt定义AI的“人设”。例如“你是一个温暖、幽默、善于倾听的AI朋友名叫‘小智’。你乐于帮助用户排解情绪分享有趣的知识但避免讨论敏感话题。你的回答应该简洁、口语化。”对话历史Conversation History将过去的对话内容作为上下文输入给模型使其能进行连贯的多轮对话。用户输入User Input当前用户的问题或陈述。3.2 记忆模块没有记忆的AI就像金鱼每次对话都是新的开始。为了实现“陪伴感”必须让AI记住关于用户的 key 信息。短期记忆通常指当前会话的对话历史。可以通过维护一个对话缓冲区来实现。长期记忆记住跨会话的用户信息如姓名、喜好、过往的重要经历。这通常需要外部存储。我们使用向量数据库来实现。原理将对话中的关键信息例如“用户喜欢科幻电影《星际穿越》”转换为向量embedding并存储起来。当新对话发生时将当前问题也转换为向量并在向量数据库中搜索最相关的历史记忆作为上下文提供给大模型。3.3 工具调用可选但强大Agent不仅能聊天还能“做事”。通过定义工具ToolsAgent可以调用外部API或函数。例如get_weather(city: str)查询天气。search_web(query: str)搜索实时信息。set_reminder(time: str, task: str)设置提醒。大模型如GPT-4可以学习理解何时以及如何调用这些工具并将工具执行结果整合到回复中。3.4 Agent执行流一个简化的Agent工作流程如下接收输入获取用户消息。检索记忆从向量数据库中检索与当前对话相关的长期记忆。组装上下文将系统提示词、相关长期记忆、短期对话历史、用户当前输入组装成完整的提示。调用大模型将组装好的提示发送给大模型。解析与行动解析大模型的输出。如果输出包含工具调用则执行对应工具并将结果再次喂给模型直到模型生成最终面向用户的回复。更新记忆将本轮对话中有价值的信息存储到长期记忆中。返回回复将最终回复返回给用户。4. 完整实战构建一个具有记忆的AI陪伴Agent现在让我们一步步用代码实现上述概念。4.1 项目初始化与环境配置首先创建项目目录并安装依赖。# 创建项目目录 mkdir ai_companion_demo cd ai_companion_demo # 创建虚拟环境可选但推荐 python -m venv venv # 激活虚拟环境 # macOS/Linux: source venv/bin/activate # Windows: venv\Scripts\activate # 创建 requirements.txt 并写入上面列出的依赖 # ... 使用编辑器创建 requirements.txt ... # 安装依赖 pip install -r requirements.txt创建.env文件来存储敏感信息并确保将其添加到.gitignore中。# .env OPENAI_API_KEY你的_openai_api_key_在这里创建配置文件app/config.py。# app/config.py import os from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的环境变量 class Settings: OPENAI_API_KEY os.getenv(OPENAI_API_KEY) # 可以添加其他配置如向量数据库路径、模型名称等 MODEL_NAME gpt-3.5-turbo # 或 gpt-4 VECTOR_DB_PATH ./data/chroma_db # 向量数据库存储路径 settings Settings()4.2 实现基于向量数据库的长期记忆我们使用ChromaDB一个轻量级、开源的向量数据库。# app/memory/vector_memory.py from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.schema import Document from app.config import settings import hashlib class VectorMemory: 基于向量数据库的长期记忆管理类 def __init__(self, collection_namecompanion_memory): # 初始化嵌入模型 self.embeddings OpenAIEmbeddings( openai_api_keysettings.OPENAI_API_KEY, modeltext-embedding-3-small # 或 text-embedding-ada-002 ) # 初始化或加载Chroma向量数据库 self.vectorstore Chroma( collection_namecollection_name, embedding_functionself.embeddings, persist_directorysettings.VECTOR_DB_PATH ) self.collection_name collection_name def _generate_id(self, text: str): 为文本生成一个唯一的ID简单示例 return hashlib.md5(text.encode()).hexdigest()[:12] def add_memory(self, text: str, metadata: dict None): 添加一条记忆到向量数据库 if metadata is None: metadata {} doc_id self._generate_id(text) doc Document(page_contenttext, metadatametadata, iddoc_id) self.vectorstore.add_documents([doc]) self.vectorstore.persist() # 持久化到磁盘 print(f[Memory Added]: {text[:50]}...) def search_memories(self, query: str, k3): 搜索与查询最相关的k条记忆 if not query: return [] docs self.vectorstore.similarity_search(query, kk) memories [doc.page_content for doc in docs] print(f[Memory Retrieved for {query}]: {memories}) return memories def clear_memory(self): 清空当前集合的所有记忆谨慎使用 self.vectorstore.delete_collection() self.vectorstore Chroma( collection_nameself.collection_name, embedding_functionself.embeddings, persist_directorysettings.VECTOR_DB_PATH ) print([Memory Cleared])4.3 构建核心AI陪伴Agent这是最核心的部分我们将利用LangChain的ConversationChain和自定义记忆来构建Agent。# app/agents/companion_agent.py from langchain.chains import ConversationChain from langchain.memory import ConversationBufferWindowMemory from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from app.config import settings from app.memory.vector_memory import VectorMemory class CompanionAgent: AI陪伴智能体 def __init__(self, user_id: str default_user): self.user_id user_id self.llm ChatOpenAI( openai_api_keysettings.OPENAI_API_KEY, model_namesettings.MODEL_NAME, temperature0.7, # 控制创造性0.0更确定1.0更多变 ) # 短期记忆保留最近5轮对话 self.short_term_memory ConversationBufferWindowMemory( memory_keyhistory, input_keyinput, k5 ) # 长期记忆 self.long_term_memory VectorMemory(collection_namefmemory_{user_id}) # 定义系统提示词模板 self.system_prompt_template 你是一个温暖、幽默、善于倾听的AI朋友名叫“小智”。 你的核心目标是陪伴用户提供情感支持并进行轻松有趣的对话。 你了解用户的以下长期信息来自过往对话 {long_term_context} 当前对话历史 {history} 用户说{input} 小智 self.prompt PromptTemplate( input_variables[long_term_context, history, input], templateself.system_prompt_template ) # 创建对话链 self.conversation ConversationChain( llmself.llm, promptself.prompt, memoryself.short_term_memory, verboseFalse # 设为True可看到详细的链式调用日志 ) def _extract_and_save_long_term_memory(self, user_input: str, ai_response: str): 一个简单的启发式方法从对话中提取可能值得长期记忆的信息并保存 # 这是一个简化示例。实际应用中可以用另一个LLM来判断是否值得记忆并总结信息。 # 例如当用户透露明确的个人偏好或重要事实时。 memory_candidates [] # 规则1用户明确陈述喜好简单关键词匹配 like_keywords [喜欢, 爱, 最爱, 讨厌, 不喜欢, 希望, 梦想] if any(keyword in user_input for keyword in like_keywords): memory_candidates.append(f用户曾表示{user_input}) # 规则2用户提供了个人信息如名字、城市 # ... 可以添加更复杂的规则或NLP模型 for memory in memory_candidates: self.long_term_memory.add_memory(memory, metadata{type: preference}) def chat(self, user_input: str) - str: 主聊天接口 # 1. 检索相关长期记忆 relevant_memories self.long_term_memory.search_memories(user_input, k2) long_term_context \n.join(relevant_memories) if relevant_memories else 暂无相关信息。 # 2. 准备输入LangChain的ConversationChain会处理history和input的组装 # 但我们需要将long_term_context注入。这里我们直接格式化prompt。 # 由于ConversationChain的prompt输入变量是固定的我们需要稍微绕一下。 # 更优雅的方式是自定义Memory类或Chain这里为演示简单处理 # 实际上我们可以修改prompt模板让它从memory中读取long_term_context。 # 为了简化我们这次直接构建一个临时的chain来调用。 # 获取当前的对话历史字符串形式 history_str self.short_term_memory.load_memory_variables({})[history] # 使用我们定义好的prompt模板和LLM直接生成回复 formatted_prompt self.prompt.format( long_term_contextlong_term_context, historyhistory_str, inputuser_input ) response self.llm.invoke(formatted_prompt) ai_response response.content # 3. 更新短期记忆ConversationBufferWindowMemory会自动更新 # 我们需要手动调用memory的save_context方法 self.short_term_memory.save_context( {input: user_input}, {output: ai_response} ) # 4. 尝试提取并保存长期记忆 self._extract_and_save_long_term_memory(user_input, ai_response) return ai_response def reset_conversation(self): 重置当前对话清空短期记忆 self.short_term_memory.clear() print(f[Conversation Reset for {self.user_id}])4.4 创建API服务为了能让这个Agent通过网络被调用模拟一个后端服务我们使用FastAPI创建一个简单的Web API。# app/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from app.agents.companion_agent import CompanionAgent from app.config import settings app FastAPI(titleAI Companion API, version0.1.0) # 内存中存储不同用户的Agent实例生产环境需用数据库或缓存 agent_registry {} class ChatRequest(BaseModel): user_id: str default_user message: str class ChatResponse(BaseModel): reply: str user_id: str app.post(/chat, response_modelChatResponse) async def chat_endpoint(request: ChatRequest): 主要的聊天端点 user_id request.user_id # 获取或创建用户的Agent if user_id not in agent_registry: agent_registry[user_id] CompanionAgent(user_iduser_id) print(f[New Agent Created for user: {user_id}]) agent agent_registry[user_id] if not request.message or request.message.strip() : raise HTTPException(status_code400, detailMessage cannot be empty) try: reply agent.chat(request.message.strip()) return ChatResponse(replyreply, user_iduser_id) except Exception as e: # 记录日志 print(fError during chat for user {user_id}: {e}) raise HTTPException(status_code500, detailInternal server error during processing) app.post(/reset/{user_id}) async def reset_conversation(user_id: str): 重置指定用户的对话历史 if user_id in agent_registry: agent_registry[user_id].reset_conversation() return {message: fConversation for {user_id} has been reset.} else: raise HTTPException(status_code404, detailfUser {user_id} not found) app.get(/health) async def health_check(): 健康检查端点 return {status: healthy, model: settings.MODEL_NAME}4.5 运行与验证首先在项目根目录创建入口文件run.py。# run.py import uvicorn if __name__ __main__: uvicorn.run( app.main:app, host0.0.0.0, # 允许外部访问 port8000, reloadTrue # 开发模式代码修改自动重启 )然后在终端启动服务python run.py看到类似Uvicorn running on http://0.0.0.0:8000的输出说明服务启动成功。现在我们可以使用curl或任何API测试工具如Postman进行测试。测试1开始一段对话curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {user_id: alice, message: 你好小智我今天心情不太好。}预期会得到一个温暖、关怀性质的回复。测试2进行多轮对话并透露个人信息# 第二轮 curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {user_id: alice, message: 工作压力太大了。对了我特别喜欢看电影尤其是科幻片。} # 第三轮稍后 curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {user_id: alice, message: 你能推荐一部好看的科幻电影吗}注意观察第三轮的回复。由于我们在第二轮透露了“喜欢科幻片”这个信息并且_extract_and_save_long_term_memory方法通过关键词“喜欢”将其存入了向量数据库。在第三轮提问时search_memories会检索到这条信息并作为long_term_context提供给模型。因此AI的推荐会更个性化可能会说“既然你特别喜欢科幻片我推荐《降临》...”测试3重置对话curl -X POST http://localhost:8000/reset/alice这将清空Alice的短期对话历史但长期记忆存储在向量数据库依然保留。5. 常见问题与排查思路在开发过程中你可能会遇到以下问题问题现象可能原因排查与解决思路启动服务时报错ModuleNotFoundError依赖未安装或虚拟环境未激活。1. 确认已激活虚拟环境。2. 运行pip install -r requirements.txt确保所有依赖安装成功。3. 检查Python路径是否正确。调用/chat接口返回500错误日志显示AuthenticationErrorOpenAI API Key 错误或未设置。1. 检查.env文件中的OPENAI_API_KEY是否正确无误。2. 确保.env文件在项目根目录且python-dotenv已安装。3. 在OpenAI官网检查API Key是否有效、是否有余额。AI的回复不连贯或忘记之前说的话短期记忆窗口k设置过小或长期记忆未正确检索。1. 检查ConversationBufferWindowMemory的k参数示例中为5适当调大。2. 在companion_agent.py中开启verboseTrue观察long_term_context是否被正确检索和格式化到prompt中。3. 检查向量数据库chromadb是否成功存储和读取数据。向量数据库搜索返回空结果嵌入模型不一致或数据未持久化。1. 确保初始化VectorMemory和搜索时使用的embedding_function是同一个模型如都是text-embedding-3-small。2. 调用add_memory后是否执行了vectorstore.persist()。3. 搜索的关键词query是否太短或太模糊。服务响应速度慢网络延迟或模型推理时间长。1. 使用gpt-3.5-turbo会比gpt-4快很多成本也更低适合原型开发。2. 考虑对对话历史进行摘要压缩而不是传送全部原始文本以减少token消耗和延迟。3. 确保服务器网络能稳定访问OpenAI API。长期记忆存储了无关信息记忆提取规则 (_extract_and_save_long_term_memory) 过于简单。1. 这是本示例的简化。生产环境中应使用一个独立的“记忆判断”LLM调用来分析对话片段是否值得长期存储并生成简洁的摘要。2. 可以为记忆添加权重、类型、时间戳等元数据并实现记忆衰减或定期清理机制。6. 最佳实践与工程建议将原型发展为可上线的产品需要考虑更多工程化问题。6.1 提示工程优化人设精细化系统提示词需要精心打磨可以包含更详细的行为准则、知识边界、语气词库等。可以使用Few-Shot Prompting在提示词中给出几个优秀的对话示例。上下文管理大模型有上下文长度限制。需要对长的对话历史进行智能摘要而不是简单截断。LangChain提供了ConversationSummaryBufferMemory等高级记忆类。输出格式化如果需要AI返回结构化数据如JSON可以使用LangChain的StructuredOutputParser或利用OpenAI的response_format参数如JSON mode。6.2 记忆系统增强记忆分层实现短期会话、中期近期会话摘要、长期核心用户画像的多层记忆结构。记忆提取与总结如前所述使用一个轻量级LLM如GPT-3.5来实时判断对话中哪些信息值得存储并自动总结成简洁的陈述句。记忆检索优化结合关键词搜索和向量搜索混合搜索提高记忆检索的准确率。为记忆添加时间戳和重要性评分实现基于时间的衰减检索。6.3 性能、安全与成本缓存对频繁检索的长期记忆或通用知识问答结果进行缓存减少对向量数据库和LLM的调用。限流与降级在API层面实现限流防止滥用。在LLM服务不稳定时有降级策略如返回预置的友好提示。内容安全必须在服务端对用户输入和AI输出进行双重内容安全过滤防止生成有害、偏见或不合规的内容。可以利用各大云平台提供的内容安全API或在调用LLM前设置严格的系统提示词约束。成本控制监控Token使用量设置预算和告警。对于非核心交互考虑使用更小、更便宜的模型。对对话历史进行压缩是降低成本的关键。6.4 可观测性与测试全链路日志记录每个用户会话的完整输入、输出、使用的记忆、Token消耗和响应时间。这对调试和优化至关重要。A/B测试对人设、提示词、记忆策略等进行A/B测试用数据驱动产品迭代。评估体系建立一套自动化和人工结合的评估体系从相关性、安全性、趣味性、一致性等多个维度评估AI陪伴的质量。6.5 架构扩展微服务化将对话引擎、记忆服务、用户管理、内容安全等拆分为独立的微服务。异步处理对于耗时的记忆存储、总结等操作可以放入消息队列异步处理不阻塞实时对话。支持多模态未来可以集成语音识别/合成、图像生成/理解模型打造更丰富的交互体验。这需要设计统一的多模态消息格式和路由逻辑。从“曝小红书加大AI投入”这条行业动态到亲手搭建一个具备记忆功能的AI陪伴Agent原型我们走完了从概念到代码的完整路径。这不仅仅是学习了一个框架或API的调用更是对下一代AI原生应用核心架构——智能体Agent的实践。真正的AI社交产品其复杂性远不止于此涉及更强大的人设引擎、情感计算、社交图谱融合以及前所未有的用户体验设计。对于开发者下一步可以沿着这些方向深入深入LangChain/LlamaIndex掌握更多高级组件如工具调用Tools、规划Planning、多智能体协作Multi-Agent。探索开源模型尝试在本地部署如Qwen、Llama等开源大模型降低API成本和数据隐私风险。学习模型微调使用LoRA等轻量级技术用特定数据微调模型使其人设、知识或风格更贴合你的产品需求。关注工程化框架了解如何将此类应用部署到生产环境涉及Docker容器化、Kubernetes编排、弹性伸缩、监控告警等云原生技术。技术的浪潮已至AI正在重塑人机交互的范式。作为开发者理解原理、动手实践、持续迭代是抓住这波机遇的最好方式。希望这个实战项目能成为你探索AI社交世界的一块有用的敲门砖。
返回列表