2026/4/18 8:02:04
网站建设
项目流程
html官方网站,交易平台网站建设项目需求,怎么用editplus做网站,建设网站的实验报告各位同仁#xff0c;各位对人工智能充满热情的开发者们#xff0c;大家下午好#xff01;
今天#xff0c;我们齐聚一堂#xff0c;探讨一个当前热门且极具实践意义的话题#xff1a;如何高效构建基于大型语言模型#xff08;LLM#xff09;的智能应用。随着LLM能力的…各位同仁各位对人工智能充满热情的开发者们大家下午好今天我们齐聚一堂探讨一个当前热门且极具实践意义的话题如何高效构建基于大型语言模型LLM的智能应用。随着LLM能力的突飞猛进我们不再仅仅是调用API那么简单而是需要一套系统化的方法和工具来编排这些强大模型的能力使它们能够执行复杂任务与外部世界交互并最终服务于实际业务场景。在这个快速演进的领域中涌现出了一批优秀的应用开发框架。它们各有千秋设计哲学迥异。今天我将带领大家深入剖析其中最受关注的三位选手LangChain、Semantic Kernel和CrewAI。我们将从它们的设计哲学出发详细了解它们的核心概念、架构、代码实践并最终分析它们分别适用于何种业务复杂度帮助大家在实际项目中做出明智的技术选型。第一讲LLM应用开发浪潮下的框架需求在深入探讨具体框架之前我们首先需要理解为什么需要这些框架。直接调用OpenAI或Google Gemini的API难道不足以构建应用吗答案是对于简单的问答、文本生成等单次交互任务直接调用API确实足够。但当业务需求变得复杂时比如多步骤任务处理一个任务需要分解成多个子任务每个子任务可能需要不同的LLM调用或外部工具。上下文管理LLM需要记住之前的对话内容或相关信息以便进行连贯的交流。外部工具集成LLM需要与数据库、搜索引擎、API、文件系统等外部资源交互获取信息或执行操作。数据检索增强生成 (RAG)LLM需要从大量非结构化数据中检索相关信息并结合自身知识进行生成以提供更准确、最新的答案。代理Agent行为LLM需要具备规划、反思、执行工具的能力甚至能够自主决策下一步行动以解决开放式问题。多模态能力集成图像、音频等多种输入输出。协同工作多个LLM或LLM驱动的Agent需要相互协作共同完成一个复杂目标。面对这些挑战我们发现单纯的API调用不足以支撑。我们需要一种更高层次的抽象和编排能力能够将LLM、工具、记忆、数据源等组件有机地结合起来形成一个完整的智能系统。这就是LangChain、Semantic Kernel和CrewAI等框架应运而生的原因。它们旨在降低开发复杂性提高开发效率并赋能开发者构建更强大、更智能的LLM应用。第二讲LangChain – LLM应用的瑞士军刀首先登场的是目前社区最为活跃、生态最为丰富的LangChain。2.1 设计哲学模块化、可组合性、通用性LangChain 的核心设计哲学在于其模块化Modularity和可组合性Composability。它将构建 LLM 应用所需的各种组件抽象成独立的模块如 LLM 模型接口、提示词模板、链、代理、工具、记忆、文档加载器、向量存储等。开发者可以像乐高积木一样自由地选择、组合这些模块来构建各种各样的 LLM 应用。这种设计使得 LangChain 成为一个高度通用的框架能够应对从简单的文本生成到复杂的代理系统等各种场景。它的目标是提供一个构建任何 LLM 应用程序的全面工具集因此常被比喻为“LLM 应用开发的瑞士军刀”。2.2 核心概念与架构LangChain 的核心抽象包括模型 (Models)抽象了与各种 LLM 和嵌入模型交互的接口。LLMs文本完成模型如text-davinci-003。ChatModels基于消息的对话模型如gpt-3.5-turbo。Embeddings文本嵌入模型。提示词 (Prompts)管理和优化与 LLM 交互的提示词。PromptTemplates用于构建结构化提示词的模板。ChatPromptTemplates用于构建聊天模型消息序列的模板。链 (Chains)将多个 LLM 调用、工具使用或其他组件按顺序组合起来形成一个工作流。LLMChain最基本的链将 LLM 和 PromptTemplate 结合。SequentialChain按顺序执行多个链。RouterChain根据输入动态选择执行哪个链。代理 (Agents)赋予 LLM 决策和行动的能力。代理可以根据观察到的环境LLM 的输出来选择要使用的工具并执行下一步操作直到达到目标。Tools代理可以调用的外部函数或 API如搜索、计算器、自定义API。AgentExecutor驱动代理执行的运行时环境。记忆 (Memory)存储和检索 LLM 交互的上下文信息使对话具有连贯性。ConversationBufferMemory存储完整的对话历史。ConversationSummaryMemory存储对话摘要。ConversationBufferWindowMemory存储最近 N 轮对话。文档加载器 (Document Loaders)从各种数据源PDF、网页、数据库等加载文档。文本分割器 (Text Splitters)将大文本分割成小块以便进行嵌入和检索。向量存储 (Vector Stores)存储文档嵌入并支持高效的相似性搜索如 Chroma, Pinecone, FAISS。检索器 (Retrievers)从向量存储或其他数据源中检索相关文档。LangChain 的架构是一种高度解耦的微服务风格每个组件都可以独立开发、测试和替换。2.3 代码实践让我们通过几个代码示例来感受 LangChain 的强大和灵活性。示例 1一个简单的 LLMChain# 假设已经安装了langchain和openai库并设置了OPENAI_API_KEY环境变量 from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain # 1. 初始化模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0.7) # 2. 定义提示词模板 prompt_template PromptTemplate( input_variables[topic], template请为我写一个关于 {topic} 的简短而引人入胜的段落。 ) # 3. 创建LLMChain chain LLMChain(llmllm, promptprompt_template) # 4. 运行链 topic_to_write 人工智能在医疗健康领域的应用 response chain.invoke({topic: topic_to_write}) print(response[text])这个例子展示了如何将一个提示词模板和一个LLM组合成一个链然后运行它。示例 2使用代理和工具进行搜索from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_openai_functions_agent from langchain import hub from langchain_community.tools import WikipediaQueryRun from langchain_community.utilities import WikipediaAPIWrapper from langchain_core.messages import HumanMessage, AIMessage # 1. 初始化模型 llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 2. 定义工具 wikipedia WikipediaQueryRun(api_wrapperWikipediaAPIWrapper()) tools [wikipedia] # 3. 获取代理提示词 (使用LangChain Hub的预定义提示词) # LangChain Hub 是一个集中管理和共享提示词、链、工具等资源的平台 prompt hub.pull(hwchase17/openai-functions-agent) # 4. 创建代理 agent create_openai_functions_agent(llm, tools, prompt) # 5. 创建代理执行器 agent_executor AgentExecutor(agentagent, toolstools, verboseTrue) # 6. 运行代理 question 埃菲尔铁塔是谁设计的它有多高 response agent_executor.invoke({input: question}) print(response[output])在这个例子中我们创建了一个能够使用维基百科搜索工具的代理。代理会根据问题判断是否需要使用工具如果需要它会调用维基百科工具获取信息然后结合LLM的能力给出答案。verboseTrue会打印代理的思考过程。示例 3一个简化的 RAG (Retrieval Augmented Generation) 流程RAG 是一个非常常见的 LLM 应用模式用于从私有数据中检索信息并增强 LLM 的生成能力。from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_community.document_loaders import TextLoader from langchain.text_splitter import CharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA # 1. 准备文档数据 # 假设我们有一个名为 knowledge_base.txt 的文件 # knowledge_base.txt 内容示例: # LLM是一种大型语言模型通常指拥有数百亿到数千亿参数的深度学习模型。它们在大量文本数据上进行训练能够理解、生成人类语言。 # RAG技术通过结合检索和生成来提高LLM的准确性和时效性。它首先从外部知识库中检索相关文档然后将这些文档作为上下文输入给LLM进行回答。 # LangChain是一个用于开发LLM应用的框架提供了链、代理、工具等核心抽象。 # Semantic Kernel是微软推出的LLM应用开发框架强调与现有代码库的集成和插件化。 # 2. 加载文档 loader TextLoader(knowledge_base.txt) documents loader.load() # 3. 分割文本 text_splitter CharacterTextSplitter(chunk_size500, chunk_overlap0) texts text_splitter.split_documents(documents) # 4. 创建嵌入模型 embeddings OpenAIEmbeddings() # 5. 将文本块转换为向量并存储到向量数据库 # 这里使用Chroma作为本地向量存储 vectorstore Chroma.from_documents(texts, embeddings) # 6. 创建检索器 retriever vectorstore.as_retriever() # 7. 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # 8. 创建RAG链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # stuff 会将所有检索到的文档直接填充到提示词中 retrieverretriever ) # 9. 提问 query 什么是RAG技术它有什么优势 response qa_chain.invoke({query: query}) print(response[result])这个RAG示例展示了LangChain如何将文档加载、文本分割、嵌入、向量存储、检索以及LLM生成等多个步骤无缝衔接起来。2.4 适用业务复杂度LangChain 适用于低到高各种业务复杂度。低复杂度快速构建简单的问答机器人、文本摘要工具、内容生成器进行概念验证 (PoC)。中复杂度构建具有外部工具集成能力的聊天机器人、基于私有数据的RAG系统、自动化工作流。高复杂度开发复杂的自主代理系统、多步骤决策引擎、需要高度定制化和灵活性的应用。由于其极高的灵活性和庞大的生态系统LangChain 是许多开发者和研究人员的首选。它允许你从最简单的组件开始逐步构建和扩展你的应用。然而高度的灵活性也意味着你可能需要投入更多精力来设计和组织你的代码以避免在大型项目中陷入“意大利面条式”的复杂性。2.5 优势与劣势优势生态系统庞大且活跃拥有最多的集成、工具、文档和社区支持。极高的灵活性和可组合性可以自由组合各种组件满足多样化的需求。快速原型开发丰富的抽象和集成使得快速构建和迭代成为可能。支持多语言提供 Python 和 JavaScript/TypeScript 两个主要版本。劣势抽象层级有时过深对于初学者而言理解所有概念和如何组合它们可能需要一定时间。性能考量在复杂的链和代理中可能会因为多次 LLM 调用而产生性能瓶颈和高成本。非强制性的结构虽然提供了很多组件但如何组织它们很大程度上取决于开发者可能导致项目结构不统一。迭代速度快API 变动频繁有时需要适应更新。第三讲Semantic Kernel – 微软的智能编排器接下来我们转向由微软主导的Semantic Kernel (SK)。3.1 设计哲学企业级集成、插件化、自然语言即接口Semantic Kernel 的设计哲学与 LangChain 略有不同它更侧重于企业级集成和插件化Plugin-centric。SK 将 LLM 的能力视为一种“技能”或“插件”这些插件可以与传统的编程逻辑如 C# 或 Python 函数无缝结合。它的核心思想是让开发者能够将 AI 能力注入到现有的应用程序和工作流中将自然语言作为编程接口来调度这些技能。SK 强调将 AI 能力模块化为独立的、可重用的“技能”Skills/Plugins这些技能可以是语义的由 LLM 驱动也可以是原生的由传统代码实现。通过这种方式SK 旨在帮助企业在现有技术栈尤其是 .NET 生态系统上构建可靠、可扩展且易于维护的 AI 应用。3.2 核心概念与架构Semantic Kernel 的核心抽象包括内核 (Kernel)SK 的核心负责加载技能、管理内存、执行计划和与 LLM 进行交互。它是整个系统的编排中心。技能/插件 (Skills/Plugins)SK 中最核心的抽象代表了一个可执行的AI能力或传统代码功能。Semantic Functions/Skills由提示词和配置定义的通过 LLM 执行的函数例如总结、翻译。Native Functions/Skills由传统编程语言如 C# 或 Python实现的函数可以直接执行业务逻辑或调用外部 API。记忆 (Memory)用于存储和检索短期或长期信息支持语义搜索。VolatileMemoryStore内存中的临时存储。QdrantMemoryStore,AzureAISearchMemoryStore等持久化存储支持向量搜索。规划器 (Planners)赋予 LLM 规划复杂任务的能力。规划器能够分析用户请求并生成一个由一系列技能调用组成的执行计划。SequentialPlanner生成一个顺序执行的技能列表。StepwisePlanner在每一步执行后进行反思并决定下一步行动类似于 LangChain 的代理。上下文变量 (Context Variables)在技能之间传递数据和状态。连接器 (Connectors)用于连接不同的 LLM 和嵌入模型。SK 的架构设计使得 AI 能力能够被封装为独立的、可调用的单元无论是语义的还是原生的。这种设计非常适合将 AI 能力作为服务集成到大型企业应用中。3.3 代码实践让我们通过 Python 版本的 Semantic Kernel 示例来理解其工作方式。示例 1创建一个简单的语义函数 (Skill)# 假设已经安装了semantic-kernel和openai库并设置了OPENAI_API_KEY环境变量 import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding # 1. 初始化内核 kernel sk.Kernel() # 2. 配置AI服务 # 注意Semantic Kernel通常需要同时配置ChatCompletion和Embedding服务 kernel.add_service( OpenAIChatCompletion(service_idchat_completion, ai_model_idgpt-3.5-turbo), ) kernel.add_service( OpenAITextEmbedding(service_idtext_embedding, ai_model_idtext-embedding-ada-002), ) # 3. 定义一个语义函数Skill # 语义函数通常通过一个目录结构来组织每个文件夹代表一个Skill里面包含config.json和skprompt.txt # 假设我们有一个名为 WriterSkill 的文件夹其中包含 # WriterSkill/ # ├── config.json # └── skprompt.txt # config.json: # { # schema: 1, # type: completion, # description: 根据主题生成一个段落, # completion: { # max_tokens: 500, # temperature: 0.7, # top_p: 0.5 # }, # input: { # parameters: [ # { # name: input, # description: 主题, # type: string, # required: true # } # ] # } # } # skprompt.txt: # 请为我写一个关于 {{ $input }} 的简短而引人入胜的段落。 # 为了方便演示这里直接在代码中定义语义函数 prompt_template 请为我写一个关于 {{ $input }} 的简短而引人入胜的段落。 summarize_function kernel.create_function_from_prompt( prompt_templateprompt_template, function_nameGenerateParagraph, description根据主题生成一个段落, execution_settingskernel.get_service(chat_completion).get_prompt_execution_settings_class()( service_idchat_completion, max_tokens500, temperature0.7 ), ) # 4. 调用语义函数 topic 人工智能在教育领域的应用 result await kernel.invoke(summarize_function, sk_inputtopic) print(result.value) # 注意在实际项目中更常见的做法是从文件系统加载技能 # import os # skills_directory path/to/your/skills # 假设WriterSkill目录在此路径下 # writer_skill kernel.import_plugin_from_directory(skills_directory, WriterSkill) # result_from_file await kernel.invoke(writer_skill[GenerateParagraph], sk_inputtopic) # print(result_from_file.value)这个例子展示了如何定义一个语义函数通过提示词模板并通过kernel.invoke来调用它。Semantic Kernel 通过$input等上下文变量来传递参数。示例 2创建一个原生函数 (Native Skill) 并与语义函数结合import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding from semantic_kernel.functions import kernel_function # 新版本SK中推荐使用 kernel_function 装饰器 # 1. 初始化内核 (同上) kernel sk.Kernel() kernel.add_service( OpenAIChatCompletion(service_idchat_completion, ai_model_idgpt-3.5-turbo), ) kernel.add_service( OpenAITextEmbedding(service_idtext_embedding, ai_model_idtext-embedding-ada-002), ) # 2. 定义一个原生技能Python类中的方法 class MathPlugin: kernel_function( description将两个数字相加, nameAdd, parameters[ sk.FunctionParameter(nameinput, description第一个数字, typeint, requiredTrue), sk.FunctionParameter(namenumber2, description第二个数字, typeint, requiredTrue), ] ) def add(self, input: int, number2: int) - str: return str(input number2) kernel_function( description将两个数字相乘, nameMultiply, parameters[ sk.FunctionParameter(nameinput, description第一个数字, typeint, requiredTrue), sk.FunctionParameter(namenumber2, description第二个数字, typeint, requiredTrue), ] ) def multiply(self, input: int, number2: int) - str: return str(input * number2) # 3. 导入原生技能到内核 math_plugin kernel.import_plugin_from_object(MathPlugin(), plugin_nameMyMath) # 4. 定义一个语义函数它可能需要调用原生函数 # 假设有一个语义函数它会分析一个数学问题并决定使用哪个原生函数 # 为了简化我们直接调用原生函数 async def run_native_skill_example(): # 调用原生加法函数 add_result await kernel.invoke(math_plugin[Add], input5, number23) print(f5 3 {add_result.value}) # 调用原生乘法函数 multiply_result await kernel.invoke(math_plugin[Multiply], input4, number26) print(f4 * 6 {multiply_result.value}) # 运行异步函数 import asyncio asyncio.run(run_native_skill_example())这个例子展示了如何将传统的Python函数封装为原生技能并导入到内核中。这意味着LLM可以通过语义请求来调度这些原生代码实现更复杂的逻辑。SK的Planner就是用来在更高层面编排这些语义和原生技能的。示例 3规划器 (Planner) 的概念性使用 (简化)SK 的 Planner 是其强大功能之一它允许 LLM 根据用户目标生成一个执行计划这个计划由一系列技能调用组成。import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAITextEmbedding from semantic_kernel.planners import SequentialPlanner # 或者 StepwisePlanner # 1. 初始化内核 (同上) kernel sk.Kernel() kernel.add_service( OpenAIChatCompletion(service_idchat_completion, ai_model_idgpt-3.5-turbo), ) kernel.add_service( OpenAITextEmbedding(service_idtext_embedding, ai_model_idtext-embedding-ada-002), ) # 2. 导入一些技能可以是语义的也可以是原生的 # 假设我们有 MathPlugin 和 WriterSkill (如前面定义的) class MathPlugin: kernel_function(description将两个数字相加, nameAdd) def add(self, input: int, number2: int) - str: return str(input number2) kernel_function(description将两个数字相乘, nameMultiply) def multiply(self, input: int, number2: int) - str: return str(input * number2) math_plugin kernel.import_plugin_from_object(MathPlugin(), plugin_nameMyMath) # 定义一个简单的语义技能 summarize_prompt 请总结以下文本{{ $input }} summarize_function kernel.create_function_from_prompt( prompt_templatesummarize_prompt, function_nameSummarizeText, description总结文本内容, execution_settingskernel.get_service(chat_completion).get_prompt_execution_settings_class()( service_idchat_completion, max_tokens100 ), ) async def run_planner_example(): # 3. 创建一个规划器 planner SequentialPlanner(kernelkernel, service_idchat_completion) # 4. 定义一个复杂的目标 goal 首先计算 10 乘以 5然后将结果加上 20最后总结一段关于这个计算过程的话。 # 5. 生成计划 print(f用户目标: {goal}) plan await planner.create_plan(goalgoal) print(f生成的计划:n{plan.as_xml()}) # 计划通常以XML形式呈现 # 6. 执行计划 print(n执行计划:) result await kernel.invoke(plan) print(f最终结果: {result.value}) asyncio.run(run_planner_example())在这个规划器示例中LLM通过SequentialPlanner会分析用户目标并根据可用的技能MyMath.Multiply,MyMath.Add,SummarizeText自动生成一个多步骤的执行计划。这个计划随后可以由内核执行实现了复杂任务的自动化。3.4 适用业务复杂度Semantic Kernel 适用于中到高的业务复杂度尤其是在以下场景中表现突出企业级应用集成将 AI 能力无缝集成到现有的企业级应用、微服务、工作流中特别是在 .NET 生态系统中。内部工具和自动化构建用于企业内部的智能助手、自动化报告生成、数据分析工具等。需要强类型安全和可维护性C# 版本的 SK 提供了强大的类型检查和面向对象编程的优势适合构建大型、长期维护的系统。需要明确规划和控制流程Planner 功能使其非常适合需要多步骤决策和执行的复杂业务流程。SK 的设计理念使其在对稳定性、可维护性和与现有系统集成度要求较高的企业环境中更具吸引力。3.5 优势与劣势优势企业级集成能力强特别是在 .NET 环境下与现有代码库的集成非常自然。插件化/技能驱动清晰的模块化易于管理和复用 AI 和原生功能。规划器 (Planner)强大的多步骤任务编排能力能够自主生成和执行复杂计划。强类型支持 (C#)为大型项目提供了更好的代码质量和可维护性。微软生态系统支持与 Azure AI 服务、Microsoft 365 等有良好的集成潜力。劣势Python 生态相对较小虽然 Python 版本正在快速发展但与 LangChain 相比其社区和第三方集成仍有差距。学习曲线对于不熟悉微软生态和其特定抽象的开发者来说可能需要一些时间适应。灵活性略低于 LangChain其更强的结构化和意见性设计在某些极端定制场景下可能不如 LangChain 灵活。相对较重对于非常简单的 PoC 或研究项目可能感觉有点“大材小用”。第四讲CrewAI – 多智能体系统的协作专家最后我们来了解一下相对较新但发展迅猛的CrewAI。4.1 设计哲学智能体协同、角色分工、自主解决问题CrewAI 的核心设计哲学是构建多智能体系统Multi-Agent Systems。它认为许多复杂的问题本质上都需要多个“专家”或“角色”协同工作才能解决。CrewAI 将 LLM 封装成具有明确角色Role、目标Goal和背景故事Backstory的智能体Agent这些智能体通过明确定义的任务Task和流程Process进行协作最终完成一个共同的目标。它旨在模拟人类团队的工作模式让每个智能体专注于其专业领域通过信息共享和迭代反馈共同解决复杂问题。CrewAI 强调通过智能体之间的互动和协作来产生涌现智能Emergent Intelligence。4.2 核心概念与架构CrewAI 的核心抽象包括智能体 (Agent)CrewAI 的基本构建块。每个 Agent 都具有Role定义其在团队中的职责如“研究员”、“内容创作者”。Goal该 Agent 的高级目标。BackstoryAgent 的背景和专业知识帮助其更好地理解角色。ToolsAgent 可以使用的工具可以集成 LangChain 的工具。Allow Delegation是否可以将任务委托给其他 Agent。Verbose是否打印详细思考过程。任务 (Task)一个明确定义的工作单元包含Description任务的具体内容和要求。Expected Output任务完成后的预期结果格式和内容。Agent负责执行该任务的 Agent。tools任务可能需要使用的特定工具。团队 (Crew)将多个 Agent 和 Task 组织起来进行协作的容器。Agents团队中的所有 Agent。Tasks团队需要完成的所有任务。Process定义 Agent 之间如何协作的流程。Process.SequentialAgent 依次执行任务一个任务完成后其输出作为下一个任务的输入。Process.Hierarchical引入一个“经理”Agent负责分解高级目标并将子任务委托给其他 Agent并监控进展。工具 (Tools)CrewAI 可以直接使用 LangChain 的工具抽象也可以定义自己的工具。CrewAI 的架构围绕着“团队协作”的概念展开。它提供了一种声明式的方式来定义智能体的角色和任务然后由 Crew 来编排它们的执行和互动。4.3 代码实践让我们通过一个具体的例子来了解 CrewAI 如何构建多智能体系统。示例一个自动化内容创作团队假设我们要创建一个智能体团队它能够研究一个给定主题。根据研究结果撰写一篇草稿。审查并优化草稿。# 假设已经安装了crewai, langchain-openai, duckduckgo-search # 并设置了OPENAI_API_KEY环境变量 from crewai import Agent, Task, Crew, Process from langchain_openai import ChatOpenAI from langchain_community.tools import DuckDuckGoSearchRun # 用于搜索工具 # 1. 初始化 LLM # 所有的Agent都会使用这个LLM llm ChatOpenAI(modelgpt-4-turbo, temperature0.7) # GPT-4更适合复杂推理 # 2. 定义工具 search_tool DuckDuckGoSearchRun() tools [search_tool] # 3. 定义智能体 (Agents) researcher Agent( role高级研究员, goal深入研究给定主题提供全面准确的信息, backstory你是一位经验丰富的研究专家擅长从各种来源获取信息并进行批判性分析。你确保所有信息都经过验证并与主题高度相关。, verboseTrue, # 打印Agent的思考过程 allow_delegationFalse, # 研究员不委托任务 toolstools, # 研究员需要搜索工具 llmllm ) writer Agent( role专业内容创作者, goal根据研究结果撰写引人入胜、结构良好且富有洞察力的文章草稿, backstory你是一位才华横溢的内容创作者能够将复杂的信息转化为清晰、简洁、引人注目的文字。你专注于文章的流畅性、逻辑性和吸引力。, verboseTrue, allow_delegationTrue, # 创作者可能需要委托研究任务 llmllm ) reviewer Agent( role质量控制编辑, goal审查和优化文章草稿确保其语法正确、信息准确、风格一致并符合预期输出标准, backstory你是一位一丝不苟的编辑拥有卓越的语法和拼写技能以及对细节的敏锐洞察力。你确保最终的文章是完美的。, verboseTrue, allow_delegationFalse, llmllm ) # 4. 定义任务 (Tasks) research_task Task( description( 研究关于 人工智能在可持续发展中的作用 的最新进展和应用。 重点关注能源效率、气候建模和资源管理方面。 提供至少三个关键应用案例及其影响。 ), expected_output一份详尽的研究报告包含关键发现、数据和引用来源。, agentresearcher, toolstools ) writing_task Task( description( 根据研究员提供的报告撰写一篇关于 人工智能在可持续发展中的作用 的文章草稿。 文章应包含引言、三个核心应用案例基于研究报告、讨论和结论。 保持专业、信息丰富且引人入胜的风格。 ), expected_output一篇约800-1000字的完整文章草稿。, agentwriter ) review_task Task( description( 审查并编辑文章草稿检查语法、拼写、标点符号、信息准确性和整体流畅性。 确保文章符合专业标准并有效地传达了 人工智能在可持续发展中的作用 的主题。 提供修订后的最终版本。 ), expected_output一份经过彻底审查和修订的最终文章。, agentreviewer ) # 5. 创建团队 (Crew) content_crew Crew( agents[researcher, writer, reviewer], tasks[research_task, writing_task, review_task], processProcess.sequential, # 任务按顺序执行 verboseTrue, # 打印团队的执行过程 manager_llmllm # 在Process.hierarchical模式下可以指定一个LLM作为经理 ) # 6. 运行团队 print(--- 团队开始工作 ---) result content_crew.kickoff() print(n--- 团队工作完成 ---) print(n最终文章:) print(result)在这个例子中我们定义了三个具有不同职责的智能体研究员、创作者和审阅者。它们各自拥有特定的目标和背景并被分配了相应的任务。Process.sequential确保任务按定义好的顺序执行前一个任务的输出会作为后一个任务的输入。整个过程高度自动化模拟了一个小型的专业团队。4.4 适用业务复杂度CrewAI 适用于中到高的业务复杂度特别擅长处理那些需要多步骤、多角度协作的问题例如市场分析、产品设计、复杂报告生成、研究项目等。可以自然分解为专家任务的问题当一个大问题可以被拆解为由不同专业领域的人来解决的子问题时。需要迭代和反馈循环的任务智能体之间可以通过互相审查和改进来提升最终结果的质量。需要自动化复杂决策和工作流的场景例如自动化客户支持流程理解问题-查询知识库-生成答案-发送邮件。CrewAI 提供了一种高度抽象和直观的方式来构建复杂的智能体系统特别适合那些希望通过模拟人类团队协作来解决问题的场景。4.5 优势与劣势优势强大的多智能体协作能力通过角色、目标、任务和流程有效编排多个 LLM 驱动的智能体。直观的抽象Agent、Task、Crew 的概念与人类团队协作非常相似易于理解和设计。涌现智能通过智能体之间的互动和迭代可以解决单一直智能体难以解决的复杂问题。模块化和可重用性Agent 和 Task 可以被模块化定义并在不同 Crew 中重用。与 LangChain 工具生态兼容可以直接使用 LangChain 的工具。劣势资源消耗较高由于涉及多个 LLM 调用和智能体之间的多次交互通常会产生更高的 API 成本和执行时间。调试复杂当智能体数量增多或任务流程复杂时调试智能体之间的交互和理解其决策过程可能具有挑战性。不适用于简单任务对于简单的问答或单次生成任务CrewAI 的开销过大。相对较新社区和生态系统仍在快速发展中可能不如 LangChain 稳定和成熟。第五讲对比分析 – 设计哲学与业务适用性现在我们对 LangChain、Semantic Kernel 和 CrewAI 有了深入的了解。让我们通过一个表格来总结它们的关键差异和适用场景。特征/方面LangChainSemantic KernelCrewAI设计哲学模块化、可组合性、通用性、快速原型企业级集成、插件化、自然语言即接口、规划多智能体协作、角色分工、自主解决问题、涌现智能核心抽象Chains, Agents, Tools, Memory, Loaders, StoresKernel, Skills (Semantic/Native), Planners, Memory, ContextAgents, Tasks, Crews, Process, Tools主要目标构建通用 LLM 应用的全能工具包将 AI 能力注入现有应用特别是企业级系统构建模拟人类团队协作的多智能体系统编排方式链式Chains代理决策Agents内核调度技能规划器生成执行计划团队Crew编排任务智能体间协作和委托主要优势极度灵活生态庞大集成多快速开发企业级集成.NET友好强规划能力可维护性好解决复杂问题模拟团队协作促进涌现智能主要劣势可能有样板代码复杂性高时管理难性能考量Python生态相对小学习曲线有时显得“重”资源消耗大调试复杂不适合简单任务适用语言Python, JavaScript/TypeScriptC#, PythonPython业务复杂度低到高 (通用性强)中到高 (企业级、集成型)中到高 (复杂协作、多步骤决策)典型场景RAG应用通用聊天机器人数据提取研究原型智能客服集成内部知识管理自动化业务流程自动化内容创作市场分析研究报告生成项目管理核心驱动组件组合与流程定义技能封装与智能调度角色定义与任务委派业务复杂度的深入讨论低复杂度业务 (例如简单的问答、文本摘要、单次内容生成)LangChain可以胜任但可能感觉有点“重”因为它提供了太多抽象。直接使用其基础组件即可。Semantic Kernel对于简单的任务其企业级架构可能显得过于复杂。CrewAI绝对是“杀鸡用牛刀”多智能体系统的开销远超任务需求。中复杂度业务 (例如基于私有知识库的RAG聊天机器人、简单的数据提取与处理、自动化邮件回复)LangChain非常适合。其RAG链和代理工具集成可以高效解决这类问题。开发者可以灵活选择组件。Semantic Kernel如果需要将AI能力集成到现有企业应用中或需要更结构化的技能管理SK是优秀的选择。Planner可以处理多步骤流程。CrewAI如果任务可以通过几个明确的角色分工来完成CrewAI 可以提供一种优雅的解决方案。例如一个Agent负责数据提取另一个Agent负责格式化。高复杂度业务 (例如自主研究代理、多阶段复杂决策系统、自动化市场分析与报告生成、高级项目管理)LangChain可以实现但需要开发者进行大量手动编排和代理逻辑设计。在没有强约束的情况下代码可能变得难以维护。Semantic Kernel其Planner和插件化能力在此类场景中大放异彩。特别是在需要将AI与复杂业务逻辑和企业级服务深度集成时SK的优势明显。CrewAI这是 CrewAI 的主战场。通过定义多个Agent赋予它们不同的角色和任务CrewAI能够以非常直观和强大的方式解决这类需要多方协作、迭代和决策的复杂问题。它通过智能体间的涌现行为提供独特的解决方案。第六讲选择您的利器在选择 LangChain、Semantic Kernel 或 CrewAI 时没有一刀切的最佳答案。最重要的是要理解您的项目需求、团队技能栈以及预期的业务复杂度。如果您追求极致的灵活性希望快速原型开发且您的团队更偏向 Python/JS 生态并且不介意在必要时手动管理一些复杂性那么 LangChain 是您的首选。它是构建各种 LLM 应用的通用工具箱拥有最广泛的社区支持和集成。如果您在企业环境中工作特别是 .NET 生态系统需要将 AI 能力深度集成到现有业务逻辑中重视可维护性、稳定性并希望通过规划器实现复杂工作流的自动化那么 Semantic Kernel 是一个非常强大的选择。它将 AI 视为可组合的服务与传统编程范式融合。如果您的业务问题天然地适合通过“团队协作”来解决需要多个“专家”角色协同工作进行迭代、反馈和决策以处理高度复杂的任务那么 CrewAI 将是您的强力助手。它提供了一种直观而强大的方式来构建多智能体系统实现高级自动化和涌现智能。在实际项目中您甚至可以考虑将这些框架的部分思想或组件结合起来。例如CrewAI 就可以利用 LangChain 的工具。理解它们各自的核心优势将帮助您为项目选择最合适的“利器”从而高效、高质量地交付您的智能应用。LLM 应用开发领域正处于一个激动人心的时代。这些框架的出现极大地降低了我们构建复杂智能系统的门槛。深入理解它们的设计哲学掌握其核心能力将使我们能够更好地驾驭这一波技术浪潮为我们的业务和用户创造更大的价值。感谢大家