如何通过Azure OpenAI Embeddings实现CrewAI短期记忆并解决对话上下文不保留问题
如何通过Azure OpenAI Embeddings实现CrewAI短期记忆并解决对话上下文不保留问题
嘿,我之前在调试CrewAI记忆系统的时候也踩过几乎一模一样的坑,咱们一步步来排查解决:
一、先把嵌入器配置的核心坑补上
你当前的embedder_config里provider设成了"openai",这是第一个致命问题!用Azure OpenAI嵌入的话,CrewAI要求这里必须指定为"azure_openai",不然系统会默认调用原生OpenAI的接口,哪怕你填了api_base这些参数也没用。
另外还要再核对两个关键配置:
deployment_id必须是你在Azure里专门部署的嵌入模型的ID(比如text-embedding-ada-002的部署),绝对不能用聊天模型(比如gpt-35-turbo)的部署ID,嵌入和聊天模型是完全分开的model_name要和Azure部署的嵌入模型名称严格对应,比如你部署的是text-embedding-ada-002,这里就填这个值
二、确认Crew和Agent的记忆开关都拉满了
光给Crew传了短期记忆还不够,你创建Agent的时候必须加上memory=True参数!我当时就是只开了Crew的记忆,忘了开Agent的,结果agent完全不读记忆。
另外建议你把verbose改成True,虽然会多打一些日志,但能直接看到记忆系统有没有在工作——比如会输出“Retrieving relevant memories for agent...”这类日志,要是看不到,说明记忆系统根本没被触发。
三、先验证嵌入器本身能正常工作
有时候配置看起来没问题,但嵌入模型其实没被正确调用,你可以加个小测试代码,手动触发嵌入生成:
from crewai.embeddings import EmbeddingFactory # 用你修正后的embedder_config embedder = EmbeddingFactory.create(embedder_config) try: test_embedding = embedder.embed("测试一下嵌入生成") print(f"嵌入生成成功,维度是:{len(test_embedding)}") # 正常应该是1536(对应ada-002) except Exception as e: print(f"嵌入调用失败,错误:{e}")
如果这里报错,就先解决Azure的API调用问题(比如密钥错了、部署ID不对、网络权限问题);如果成功,说明嵌入器没问题,问题出在记忆的触发逻辑上。
四、任务设计要配合记忆系统的工作逻辑
CrewAI的短期记忆是基于嵌入相似性检索的,也就是说,只有当当前任务的查询和历史对话内容足够相似时,系统才会把历史上下文拉出来给agent。
所以有两个小技巧:
- 在任务的
description或者expected_output里,明确提示agent“参考之前的对话内容”,比如写成:"请参考之前讨论的项目信息,回答用户的问题:xxxx" - 确保当前查询和历史对话的语义相关,比如你之前聊的是“项目预算”,当前问“预算多少”就会触发检索,要是突然问“天气怎么样”,系统就不会拉历史上下文(这是正常的)
五、给你一个亲测有效的完整示例代码
我把所有正确配置整合在一起,你可以直接参考:
# 修正后的Azure OpenAI嵌入器配置 embedder_config = { "provider": "azure_openai", "config": { "api_key": "XXXXXXX", "api_base": "https://xxxx.openai.azure.com/", "api_type": "azure", "api_version": "2024-02-01", "model_name": "text-embedding-ada-002", "deployment_id": "你的Azure嵌入模型部署ID" } } # 初始化短期记忆 from crewai.memory import ShortTermMemory short_term_memory = ShortTermMemory(embedder_config=embedder_config) # 创建带记忆的Agent(必须加memory=True) from crewai import Agent, Crew, Task agent = Agent( role="项目协调专员", goal="根据之前的对话上下文,准确回答用户的问题", backstory="你是一个细心的项目协调员,会主动参考之前的对话信息来回复用户", memory=True, verbose=True ) # 先创建一个初始化上下文的任务 initial_task = Task( description="告知agent:'我们的项目总预算是12万美元,工期设定为8个月,核心团队有5人。'", agent=agent, expected_output="确认收到并记录项目的预算、工期和团队信息" ) # 创建一个需要调用记忆的查询任务 query_task = Task( description="请参考之前的对话内容,回答:我们的项目预算是多少?工期是多久?", agent=agent, expected_output="清晰列出项目的预算和工期数值" ) # 创建Crew(记忆开关都要开) crew = Crew( agents=[agent], tasks=[], memory=True, short_term_memory=short_term_memory, verbose=True # 开着看调试日志 ) # 先执行初始化任务,把上下文存入记忆 initial_result = crew.kickoff_tasks([initial_task]) print("初始化任务结果:", initial_result) # 再执行查询任务,验证记忆是否生效 query_result = crew.kickoff_tasks([query_task]) print("查询任务结果:", query_result)
最后再划几个重点
- 嵌入器的
provider必须是azure_openai,这是最容易踩的致命坑 - Agent和Crew的
memory=True都不能少,缺一不可 - 调试时一定要开
verbose=True,能帮你快速定位记忆系统有没有在干活 - 先验证嵌入器能正常生成嵌入,排除模型调用的底层问题
- 任务设计要给agent明确的提示,或者保证查询和历史对话语义相关
这样应该就能解决你上下文不保留的问题了,要是还有问题,你可以把verbose模式下的日志贴出来,咱们再接着调!




