我們來深入探索這些強大的大型語言模型(LLM)應用開發框架,并且我會嘗試用文本形式描述一些核心的流程圖,幫助您更好地理解它們的工作機制。由于我無法直接生成圖片,我會用文字清晰地描述流程圖的各個步驟和連接。
LangChain 🦜🔗:LLM 應用的全能瑞士軍刀與編排大師
LangChain 是一個功能極其豐富的開源框架,旨在簡化和標準化 LLM 應用的開發。它通過模塊化的組件和“鏈”(Chains)的概念,讓開發者能夠像搭積木一樣構建從簡單到復雜的各類 LLM 應用,尤其在 RAG (檢索增強生成) 和自主代理 (Agents) 方面表現突出。
-
核心理念:將 LLM 應用的各個環節(如模型調用、數據連接、任務編排、記憶管理)抽象為可復用的組件,并通過“鏈”將它們串聯起來,實現靈活且強大的工作流。
-
關鍵特性詳解:
- LLM 封裝 (LLM Wrappers):提供統一接口調用不同的 LLM,如 OpenAI 的
gpt-4
、gpt-3.5-turbo
,Hugging Face Hub 上的開源模型(如 Llama, Mistral),以及 Azure OpenAI Service 等。這使得底層模型的切換成本大大降低。 - 鏈 (Chains):這是 LangChain 的靈魂。鏈定義了一系列操作的執行順序。
- LLMChain:最基礎的鏈,包含一個提示模板 (PromptTemplate)、一個 LLM 和一個可選的輸出解析器 (OutputParser)。
- 順序鏈 (Sequential Chains):如
SimpleSequentialChain
(單輸入單輸出)和SequentialChain
(多輸入多輸出),可以將多個鏈或原子操作按順序連接。 - 路由鏈 (Router Chains):能根據輸入動態地選擇執行哪一個子鏈,實現更復雜的邏輯分支。
- 文檔處理鏈 (Chains for Document Interaction):如
load_summarize_chain
(加載文檔并總結),load_qa_chain
(加載文檔并進行問答)。
- 索引與檢索器 (Indexes and Retrievers) - RAG 的核心:
- 文檔加載器 (Document Loaders):支持超過80種數據源,從 PDF、TXT、CSV、JSON、HTML 到 Notion、Google Drive、Slack、Databases (SQL, NoSQL) 等。
- 文本分割器 (Text Splitters):將長文檔分割成適合 LLM 處理的語義相關的小塊 (chunks)。例如
RecursiveCharacterTextSplitter
(遞歸按字符分割,嘗試保留段落完整性)、TokenTextSplitter
(按 Token 數量分割)。 - 向量化 (Embeddings):將文本塊轉換為高維向量,捕捉其語義信息。支持 OpenAI, Hugging Face, Cohere 等多種嵌入模型。
- 向量存儲 (Vector Stores):將文本塊及其向量存儲起來,以便進行高效的相似性搜索。集成了 FAISS, Chroma, Pinecone, Weaviate, Milvus, Elasticsearch 等25種以上的向量數據庫/搜索引擎。
- 檢索器 (Retrievers):根據用戶查詢(也轉換為向量)從向量存儲中檢索最相關的文本塊。除了基本的相似性搜索,還支持 MMR (Maximal Marginal Relevance) 減少結果冗余,以及元數據過濾等。
- 代理 (Agents):賦予 LLM “思考-行動”的能力。Agent 內部有一個 LLM 作為決策核心,可以訪問一系列工具 (Tools) 來完成用戶指定的任務。
- 工具 (Tools):可以是簡單的函數(如計算器、日期獲取),也可以是調用外部 API(如 Google 搜索、天氣查詢、維基百科),甚至可以是其他的鏈。
- Agent 執行器 (AgentExecutor):負責運行 Agent 的主循環,包括讓 LLM 思考、選擇工具、執行工具、觀察結果,并循環此過程直到任務完成。
- Agent 類型:如
zero-shot-react-description
(基于 ReAct 范式,根據工具描述讓 LLM 自行決定使用哪個工具),self-ask-with-search
(模擬人類先自問問題再通過搜索找答案的過程)。
- 記憶 (Memory):為鏈和 Agent 提供短期或長期的記憶能力,使對話能夠保持上下文連貫。
- 類型:
ConversationBufferMemory
(存儲完整對話歷史),ConversationBufferWindowMemory
(僅存儲最近 K 輪對話),ConversationSummaryMemory
(對歷史對話進行摘要),VectorStoreRetrieverMemory
(將對話歷史存入向量數據庫,根據當前輸入檢索相關歷史片段)。
- 類型:
- 回調 (Callbacks):允許開發者在鏈或 Agent 執行的各個階段(如開始、結束、出錯、接收到 LLM 輸出等)注入自定義邏輯,用于日志記錄、監控、流式輸出、調試等。
- LLM 封裝 (LLM Wrappers):提供統一接口調用不同的 LLM,如 OpenAI 的
-
RAG 流程示意圖 (文本描述):
-
Agent 執行流程示意圖 (文本描述):
-
應用場景:
- 高級 RAG 系統:構建能理解復雜文檔、回答專業問題的客服機器人或研究助手。
- 個性化聊天機器人:利用記憶模塊記住用戶偏好,提供更貼心的對話體驗。
- 自主任務執行代理:如自動化預訂、信息搜集與整理、代碼生成與解釋。
- 數據分析與報告生成:連接數據庫或 API,自動提取數據、進行分析并生成結構化報告。
Haystack 🌻 (由 deepset AI 開發):生產級語義搜索與問答專家
Haystack 是一個專注于構建端到端、可擴展、生產就緒的語義搜索和問答系統的開源框架。它強調信息檢索流程的健壯性和評估能力。
-
核心理念:通過模塊化的“管道”(Pipelines)將文檔處理、嵌入、檢索、閱讀/生成等步驟清晰地組織起來,構建高性能的神經搜索系統,并提供評估工具以確保系統質量。
-
關鍵特性詳解:
- 管道 (Pipelines):Haystack 的核心工作流機制。開發者通過 YAML 文件或 Python 代碼定義管道,將不同的組件(節點)連接起來。
- 文檔存儲 (DocumentStores):用于存儲文本數據及其元數據和向量表示。支持多種后端,如 Elasticsearch, OpenSearch, FAISS, Milvus, Pinecone, Weaviate 等。Haystack 提供了統一的接口來管理這些存儲。
- 文件轉換器 (FileConverters):將不同格式的文件(PDF, DOCX, TXT, Markdown 等)轉換為 Haystack
Document
對象。 - 預處理器 (Preprocessors):對
Document
對象進行清洗(如移除多余空格、特殊字符)和分割(按句子、單詞或固定長度分割成更小的文檔單元)。 - 嵌入器 (Embedders) / 檢索器 (Retrievers):
- 稠密檢索器 (Dense Retrievers):如
EmbeddingRetriever
,使用句子Transformer等模型將文檔和查詢轉換為向量,然后進行相似度搜索。 - 稀疏檢索器 (Sparse Retrievers):如
BM25Retriever
(基于 Elasticsearch 或 OpenSearch),使用傳統的詞頻統計方法(如 BM25)進行檢索。 - 混合檢索:可以結合稠密和稀疏檢索器的結果。
- 稠密檢索器 (Dense Retrievers):如
- 閱讀器 (Readers):通常是基于 Transformer 的抽取式問答模型(如 RoBERTa, MiniLM 的微調版本),它們從檢索器返回的文檔中直接抽取答案片段。
- 生成器 (Generators):使用 LLM(如 GPT, T5)基于檢索到的上下文生成更流暢、更全面的答案。
PromptNode
是 Haystack 中用于與 LLM 交互的核心組件,可以配置不同的提示模板和模型。 - 排序器 (Rankers):對檢索器或閱讀器返回的結果進行重新排序,以提升最終答案的相關性。
- 評估 (Evaluation):Haystack 提供了專門的評估流程,可以評估檢索階段的指標(如 Recall@K, MAP)和問答階段的指標(如 Exact Match, F1-score, SAS - Semantic Answer Similarity)。
- REST API 與 UI:可以方便地將構建的 Haystack 管道通過 REST API 暴露出來,并且提供了一個簡單的 Streamlit UI 用于演示和測試。
-
Haystack 索引管道示意圖 (文本描述):
-
Haystack 查詢管道示意圖 (文本描述):
-
應用場景:
- 企業級語義搜索引擎:為公司內部知識庫、產品文檔、法律合同等提供智能搜索。
- 智能客服問答系統:準確理解用戶問題并從 FAQ 或知識庫中找到或生成答案。
- 文檔分析與洞察提取:從大量報告或文獻中快速定位關鍵信息。
- 金融、法律等行業的合規性檢查與信息檢索。
AutoGen 🤖💬 (由 Microsoft 開發):賦能多智能體協作與自動化
AutoGen 是一個用于構建和管理多個能夠相互對話、協作完成任務的 LLM 代理的框架。它強調通過對話來實現復雜工作流的自動化,并支持人類在環的監督與干預。
-
核心理念:將復雜任務分解給多個具有不同角色和能力的 AI 代理,這些代理通過對話進行協作,共同達成目標。人類可以作為參與者或監督者加入對話。
-
關鍵特性詳解:
- 可對話代理 (Conversable Agents):AutoGen 的核心。每個代理都可以配置其 LLM(或不使用)、系統消息(定義其身份和行為準則)、工具(函數調用)。
UserProxyAgent
:代表人類用戶,可以發起對話,也可以配置為執行代碼(如 Python 腳本,通過code_execution_config
設置)或調用函數。AssistantAgent
:由 LLM 驅動的助手代理,根據對話歷史和指令生成回復或決定調用哪個函數。GroupChatManager
:用于協調多個代理在群聊中的發言順序和流程。
- 多代理對話:代理之間通過發送和接收消息進行通信。開發者可以設計不同的對話模式:
- 兩代理對話:例如,一個
UserProxyAgent
和一個AssistantAgent
相互對話。 - 群聊 (Group Chat):多個代理(包括
UserProxyAgent
)在一個群組內討論,由GroupChatManager
控制流程。 - ** ?????對話 (Sequential Chats)**:任務在一個代理序列中傳遞。
- 兩代理對話:例如,一個
- 函數調用 (Function Calling) / 工具使用:代理可以調用預定義的 Python 函數。這與 OpenAI 的函數調用功能緊密集成,使得 LLM 可以請求執行特定的代碼邏輯,從而與外部環境交互或執行復雜計算。
- 代碼執行:
UserProxyAgent
可以配置為在本地或 Docker 容器中執行 LLM 生成的代碼塊(如 Python, Shell 腳本),并將結果返回給對話。這對于編程、數據分析等任務非常強大。 - 人在回路 (Human-in-the-loop):人類用戶可以隨時介入對話,提供反饋、修正方向、批準代碼執行或手動執行某些步驟。這對于確保任務的正確性和安全性至關重要。
- 可定制性:可以自定義代理的行為,例如它們如何回復、何時請求人類輸入、何時終止對話等。
- 可對話代理 (Conversable Agents):AutoGen 的核心。每個代理都可以配置其 LLM(或不使用)、系統消息(定義其身份和行為準則)、工具(函數調用)。
-
AutoGen 基礎雙代理對話流程示意圖 (文本描述):
-
AutoGen 群聊流程示意圖 (簡化) (文本描述):
-
應用場景:
- 自動化復雜任務:如“讓一個代理寫代碼,另一個測試,第三個寫文檔”,或者“一個代理負責搜集最新新聞,另一個總結,第三個寫評論”。
- 代碼生成、調試與優化:代理可以協作編寫、運行和改進代碼。
- 研究與內容創作:多個代理分工合作,進行文獻回顧、數據分析、報告撰寫。
- 模擬與決策支持:模擬不同角色(如CEO, CFO, CTO)在特定場景下的決策過程。
- 交互式學習與輔導:代理扮演老師、學生、提問者等角色。
Semantic Kernel 🧠💡 (由 Microsoft 開發):輕量級 AI 服務編排 SDK
Semantic Kernel (SK) 是一個輕量級的開源 SDK,旨在將 LLM 和其他 AI 服務(如嵌入模型)的能力無縫集成到傳統的應用程序中。它提供了一種將自然語言處理能力與現有代碼庫(C#, Python, Java)結合的優雅方式。
-
核心理念:通過一個“內核”(Kernel)對象來編排“技能”(Skills),其中技能可以包含“語義函數”(由自然語言提示驅動)和“原生函數”(用傳統代碼編寫),從而實現 AI 與業務邏輯的深度融合。
-
關鍵特性詳解:
- 內核 (Kernel):SK 的中心協調器。它加載技能、管理記憶、連接AI服務,并執行用戶請求。
- 技能 (Skills):組織功能的單元,可以包含一個或多個函數。技能可以來自文件系統、代碼定義或插件。
- 語義函數 (Semantic Functions):核心是帶有模板的提示詞(Prompt Templates)。這些模板定義了如何與 LLM 交互以完成特定任務(如總結、翻譯、情感分析、代碼生成等)。SK 的提示模板語言支持變量、內置函數和復雜的邏輯。函數定義通常包含
skprompt.txt
(提示模板) 和config.json
(配置,如LLM參數)。 - 原生函數 (Native Functions):用 C#, Python 或 Java 編寫的普通代碼函數,可以通過裝飾器(如 Python 中的
@sk_function
)暴露給 Kernel。這些函數可以訪問本地資源、調用外部 API、執行復雜計算等,彌補了 LLM 在某些方面的不足。
- 語義函數 (Semantic Functions):核心是帶有模板的提示詞(Prompt Templates)。這些模板定義了如何與 LLM 交互以完成特定任務(如總結、翻譯、情感分析、代碼生成等)。SK 的提示模板語言支持變量、內置函數和復雜的邏輯。函數定義通常包含
- 記憶 (Memories):為 LLM 提供上下文信息和長期知識。SK 的記憶連接器支持多種向量數據庫(如 Azure Cognitive Search, Qdrant, Chroma, Weaviate, Pinecone),用于存儲和檢索文本嵌入,實現 RAG 功能。
- 連接器 (Connectors):用于 Kernel 與外部服務(主要是 LLM 和記憶存儲)的連接。支持 OpenAI, Azure OpenAI, Hugging Face 等 LLM 服務。
- 規劃器 (Planners):SK 的一個高級特性,能夠根據用戶的高層目標和 Kernel 中可用的技能,自動生成一個多步驟的執行計劃(Plan)。規劃器會分析用戶意圖,并嘗試找到一系列技能調用的組合來達成該意圖。
- 例如,用戶請求“給我查一下明天北京的天氣,然后根據天氣寫一首關于春天的短詩”,Planner 可能會生成一個計劃:1.調用一個
WeatherSkill
的GetTomorrowWeather
函數獲取天氣;2.調用一個WritingSkill
的WritePoem
函數,并將天氣信息作為輸入。
- 例如,用戶請求“給我查一下明天北京的天氣,然后根據天氣寫一首關于春天的短詩”,Planner 可能會生成一個計劃:1.調用一個
- 跨語言支持:目前主要支持 C#, Python 和 Java,并致力于提供一致的開發體驗。
-
Semantic Kernel 技能調用流程示意圖 (文本描述):
-
Semantic Kernel 規劃器流程示意圖 (文本描述):
-
應用場景:
- 為現有企業應用賦能:在 CRM、ERP 或 Office 插件中嵌入智能助手 (Copilot) 功能。
- 構建智能業務流程自動化:將需要人類判斷和自然語言理解的環節交由 LLM 處理,其他環節由傳統代碼執行。
- 創建可重用的 AI 插件 (Skills):將特定領域的 AI 能力封裝成技能,供不同應用調用。
- 將自然語言作為應用程序的新接口:允許用戶通過自然語言與復雜系統交互。
LlamaIndex 🦙📄:LLM 的專業級數據框架與 RAG 利器
LlamaIndex 是一個專注于將 LLM 與外部數據源連接的數據框架,是構建高效、強大的 RAG 應用的核心工具。它提供了從數據攝取、索引構建到查詢執行的完整解決方案。
-
核心理念:為 LLM 提供一個簡單、靈活且優化的方式來訪問和利用私有或領域特定的數據,從而增強 LLM 的知識范圍和回答相關性。
-
關鍵特性詳解:
- 數據連接器/讀取器 (Data Connectors / Readers):極其強大的數據攝取能力,支持超過150種數據源。
- 文件類:PDF, DOCX, TXT, Markdown, CSV, Excel, PowerPoint, Images (OCR), Audio (transcription)。
- SaaS 應用:Notion, Slack, Salesforce, Google Drive, OneDrive, Asana, Trello, Jira, GitHub, Discord。
- 數據庫:PostgreSQL, MySQL, MongoDB, Snowflake, SQL Server, Elasticsearch。
- APIs:可以自定義連接器調用任意 API。
- 節點 (Nodes):文檔被加載和解析后,會轉換成
Node
對象。一個Node
代表一個文本塊 (chunk),并包含文本內容、元數據 (metadata)、以及與其他節點的關系 (relationships)。 - 索引結構 (Index Structures):LlamaIndex 提供了多種索引類型來組織
Node
,以適應不同的查詢需求。VectorStoreIndex
:最常用的索引,將Node
的文本嵌入存儲在向量數據庫中,通過語義相似度進行檢索。與 FAISS, Pinecone, Weaviate, Chroma, Qdrant 等深度集成。ListIndex
:按順序存儲Node
,適合順序問答或對所有內容進行總結。TreeIndex
:將Node
組織成層級樹狀結構(通常是摘要樹),父節點是子節點的摘要。查詢時可以自頂向下或自底向上遍歷。KeywordTableIndex
:從Node
中提取關鍵詞,構建關鍵詞到Node
的映射,支持基于關鍵詞的檢索。KnowledgeGraphIndex
:從文本中提取實體和關系,構建知識圖譜索引,支持結構化查詢和推理。- 組合索引 (Composable Indexes):可以將不同類型的索引組合起來,例如先用關鍵詞索引粗篩,再用向量索引精排。
- 檢索器 (Retrievers):從索引中檢索與查詢相關的
Node
。LlamaIndex 提供了多種配置選項,如similarity_top_k
(返回最相似的k個節點)、元數據過濾等。 - 節點后處理器 (Node Postprocessors):在檢索到
Node
之后,但在傳遞給 LLM 合成答案之前,對Node
列表進行進一步處理,如重新排序、過濾低分節點、關鍵詞高亮等。 - 響應合成器 (Response Synthesizers):獲取檢索到的
Node
列表和原始查詢,然后使用 LLM 來生成最終的自然語言答案。提供了多種合成策略:refine
:逐個處理檢索到的文本塊,迭代地優化答案。compact
:將盡可能多的文本塊塞進 LLM 的上下文窗口進行一次性回答。tree_summarize
:層級式總結,先總結小塊,再總結小塊的總結,適合大量文本。
- 查詢引擎 (Query Engines):封裝了從查詢到生成答案的整個流程(檢索 -> 后處理 -> 合成)。
- 聊天引擎 (Chat Engines):在查詢引擎的基礎上增加了對話記憶,支持多輪 RAG 對話。
- 代理 (Agents):LlamaIndex 也提供了 Agent 框架,其 Agent 可以使用 LlamaIndex 的查詢引擎作為工具 (QueryEngineTool) 來訪問和推理數據。
- 數據連接器/讀取器 (Data Connectors / Readers):極其強大的數據攝取能力,支持超過150種數據源。
-
LlamaIndex 數據索引流程示意圖 (文本描述):
-
LlamaIndex 查詢流程示意圖 (文本描述):
-
應用場景:
- 構建任何基于私有數據的問答系統:無論是公司內部文檔、個人筆記、研究論文庫還是特定領域的知識庫。
- 多模態 RAG:結合文本、圖像、音頻數據進行問答。
- 結構化數據分析與問答:將結構化數據(如 SQL 數據庫)與非結構化數據結合起來,通過自然語言進行查詢和分析。
- 知識圖譜構建與問答:從文本中自動構建知識圖譜,并基于圖譜進行復雜推理。
- Agentic RAG:創建能夠主動查詢、分析和綜合來自不同數據源信息的智能代理。
總結與選擇考量
這些框架各有側重,但目標都是為了讓開發者更高效地利用 LLM 的強大能力。
- 如果您需要一個功能全面、社區龐大、擁有大量預置組件和靈活編排能力的框架,并且希望快速原型化和構建復雜的Agentic應用或RAG流程,LangChain 通常是首選。
- 如果您專注于構建生產級別的、高性能的語義搜索或問答系統,并且非常重視系統的評估、可擴展性和與傳統信息檢索技術的結合,Haystack 會是一個非常專業的選擇。
- 如果您想探索多智能體協作、任務自動化和人類參與的復雜對話系統,特別是需要代理之間進行精細的交互和代碼執行,AutoGen 提供了獨特的范式。
- 如果您希望以一種**更接近傳統軟件工程的方式將AI能力(尤其是LLM)輕量級地集成到現有應用程序(特別是C#, Python, Java技術棧)**中,并強調技能的復用和AI與業務邏輯的融合,Semantic Kernel 是一個優秀的選擇。
- 如果您項目的核心在于處理和連接多樣化的外部數據源以增強LLM(即RAG是關鍵),并且需要對數據的攝取、索引、查詢進行深度優化和精細控制,LlamaIndex 在數據處理方面提供了無與倫比的深度和廣度。
在實際項目中,這些框架并非完全互斥,有時甚至可以結合使用它們各自的優勢組件。例如,使用 LlamaIndex 構建強大的數據索引和檢索器,然后將其作為 LangChain Agent 的一個工具。理解它們的核心設計理念和優勢,將幫助您為您的 LLM 應用選擇最合適的架構和工具。