You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过Azure OpenAI Embeddings实现CrewAI短期记忆并解决对话上下文不保留问题

如何通过Azure OpenAI Embeddings实现CrewAI短期记忆并解决对话上下文不保留问题

嘿,我之前在调试CrewAI记忆系统的时候也踩过几乎一模一样的坑,咱们一步步来排查解决:

一、先把嵌入器配置的核心坑补上

你当前的embedder_configprovider设成了"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模式下的日志贴出来,咱们再接着调!

火山引擎 最新活动