本节约处在第六章第一站,也是生态篇的拐点。"非此即彼"是误区。CrewAI 强在角色编排,LlamaIndex 强在检索与索引,LangChain 强在组件广度——三者各管一段,拼起来才是一条完整的智能应用管线。我们先画清它们怎么接。

最典型的集成:用 LlamaIndex 建好文档索引,把它的查询引擎包成一个 CrewAI 工具,供研究员角色调用。这样 CrewAI 负责"谁在什么时候问",LlamaIndex 负责"从哪份文档找答案"。
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from crewai.tools import tool from crewai import Agent, Task, Crew, Process # 6.1 与其他 AI 框架的集成(如 LangChain、LlamaIndex) docs = SimpleDirectoryReader("knowledge/").load_data() index = VectorStoreIndex.from_documents(docs) query_engine = index.as_query_engine() # 包成 CrewAI 工具 @tool("内部知识库查询") def kb_query(question: str) -> str: """基于内部文档回答。参数 question 为自然语言问题。""" return str(query_engine.query(question)) # CrewAI 侧:研究员带上这个工具 researcher = Agent(role="研究员", goal="用内部文档作答", backstory="严谨", tools=[kb_query], verbose=True) t = Task(description="回答 {question}", expected_output="带出处的答案", agent=researcher) crew = Crew(agents=[researcher], tasks=[t], process=Process.sequential) # crew.kickoff(inputs={"question": "退款政策如何规定"})
这样你的多智能体既能"角色协作",又能"查私有知识",两者各司其职。关键是集成发生在 Tool 这层契约——LlamaIndex 不知道 CrewAI 的存在,CrewAI 只知道有个工具能回答,互不侵入。
和 LangChain 的集成同理:把 LangChain 的 chain 或 retriever 包成工具。比如用 LangChain 的文档加载器处理复杂格式,再交给 CrewAI 编排:
from langchain_community.document_loaders import WebBaseLoader from crewai.tools import tool @tool("网页正文提取") def fetch_article(url: str) -> str: """提取指定网址的正文文本。参数 url 为完整链接。""" loader = WebBaseLoader(url) return "\n".join(d.page_content for d in loader.load()) web_researcher = Agent(role="研究员", goal="读网页提炼", backstory="细致", tools=[fetch_article], verbose=True)
这里要注意一个工程边界:LangChain 生态庞大,但 CrewAI 本身已带 crewai_tools(含搜索、抓取等)。优先用 CrewAI 原生工具,省一层依赖;只有当原生工具覆盖不了(如特殊文档格式、私有检索后端)时,才借 LangChain/LlamaIndex 补位。我们反对"为了用 LangChain 而用 LangChain"——多一层依赖就多一处升级雷。
反过来,CrewAI 也能被嵌进更大的 LangChain 应用:把整个 Crew 当成一个可调用单元。适合"主流程是 LangChain、其中一段需要多角色协作"的混合架构。
收尾提醒:集成的原则是"用对方的长板补自己的短板,通过 Tool 解耦"。CrewAI 不试图取代检索框架,它把检索结果当工具输出消费。带着"谁擅长哪段"的清醒去拼装,比追框架热度稳。下一站讲社区资源,告诉你这些集成范例与最佳实践去哪找、怎么挑着用。
CrewAI 擅长角色协作,但检索、文档索引这类活儿 LlamaIndex 更强,复杂链编排 LangChain 更全。实际项目常让 CrewAI 当"总指挥",把别人家的组件当工具接进来。
| 框架 | 强项 | 在协作里的位置 |
|---|---|---|
| LlamaIndex | 文档检索/索引 | 作为 Agent 的检索工具 |
| LangChain | 链/Runnable 生态 | 封装成工具被 Crew 调用 |
| CrewAI | 多角色协作 | 顶层编排与分工 |
⚠️ 常见坑:为了"统一技术栈"硬把所有逻辑搬进 CrewAI,结果检索质量下降。我们主张各司其职——检索差事交给 LlamaIndex,CrewAI 只管"谁来用检索结果、怎么汇总"。
下面演示把一个外部检索函数包成 CrewAI 工具,让 Agent 能调它:
from crewai import Agent from crewai.tools import tool @tool("知识库检索") def retrieve(query: str) -> str: """调用外部索引服务返回相关段落(此处用占位实现)。""" # 真实场景: 调 LlamaIndex / 向量库 return f"与 [{query}] 相关的检索结果片段" analyst = Agent(role="分析师", goal="基于资料作答", backstory="严谨", tools=[retrieve], verbose=True) print(analyst.tools[0].name)
💡 关键直觉:集成不是"二选一",而是"搭班子"。CrewAI 像项目经理,LlamaIndex 像资料员,LangChain 像流程专家——让每人干最擅长的事,整体反而最强。强行让一个人干三人的活,通常哪件都一般。
# 也可把 LangChain 的 chain 包成工具 @tool("摘要链") def summarize(text: str) -> str: """用外部 chain 生成摘要(占位)。""" return f"摘要: {text[:20]}..." print(summarize("很长的一篇文档"))