1.1 LangChain核心概念导论 学习目标 读完本节,你将能够: 理解LangChain的核心理念和设计哲学 掌握LangChain的核心架构和组件 区分LangChain与其他AI开发框架的差异 构建第一个简单的LangChain应用 为后续深入学习打下坚实基础 1.1.1 LangChain的起源与核心理念 🌟 什么是LangChain? LangChain是一个专门为构建基于大语言模型的应用程序而设计的开源框架。它不是一个单一的AI模型,而是一个开发工具链,旨在解决LLM应用开发中的核心挑战。
读完本节,你将能够:
LangChain是一个专门为构建基于大语言模型的应用程序而设计的开源框架。它不是一个单一的AI模型,而是一个开发工具链,旨在解决LLM应用开发中的核心挑战。
核心定位: LangChain = LLM + Chain + Memory + Tools + Agents
LangChain的设计遵循几个核心理念:
将复杂的AI应用拆解为可复用的组件:
# 组件化示例 from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain # 各个组件可以独立开发和测试 llm = ChatOpenAI(temperature=0.7) prompt = ChatPromptTemplate.from_template("你是一个{role},请{task}") chain = LLMChain(llm=llm, prompt=prompt)
各种组件可以通过不同的方式组合,构建复杂的应用:
应用能够理解和利用上下文信息,包括对话历史、外部数据等。
LangChain的架构分为四个主要层次:
# 基础模型层 from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic from langchain_google import ChatGoogle # 统一的接口,支持多种模型 llms = { "openai": ChatOpenAI(), "anthropic": ChatAnthropic(), "google": ChatGoogle() }
各种可复用的组件模块:
# 组件层示例 from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.documents import Document from langchain.vectorstores import Chroma from langchain.memory import ConversationBufferMemory
将多个组件组合成工作流:
# 链式层示例 from langchain.chains import LLMChain, SequentialChain # 简单链 response_chain = LLMChain(llm=llm, prompt=prompt) # 复杂序列链 analysis_chain = SequentialChain( chains=[preprocess_chain, analysis_chain, format_chain], input_variables=["input_text"], output_variables=["final_result"] )
具备自主决策能力的AI系统:
# 智能体层示例 from langchain.agents import AgentType, initialize_agent from langchain.tools import Tool agent = initialize_agent( tools=[search_tool, calculator_tool], llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )
| 框架 | 侧重点 | 适用场景 | 学习曲线 |
|---|---|---|---|
| LangChain | LLM应用开发 | AI对话系统、智能Agent | 中等 |
| HuggingFace Transformers | 模型训练与微调 | 模型开发、NLP研究 | 较陡 |
| PyTorch | 深度学习框架 | 通用深度学习学习 | 陡峭 |
| TensorFlow | 生产部署 | 企业级AI部署 | 中等 |
| 框架 | 核心优势 | 特点 | 适合场景 |
|---|---|---|---|
| LangChain | 组件化、链式调用 | 灵活、可扩展 | 快速原型开发 |
| LlamaIndex | RAG优化 | 知识库集成强 | 检索增强应用 |
| CrewAI | 多智能体协作 | 团队协作模式 | 复杂任务分解 |
| AutoGen | 多代理对话 | 对话模式丰富 | 多轮交互系统 |
LangChain提供了统一的LLM接口,支持多种模型:
from langchain_openai import ChatOpenAI from langchain_anthropic import ChatAnthropic # OpenAI集成 openai_llm = ChatOpenAI( model="gpt-4", temperature=0.7, max_tokens=1000 ) # Anthropic集成 anthropic_llm = ChatAnthropic( model="claude-3-sonnet", temperature=0.5 ) # 统一调用方式 def call_llm(llm, prompt): response = llm.invoke(prompt) return response.content
动态生成提示词的核心工具:
from langchain.prompts import ChatPromptTemplate # 基础提示词模板 template = ChatPromptTemplate.from_template( "你是一个{role}专家,请针对{topic}提供详细的分析。" ) # 使用示例 prompt = template.format( role="数据科学", topic="机器学习模型选择" ) # 多轮对话模板 chat_template = ChatPromptTemplate.from_messages([ ("system", "你是一个{personality}的助手"), ("human", "{user_input}"), ("assistant", "{assistant_response}"), ("human", "{follow_up}"), ])
支持多种数据源的数据加载:
from langchain.document_loaders import ( TextLoader, PyPDFLoader, WebBaseLoader, NotionLoader ) # 文本文件加载 text_loader = TextLoader("document.txt") documents = text_loader.load() # PDF文件加载 pdf_loader = PyPDFLoader("report.pdf") pdf_docs = pdf_loader.load() # 网页内容加载 web_loader = WebBaseLoader(["https://example.com"]) web_docs = web_loader.load() # 批量处理 loaders = [ TextLoader("doc1.txt"), PyPDFLoader("doc2.pdf"), WebBaseLoader(["https://site1.com", "https://site2.com"]) ] all_documents = [] for loader in loaders: all_documents.extend(loader.load())
文档内容的处理和转换:
from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_transformers import ( Html2TextTransformer, LongContextReorder ) # 文本分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200 ) chunks = text_splitter.split_documents(documents) # HTML转换 html_transformer = Html2TextTransformer() text_docs = html_transformer.transform_documents(html_docs) # 上下文重排序 reorder = LongContextReorder() reordered_docs = reorder.transform_documents(docs)
高效的语义搜索和检索:
from langchain.vectorstores import Chroma, FAISS from langchain.embeddings import OpenAIEmbeddings # 嵌入模型 embeddings = OpenAIEmbeddings() # Chroma向量存储 chroma_store = Chroma.from_documents( documents=documents, embedding=embeddings, persist_directory="./chroma_db" ) # FAISS向量存储 faiss_store = FAISS.from_documents( documents=documents, embedding=embeddings ) # 相似性搜索 results = chroma_store.similarity_search( query="机器学习算法", k=5 ) # 元数据过滤 filtered_results = chroma_store.similarity_search_with_score( query="深度学习", k=3, filter={"document_type": "research"} )
对话历史的持久化和管理:
from langchain.memory import ( ConversationBufferMemory, ConversationSummaryMemory, ConversationBufferWindowMemory ) # 基础记忆 memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True ) # 总结记忆 summary_memory = ConversationSummaryMemory( llm=llm, memory_key="summary_history" ) # 滑动窗口记忆 window_memory = ConversationBufferWindowMemory( k=5, # 保留最近5轮对话 memory_key="window_history" ) # 使用记忆 memory.save_context( {"input": "你好,我是张三"}, {"output": "你好张三!很高兴认识你。"} )
与外部系统交互的接口:
from langchain.tools import Tool from langchain.agents import load_tools # 自定义工具 def search_web(query: str) -> str: """搜索网络信息""" # 实现搜索逻辑 return f"搜索结果: {query}" search_tool = Tool( name="web_search", func=search_web, description="用于搜索网络信息" ) # 内置工具 tools = load_tools([ "google-serper", "wikipedia", "python_repl" ]) # 工具集合 toolkit = [search_tool, calculator_tool, weather_tool]
具有决策能力的AI系统:
from langchain.agents import ( AgentType, initialize_agent, create_openai_tools_agent ) # ReAct智能体 react_agent = initialize_agent( tools=tools, llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True, handle_parsing_errors=True ) # OpenAI函数调用智能体 function_agent = create_openai_tools_agent( llm=llm, tools=tools, prompt=custom_prompt ) # 自定义代理定义 agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=10, early_stopping_method="force" )
让我们构建一个简单的问答助手:
创建一个能够回答关于机器学习知识的智能助手。
import os from langchain_openai import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain from langchain.memory import ConversationBufferMemory # 设置环境变量 os.environ["OPENAI_API_KEY"] = "your-api-key-here" # 初始化组件 llm = ChatOpenAI( model="gpt-4", temperature=0.3, max_tokens=2000 ) # 提示词模板 template = ChatPromptTemplate.from_template( """你是一个机器学习专家,请根据用户的回答提供专业、准确且易懂的回答。 用户问题: {question} 上下文信息: {context} 请按照以下格式回答: 1. 直接答案 2. 详细解释 3. 实际应用案例 4. 相关推荐学习资源 AI专家:""" ) # 创建链 ml_chain = LLMChain( llm=llm, prompt=template, memory=ConversationBufferMemory( memory_key="chat_history", return_messages=True ), verbose=True ) # 应用示例 def ml_assistant(question: str, context: str = ""): """机器学习助手""" try: response = ml_chain.run( question=question, context=context ) return response except Exception as e: return f"抱歉,处理您的请求时出现错误: {str(e)}" # 测试应用 if __name__ == "__main__": # 示例问答 question1 = "什么是深度学习?它与传统机器学习有什么区别?" answer1 = ml_assistant(question1) question2 = "能推荐几个适合初学者的深度学习框架吗?" answer2 = ml_assistant(question2) print("=== 问题1 ===") print(answer1) print("\n=== 问题2 ===") print(answer2)
from langchain.tools import Tool from langchain.agents import initialize_agent, AgentType # 搜索工具 def search_ml_info(query: str) -> str: """搜索机器学习相关信息""" # 这里可以集成实际的搜索API return f"搜索到的ML信息: {query}" search_tool = Tool( name="ml_search", func=search_ml_info, description="用于搜索机器学习相关信息" ) # 增强型智能体 enhanced_agent = initialize_agent( tools=[search_tool], llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True )
import json from datetime import datetime class PersistentMemory: def __init__(self, file_path="ml_conversations.json"): self.file_path = file_path self.conversations = self.load_conversations() def load_conversations(self): try: with open(self.file_path, 'r', encoding='utf-8') as f: return json.load(f) except: return {} def save_conversation(self, user_id, question, answer): timestamp = datetime.now().isoformat() if user_id not in self.conversations: self.conversations[user_id] = [] self.conversations[user_id].append({ "timestamp": timestamp, "question": question, "answer": answer }) with open(self.file_path, 'w', encoding='utf-8') as f: json.dump(self.conversations, f, ensure_ascii=False, indent=2) # 使用持久化记忆 persistent_memory = PersistentMemory()
# 好的做法:组件化 class MLAssistant: def __init__(self): self.llm = ChatOpenAI() self.memory = ConversationBufferMemory() self.template = self._get_prompt_template() def _get_prompt_template(self): return ChatPromptTemplate.from_template("...") def ask(self, question): # 逻辑实现 pass
# 完善的错误处理 def safe_llm_call(prompt, max_retries=3): for attempt in range(max_retries): try: response = llm.invoke(prompt) return response.content except Exception as e: if attempt == max_retries - 1: raise Exception(f"LLM调用失败: {str(e)}") time.sleep(2 ** attempt) # 指数退避
# 批量处理 def batch_process_questions(questions, batch_size=5): results = [] for i in range(0, len(questions), batch_size): batch = questions[i:i + batch_size] batch_results = [ml_assistant(q) for q in batch] results.extend(batch_results) return results
# 成本监控 class CostMonitor: def __init__(self): self.total_tokens = 0 self.estimated_cost = 0.0 def track_usage(self, response): tokens = len(response.content.split()) self.total_tokens += tokens self.estimated_cost += tokens * 0.000002 # 假设每token成本 return self.estimated_cost
# 内容过滤 def safe_content_filter(content): inappropriate_keywords = ["暴力", "违法", "不良"] for keyword in inappropriate_keywords: if keyword in content: return False return True
下一节我们将深入学习1.2 安装与环境配置,包括:
准备好了吗?让我们继续LangChain的学习之旅!🚀