最佳实践:构建带有记忆的专属烹饪助手

更新时间:
复制为 MD 格式

本文介绍如何结合 AgentLoop 记忆库 和 LangChain 构建一个带有记忆功能的个人专属烹饪助手。

操作步骤

  1. 创建记忆库

  2. 安装依赖:

    pip install langchain==1.2.8 langchain-openai==1.1.7 agentloop-memory
  3. 配置代码中需要的环境变量:

    ALIYUN_ACCESS_KEY_ID
    ALIYUN_ACCESS_KEY_SECRET
    CMS_ENDPOINT
    CMS_WORKSPACE
    CMS_MEMORY_STORE
    OPENAI_API_KEY
  4. 复制并运行代码:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """烹饪 Agent 助手"""
    
    import os
    import sys
    
    from agentloop_memory import Config, AgentLoopMemoryClient
    from langchain_openai import ChatOpenAI
    from langchain_core.messages import HumanMessage, SystemMessage
    
    class CookingAgent:
        """烹饪助手"""
        
        def __init__(self, memory_client: AgentLoopMemoryClient, user_id: str, llm: ChatOpenAI):
            self.memory = memory_client
            self.user_id = user_id
            self.agent_id = "cooking_assistant"
            self.llm = llm
            self.system_prompt = """你是专业的烹饪助手"小厨"。根据用户的记忆(饮食偏好、过敏等)提供个性化建议。"""
            self.history = []
        
        def chat(self, message: str) -> str:
            """处理对话"""
            # 检索记忆
            try:
                memories = self.memory.search(
                    query=message, 
                    user_id=self.user_id, 
                    agent_id=self.agent_id,
                    top_k=3,
                    rerank=True
                ).get("results", [])
            except Exception as e:
                print(f"[检索记忆失败: {e}]")
                memories = []
            
            # 构建提示
            context = "\n".join([f"- {m.get('memory', '')}" for m in memories])
            memory_context = f"用户记忆:\n{context}" if context else "暂无记忆"
            
            messages = [
                SystemMessage(content=self.system_prompt),
                SystemMessage(content=memory_context),
                *self.history[-6:],  # 最近3轮对话
                HumanMessage(content=message)
            ]
            
            # 生成响应
            response = self.llm.invoke(messages).content
            
            # 更新历史
            self.history.extend([HumanMessage(content=message), SystemMessage(content=response)])
            
            # 保存记忆(异步)
            try:
                self.memory.add(
                    messages=[
                        {"role": "user", "content": message},
                        {"role": "assistant", "content": response}
                    ],
                    user_id=self.user_id,
                    agent_id=self.agent_id,
                    infer=True,
                    async_mode=True
                )
            except Exception as e:
                print(f"[保存记忆失败: {e}]")
            
            return response
    
    
    def init_clients():
        """初始化客户端"""
        # 检查环境变量
        required = ["ALIYUN_ACCESS_KEY_ID", "ALIYUN_ACCESS_KEY_SECRET", 
                    "CMS_ENDPOINT", "CMS_WORKSPACE", 
                    "CMS_MEMORY_STORE", "OPENAI_API_KEY"]
        
        missing = [v for v in required if not os.getenv(v)]
        if missing:
            print(f" 缺少环境变量: {', '.join(missing)}")
            sys.exit(1)
        
        # 初始化 Memory 客户端
        config = Config(
            access_key_id=os.getenv("ALIYUN_ACCESS_KEY_ID"),
            access_key_secret=os.getenv("ALIYUN_ACCESS_KEY_SECRET"),
            endpoint=os.getenv("CMS_ENDPOINT"),
        )
        
        memory_client = AgentLoopMemoryClient(
            config,
            workspace=os.getenv("CMS_WORKSPACE"),
            memory_store=os.getenv("CMS_MEMORY_STORE"),
        )
        
        # 初始化 LLM
        llm = ChatOpenAI(
            api_key=os.getenv("OPENAI_API_KEY"),
            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
            model=os.getenv("OPENAI_MODEL", "qwen-plus"),
            temperature=0.7
        )
        
        return memory_client, llm
    
    
    def main():
        """主函数"""
        print("=" * 50)
        print(" 智能烹饪助手 - 小厨")
        print("=" * 50)
        print()
        
        # 初始化
        try:
            memory_client, llm = init_clients()
            agent = CookingAgent(memory_client, "user_123", llm)
        except Exception as e:
            print(f"✗ 初始化失败: {e}")
            sys.exit(1)
        
        # 主循环
        while True:
            try:
                user_input = input("你: ").strip()
                
                if not user_input:
                    continue
                
                # 对话
                response = agent.chat(user_input)
                print(f"\n小厨: {response}\n")
                
            except KeyboardInterrupt:
                print("\n\n再见!")
                break
            except Exception as e:
                print(f"\n✗ 错误: {e}\n")
    
    
    if __name__ == "__main__":
        main()
    
  5. 运行 Agent 并进行对话:

    • 第一轮对话:

      你: 我喜欢吃 川菜,湖南菜系,可以吃辣.  今天中午 吃什么你有推荐吗?
      小厨: 你好呀~欢迎来和小厨一起琢磨美食!
      既然你喜欢川菜、湘菜,又不怕辣,那咱们今天中午就可以安排一顿“热辣鲜香、下饭到跺脚”的硬菜组合!
      
      【今日推荐:剁椒鱼头 + 干煸四季豆 + 毛血旺盖饭(简版快手版)】  
      ——兼顾经典、过瘾、易操作,1小时内可搞定(含备菜+烹饪):
      
       剁椒鱼头(湘味代表,鲜辣直冲天灵盖!)  
      - 鱼头选胖头鱼/花鲢鱼头,提前用料酒、姜片、盐稍腌;  
      - 铺满自制或优质剁椒(推荐湖南临武/浏阳剁椒,辣中带酸香),加蒜末、豆豉、少量糖提鲜;  
      - 水开上锅蒸15–18分钟,出锅撒葱花+淋一勺滚烫热油,“滋啦”一声,香气爆炸  
      小贴士:怕腥?蒸前在鱼鳃和腹腔塞几片紫苏叶,去腥增香一级棒!
      
      干煸四季豆(川湘都爱的下饭菜)  
      - 四季豆手掰段,用中小火干煸至表皮微皱、略虎斑(不加油先煸,更香!);  
      - 盛出后爆香蒜末、干辣椒段、肉末(可选),再回锅+少许酱油、糖、蚝油调味;  
      升级建议:加一小把四川芽菜或湖南剁辣椒,风味更地道!
      
       主食搭配:毛血旺盖饭(快手减配版)  
      - 用现成鸭血块、午餐肉、黄豆芽、千张结焯水备用;  
      - 烧热油炒香郫县豆瓣+火锅底料(半勺足矣),加高汤/清水煮沸,下食材烫2分钟;  
      - 淋花椒油+撒花椒粉+翠绿蒜苗段——麻辣鲜烫,一口入魂!  
      
       饭后解辣小彩蛋:冰镇绿豆沙 or 一杯浓茉莉花茶(清热又刮油~)
      
      需要我帮你:
      整理成详细步骤版食谱(含用量、时间点)?  
      推荐适合单人份的简化做法(比如免蒸鱼头的替代方案)?  
      或者根据你手边现有食材(比如只有鸡胸肉/豆腐/土豆…)重新定制一道辣味主菜?  
      随时告诉我,小厨马上为你现炒一盘热乎的灵感!
      你: 剁椒鱼头具体的做法是什么呢
      你: 剁椒鱼头具体的做法是什么呢
      
      小厨: 太好啦~你点名要「剁椒鱼头」,这道菜可是湘菜里的“辣味顶流”、宴客C位担当!小厨这就为你奉上**家庭实操版详细做法**——不花哨、不翻车,重点讲清【去腥关键、火候节点、风味灵魂】,连新手也能一次成功(附避坑Tips!)
      
      ---
      
      【家庭版剁椒鱼头|2–3人份|耗时约35分钟】
      
       **核心食材清单(超市/菜场轻松搞定)**  
      | 食材 | 用量 | 小厨备注 |  
      |------|------|-----------|  
      | **胖头鱼头(花鲢鱼头)** | 1个(约1.2–1.5kg,带鱼鳃、鱼脑饱满为佳) | 选现杀的!鱼眼清澈、鱼鳃鲜红、无异味;提前让摊主劈开成两半(更易入味+好蒸) |  
      | **湖南剁椒** | 180–200g(推荐:**临武剁椒**或**浏阳豆豉剁椒**) | 别用四川泡椒代替!湘剁椒是“鲜辣+微酸+豆豉香”,才是灵魂!可加1小勺豆豉增醇厚感 |  
      | **紫苏叶** | 6–8片(新鲜为佳,干紫苏次之) | **去腥神器!** 鱼腹内、鱼头上都要铺,不可省! |  
      | **姜片 + 葱段** | 姜15g切片、葱2根打结 | 去腥基底 |  
      | **料酒** | 2勺(30ml) | 腌制用 |  
      | **白胡椒粉** | 1/4小勺 | 提鲜去腥,比黑胡椒更柔和 |  
      | **糖** | 1/2小勺(约3g) | 中和辣味、提鲜,湘菜秘技! |  
      | **蒸鱼豉油** | 1勺(15ml) | 出锅前淋,咸鲜不齁咸(不用生抽!) |  
      | **热油** | 3大勺(约45ml,花生油/茶籽油更香) | 淋油是“香气引爆点”,务必烧至**微微冒青烟(约180℃)** |
      
      ---
      
       **超清晰步骤(含时间&手感判断)**
      
      ** 处理鱼头(5分钟|去腥成败在此一步!)**  
      → 鱼头洗净,**重点刮净鱼鳃、黑膜、鱼喉部血块**(腥味最大来源!可用小刀轻刮或厨房纸擦干);  
      → 用厨房纸彻底吸干表面和内部水分(水汽=蒸不熟+腥气重);  
      → 在鱼肉厚处(如鱼脸、鱼脑旁)斜划2–3刀,方便入味;  
      → 用料酒、姜片、葱结、白胡椒粉、1小勺盐,**里外均匀抹匀**,腌10分钟;  
      → 腌好后倒掉渗出的水汁,**再用厨房纸吸一遍**(关键!)。
      
      **铺料(3分钟|层次决定风味深度)**  
      → 取深盘(能平放鱼头),铺姜片+紫苏叶;  
      → 放鱼头(皮朝上!鱼脑朝向自己,最嫩部位先接触热气);  
      → **鱼腹内塞紫苏叶+姜片+葱段**;  
      → 均匀铺满剁椒(**边缘略厚、鱼脑处堆高一点**,越厚越香辣);  
      → 撒豆豉碎(如有)、糖、再盖2片紫苏叶。
      
      **蒸制(15–18分钟|宁欠勿过!)**  
      → 蒸锅水**大火烧开**(必须沸腾再上锅!冷水上锅鱼肉易老);  
      → 鱼盘放入,**中大火蒸15分钟**(1.2kg鱼头)→ **1.5kg2分钟**;  
      → 判断熟了没?用筷子戳鱼眼旁最厚处,**能轻松穿透、鱼肉呈蒜瓣状分离、无透明感**即好;  
      → 千万别蒸久!鱼脑会变蜂窝、鱼肉发柴。
      
      **淋油点睛(2分钟|香气封神时刻)**  
      → 取出鱼盘,**倒掉蒸出的水汁**(全是腥水!必倒!);  
      → 撒新鲜葱丝+香菜末(可选);  
      → 烧热油至**青烟微起**,**绕鱼头边缘淋一圈,最后集中浇在剁椒堆高处**——滋啦!香气直冲鼻腔;  
      → 淋1勺蒸鱼豉油(沿盘边缓缓淋,避免冲散剁椒)。
      
      ---
      【小厨贴心避坑指南】  
      **为什么我的鱼头还是有点腥?** → 90%败在:①黑膜没刮净 ②没用紫苏 ③蒸出的水没倒掉。  
      **剁椒太咸怎么办?** → 腌鱼时**盐减半或不加盐**,靠剁椒和蒸鱼豉油调味。  
      **没有蒸锅?** → 用炒锅+蒸架+锅盖严实,水开后计时,确保蒸汽足!  
      **想更香?** → 淋油前加1小勺**山胡椒油**(湖南特产,清香麻香,点睛之笔!)  
      
      ---
      
      **配餐建议**(让你这顿饭更地道)  
      - 主食:**热乎糙米饭**(吸汁一流!)或**手擀面**(蘸汤吃绝了)  
      - 解辣:**冰镇酸梅汤** or **拍黄瓜+醋泡藠头**(脆爽解腻)  
      - 加菜彩蛋:蒸鱼同时,用余热灶台快速炒个**辣椒炒肉**,双辣暴击,快乐翻倍!
      
      需要我为你:  
      生成**可打印的图文步骤卡**(含备料图示)?  
      推荐**3款靠谱网购剁椒品牌+避雷清单**?  
      或者帮你把这道菜**精简成单人份·15分钟快手版**(比如用鱼头块代替整头)?  
      
      随时喊我,小厨锅铲已就位,等你一声令下~ 
      (悄悄说:今晚蒸鱼头,记得开窗!那香味…邻居可能会来敲门问菜单 )
    • 第二轮对话

      你: 今天中午吃什么呢?
      小厨: 小厨来啦~今天中午,咱们继续延续昨天那顿清爽又下饭的风格,但稍作升级,兼顾营养、快手和你的口味偏好(喜欢微辣、重鲜香、不排斥内脏类食材,且对豆制品接受度高)!
      
      今日推荐午餐:**「川香鱼头豆腐煲 + 蒜蓉空心菜 + 酸梅山药脆片」**  
      (15分钟主菜+5分钟配菜,全程少油少盐,保留镬气)
      
      **主菜|川香鱼头豆腐煲(简化快煮版)**  
      → 沿用你爱的“鱼头+豆制品”组合,但这次换成嫩豆腐+鱼头同炖,加少量泡椒末、姜蒜末、一勺豆瓣酱(可选郫县豆瓣或低盐版),清水代替高汤,小火焖8分钟即成。豆腐吸饱鱼鲜与辣香,鱼肉细嫩无刺,暖胃又开胃~  
      小贴士:鱼头已提前去鳃洗净,用厨房纸吸干再煎一下,更香不腥。
      
      **清口配菜|蒜蓉空心菜**  
      → 热锅冷油爆香蒜末,大火快炒30秒断生,淋半勺薄盐酱油提鲜。脆嫩爽口,完美中和微辣。
      
      **点睛小食|酸梅山药脆片(免炸!空气炸锅/烤箱版)**  
      → 山药切薄片,喷少许油+少量酸梅粉(或话梅酱稀释后轻拌),180℃烤12分钟至微脆。酸甜微咸,健脾开胃,还能悄悄补锌补钾~(你知道的,上次你说最近容易疲劳,这个小搭配我悄悄加了心思)
      
      需要我帮你列个采购清单、写详细步骤,或者调整成素食/减脂/控糖版本,随时告诉我哦~  
      今天想吃得热乎点,还是清爽点?小厨马上为你优化!