LangChain框架完全指南
LangChain是目前最流行的LLM应用开发框架,提供了丰富的组件和工具链,让开发者可以快速构建智能应用。
什么是LangChain
核心价值
LangChain解决了LLM应用开发的三大痛点:
- 标准化接口 - 统一不同LLM提供商的API
- 模块化组件 - 提供可复用的功能组件
- 链式编排 - 简化复杂workflow的构建
python
1# 不使用LangChain2import openai3response = openai.ChatCompletion.create(...)4# 需要手动处理格式、错误、重试等56# 使用LangChain7from langchain.llms import OpenAI8llm = OpenAI()9response = llm("你好") # 简洁统一核心组件
快速开始
安装配置
bash
1# 安装核心包2pip install langchain34# 安装LLM集成5pip install langchain-openai6pip install langchain-anthropic78# 安装社区包9pip install langchain-community1011# 完整安装12pip install langchain[all]Hello World
python
1from langchain.llms import OpenAI2import os34# 设置API Key5os.environ["OPENAI_API_KEY"] = "your-api-key"67# 初始化模型8llm = OpenAI(temperature=0.7)910# 简单调用11response = llm("请用一句话介绍LangChain")12print(response)核心组件详解
1. Models (模型)
LLMs - 文本生成模型
python
1from langchain.llms import OpenAI, Anthropic, HuggingFaceHub23# OpenAI4openai_llm = OpenAI(5 model_name="gpt-3.5-turbo-instruct",6 temperature=0.7,7 max_tokens=5008)910# Claude11claude_llm = Anthropic(12 model="claude-3-sonnet-20240229",13 anthropic_api_key="your-key"14)1516# 开源模型17hf_llm = HuggingFaceHub(18 repo_id="mistralai/Mistral-7B-v0.1",19 huggingfacehub_api_token="your-token"20)2122# 统一调用接口23result = openai_llm("你好")Chat Models - 对话模型
python
1from langchain.chat_models import ChatOpenAI2from langchain.schema import HumanMessage, SystemMessage, AIMessage34chat = ChatOpenAI(5 model="gpt-4",6 temperature=07)89messages = [10 SystemMessage(content="你是一位Python专家"),11 HumanMessage(content="如何使用LangChain?")12]1314response = chat(messages)15print(response.content)Embeddings - 向量化模型
python
1from langchain.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings23# OpenAI Embeddings4openai_embeddings = OpenAIEmbeddings(5 model="text-embedding-3-small"6)78# 向量化单个文本9vector = openai_embeddings.embed_query("Hello World")10print(f"维度: {len(vector)}")1112# 批量向量化13texts = ["文本1", "文本2", "文本3"]14vectors = openai_embeddings.embed_documents(texts)2. Prompts (提示词)
PromptTemplate
python
1from langchain.prompts import PromptTemplate23# 基础模板4template = """5你是一位{role}。6请回答以下问题:{question}7"""89prompt = PromptTemplate(10 input_variables=["role", "question"],11 template=template12)1314# 格式化15formatted_prompt = prompt.format(16 role="Python专家",17 question="如何优化代码性能?"18)1920print(formatted_prompt)ChatPromptTemplate
python
1from langchain.prompts import (2 ChatPromptTemplate,3 SystemMessagePromptTemplate,4 HumanMessagePromptTemplate5)67# 构建对话提示8system_template = "你是一位{expertise}专家"9system_prompt = SystemMessagePromptTemplate.from_template(system_template)1011human_template = "{user_input}"12human_prompt = HumanMessagePromptTemplate.from_template(human_template)1314chat_prompt = ChatPromptTemplate.from_messages([15 system_prompt,16 human_prompt17])1819# 使用20messages = chat_prompt.format_messages(21 expertise="数据分析",22 user_input="如何分析用户行为?"23)FewShotPromptTemplate
python
1from langchain.prompts import FewShotPromptTemplate23# 示例数据4examples = [5 {"input": "开心", "output": "positive"},6 {"input": "难过", "output": "negative"},7 {"input": "生气", "output": "negative"}8]910# 示例模板11example_template = """12输入: {input}13输出: {output}14"""1516example_prompt = PromptTemplate(17 input_variables=["input", "output"],18 template=example_template19)2021# Few-shot提示22few_shot_prompt = FewShotPromptTemplate(23 examples=examples,24 example_prompt=example_prompt,25 prefix="将情感分类为positive或negative:",26 suffix="输入: {input}\n输出:",27 input_variables=["input"]28)2930print(few_shot_prompt.format(input="兴奋"))3. Chains (链)
LLMChain - 基础链
python
1from langchain.chains import LLMChain2from langchain.llms import OpenAI3from langchain.prompts import PromptTemplate45# 创建链6llm = OpenAI(temperature=0.7)7prompt = PromptTemplate(8 input_variables=["product"],9 template="为{product}写一句广告语"10)1112chain = LLMChain(llm=llm, prompt=prompt)1314# 执行15result = chain.run(product="智能手表")16print(result)1718# 批量执行19results = chain.apply([20 {"product": "智能手表"},21 {"product": "无线耳机"}22])SequentialChain - 顺序链
python
1from langchain.chains import SequentialChain23# 链1: 生成故事大纲4outline_chain = LLMChain(5 llm=llm,6 prompt=PromptTemplate(7 input_variables=["topic"],8 template="为{topic}写一个故事大纲"9 ),10 output_key="outline"11)1213# 链2: 基于大纲写故事14story_chain = LLMChain(15 llm=llm,16 prompt=PromptTemplate(17 input_variables=["outline"],18 template="基于以下大纲写一个故事:\n{outline}"19 ),20 output_key="story"21)2223# 组合链24overall_chain = SequentialChain(25 chains=[outline_chain, story_chain],26 input_variables=["topic"],27 output_variables=["outline", "story"],28 verbose=True29)3031# 执行32result = overall_chain({"topic": "时间旅行"})RouterChain - 路由链
python
1from langchain.chains.router import MultiPromptChain2from langchain.chains import ConversationChain34# 定义不同领域的提示5prompt_infos = [6 {7 "name": "physics",8 "description": "适合回答物理问题",9 "prompt_template": "你是物理专家。{input}"10 },11 {12 "name": "math",13 "description": "适合回答数学问题",14 "prompt_template": "你是数学专家。{input}"15 }16]1718# 创建路由链19router_chain = MultiPromptChain.from_prompts(20 llm=llm,21 prompt_infos=prompt_infos22)2324# 自动路由到合适的链25result = router_chain.run("什么是牛顿第二定律?")4. Memory (记忆)
ConversationBufferMemory
python
1from langchain.memory import ConversationBufferMemory2from langchain.chains import ConversationChain34# 初始化记忆5memory = ConversationBufferMemory()67# 创建对话链8conversation = ConversationChain(9 llm=llm,10 memory=memory,11 verbose=True12)1314# 多轮对话15conversation.run("你好,我叫张三")16conversation.run("我叫什么名字?") # 会记住之前的对话1718# 查看记忆19print(memory.load_memory_variables({}))ConversationBufferWindowMemory
python
1from langchain.memory import ConversationBufferWindowMemory23# 只保留最近k轮对话4window_memory = ConversationBufferWindowMemory(k=2)56conversation = ConversationChain(7 llm=llm,8 memory=window_memory9)1011# 只会记住最近2轮对话ConversationSummaryMemory
python
1from langchain.memory import ConversationSummaryMemory23# 使用LLM总结历史对话4summary_memory = ConversationSummaryMemory(llm=llm)56conversation = ConversationChain(7 llm=llm,8 memory=summary_memory9)1011# 会自动总结长对话,节省token5. Agents (智能体)
基础Agent
python
1from langchain.agents import initialize_agent, Tool, AgentType2from langchain.llms import OpenAI34# 定义工具5def search_tool(query):6 return f"搜索结果: {query}"78def calculator(expression):9 return eval(expression)1011tools = [12 Tool(13 name="Search",14 func=search_tool,15 description="用于搜索信息"16 ),17 Tool(18 name="Calculator",19 func=calculator,20 description="用于数学计算,输入数学表达式"21 )22]2324# 初始化Agent25agent = initialize_agent(26 tools=tools,27 llm=OpenAI(temperature=0),28 agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,29 verbose=True30)3132# Agent会自主选择工具33result = agent.run("25乘以4等于多少?")ReAct Agent
python
1# ReAct: Reasoning + Acting2from langchain.agents import create_react_agent34# Agent会遵循: 思考 -> 行动 -> 观察 -> 思考 的循环5agent = create_react_agent(6 llm=llm,7 tools=tools,8 prompt=react_prompt9)1011agent_executor = AgentExecutor(12 agent=agent,13 tools=tools,14 verbose=True,15 max_iterations=516)1718result = agent_executor.invoke({19 "input": "2024年世界杯在哪里举办?"20})Custom Agent
python
1from langchain.agents import BaseSingleActionAgent23class MyCustomAgent(BaseSingleActionAgent):4 @property5 def input_keys(self):6 return ["input"]7 8 def plan(self, intermediate_steps, **kwargs):9 # 自定义决策逻辑10 user_input = kwargs["input"]11 12 # 返回下一步行动13 return AgentAction(14 tool="Search",15 tool_input=user_input,16 log="决定使用搜索工具"17 )18 19 async def aplan(self, intermediate_steps, **kwargs):20 return self.plan(intermediate_steps, **kwargs)实战项目
项目1: 文档问答系统
python
1from langchain.document_loaders import DirectoryLoader, TextLoader2from langchain.text_splitter import RecursiveCharacterTextSplitter3from langchain.embeddings import OpenAIEmbeddings4from langchain.vectorstores import Chroma5from langchain.chains import RetrievalQA6from langchain.llms import OpenAI78class DocumentQA:9 def __init__(self, docs_path):10 self.docs_path = docs_path11 self.vectorstore = None12 self.qa_chain = None13 14 def setup(self):15 # 1. 加载文档16 loader = DirectoryLoader(17 self.docs_path,18 glob="**/*.txt",19 loader_cls=TextLoader20 )21 documents = loader.load()22 23 # 2. 切分文档24 text_splitter = RecursiveCharacterTextSplitter(25 chunk_size=1000,26 chunk_overlap=20027 )28 chunks = text_splitter.split_documents(documents)29 30 # 3. 创建向量库31 embeddings = OpenAIEmbeddings()32 self.vectorstore = Chroma.from_documents(33 documents=chunks,34 embedding=embeddings35 )36 37 # 4. 创建QA链38 llm = OpenAI(temperature=0)39 self.qa_chain = RetrievalQA.from_chain_type(40 llm=llm,41 chain_type="stuff",42 retriever=self.vectorstore.as_retriever()43 )44 45 def query(self, question):46 return self.qa_chain.run(question)4748# 使用49qa_system = DocumentQA("./documents")50qa_system.setup()51answer = qa_system.query("文档的主要内容是什么?")项目2: 智能客服
python
1from langchain.chat_models import ChatOpenAI2from langchain.memory import ConversationBufferMemory3from langchain.chains import ConversationChain4from langchain.prompts import (5 ChatPromptTemplate,6 MessagesPlaceholder,7 SystemMessagePromptTemplate,8 HumanMessagePromptTemplate9)1011class CustomerServiceBot:12 def __init__(self):13 self.chat = ChatOpenAI(model="gpt-3.5-turbo")14 self.memory = ConversationBufferMemory(return_messages=True)15 16 # 定义系统提示17 system_prompt = """18 你是一位专业的客服代表,负责回答用户关于产品的问题。19 20 产品信息:21 - 产品名称:智能手表22 - 价格:¥199923 - 特性:健康监测、运动追踪、通话功能24 - 保修:1年25 26 请:27 1. 友好、专业地回答问题28 2. 如果不确定,诚实说明29 3. 主动询问是否需要更多帮助30 """31 32 prompt = ChatPromptTemplate.from_messages([33 SystemMessagePromptTemplate.from_template(system_prompt),34 MessagesPlaceholder(variable_name="history"),35 HumanMessagePromptTemplate.from_template("{input}")36 ])37 38 self.conversation = ConversationChain(39 llm=self.chat,40 memory=self.memory,41 prompt=prompt,42 verbose=True43 )44 45 def chat(self, user_message):46 return self.conversation.predict(input=user_message)47 48 def reset(self):49 self.memory.clear()5051# 使用52bot = CustomerServiceBot()53print(bot.chat("你好"))54print(bot.chat("这款手表防水吗?"))55print(bot.chat("价格多少?"))项目3: 代码审查助手
python
1from langchain.chains import LLMChain2from langchain.prompts import PromptTemplate3from langchain.chat_models import ChatOpenAI45class CodeReviewer:6 def __init__(self):7 self.llm = ChatOpenAI(model="gpt-4", temperature=0)8 9 self.review_prompt = PromptTemplate(10 input_variables=["code", "language"],11 template="""12 请审查以下{language}代码,提供详细的反馈:13 14 代码:15 ```{language}16 {code}请从以下方面审查:
- 代码质量和可读性
- 潜在的bug和安全问题
- 性能优化建议
- 最佳实践和改进建议
请提供结构化的审查意见。 """ )
self.chain = LLMChain(llm=self.llm, prompt=self.review_prompt)
def review(self, code, language="python"): return self.chain.run(code=code, language=language)
使用
reviewer = CodeReviewer()
code = """ def calculate_sum(numbers): total = 0 for i in range(len(numbers)): total = total + numbers[i] return total """
review = reviewer.review(code) print(review)
1### 项目4: SQL生成Agent23```python4from langchain.agents import create_sql_agent5from langchain.agents.agent_toolkits import SQLDatabaseToolkit6from langchain.sql_database import SQLDatabase7from langchain.chat_models import ChatOpenAI89# 连接数据库10db = SQLDatabase.from_uri("sqlite:///example.db")1112# 创建SQL Agent13llm = ChatOpenAI(model="gpt-4", temperature=0)14toolkit = SQLDatabaseToolkit(db=db, llm=llm)1516agent_executor = create_sql_agent(17 llm=llm,18 toolkit=toolkit,19 verbose=True,20 agent_type="openai-functions"21)2223# 自然语言查询数据库24result = agent_executor.run(25 "有多少用户注册于2024年?"26)27print(result)LangChain高级特性
1. Streaming输出
python
1from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler2from langchain.chat_models import ChatOpenAI34# 流式输出5chat = ChatOpenAI(6 streaming=True,7 callbacks=[StreamingStdOutCallbackHandler()],8 temperature=0.79)1011response = chat.predict("写一首关于春天的诗")12# 输出会逐字显示2. Callbacks监控
python
1from langchain.callbacks import StdOutCallbackHandler2from langchain.chains import LLMChain34class CustomCallback(StdOutCallbackHandler):5 def on_llm_start(self, serialized, prompts, **kwargs):6 print(f"LLM开始: {prompts}")7 8 def on_llm_end(self, response, **kwargs):9 print(f"LLM结束: {response}")10 11 def on_chain_start(self, serialized, inputs, **kwargs):12 print(f"Chain开始: {inputs}")1314# 使用callback15chain = LLMChain(16 llm=llm,17 prompt=prompt,18 callbacks=[CustomCallback()]19)3. 缓存
python
1from langchain.cache import InMemoryCache, SQLiteCache2import langchain34# 内存缓存5langchain.llm_cache = InMemoryCache()67# 持久化缓存8langchain.llm_cache = SQLiteCache(database_path=".langchain.db")910# 相同问题不会重复调用API11llm("你好") # 调用API12llm("你好") # 从缓存返回4. 异步支持
python
1import asyncio2from langchain.chat_models import ChatOpenAI34async def async_generate():5 chat = ChatOpenAI()6 7 # 并发生成8 tasks = [9 chat.agenerate([["讲个笑话"]]),10 chat.agenerate([["写首诗"]]),11 chat.agenerate([["推荐本书"]])12 ]13 14 results = await asyncio.gather(*tasks)15 return results1617# 运行18results = asyncio.run(async_generate())与其他框架对比
| 特性 | LangChain | LlamaIndex | Semantic Kernel |
|---|---|---|---|
| 主要用途 | 通用LLM应用 | 数据检索 | 企业级集成 |
| 学习曲线 | 中等 | 较低 | 较高 |
| 生态系统 | 最丰富 | 专注RAG | 微软生态 |
| Agent支持 | 优秀 | 基础 | 优秀 |
| 文档质量 | 良好 | 优秀 | 良好 |
| 社区活跃度 | 非常高 | 高 | 中等 |
最佳实践
1. 错误处理
python
1from langchain.schema import OutputParserException23try:4 result = chain.run("你的问题")5except OutputParserException as e:6 print(f"输出解析错误: {e}")7except Exception as e:8 print(f"发生错误: {e}")2. 提示词优化
python
1# ❌ 不好的提示2bad_prompt = "翻译: {text}"34# ✅ 好的提示5good_prompt = """6请将以下文本从英文翻译成中文。7要求:81. 保持原意92. 使用地道的中文表达103. 保留专业术语1112文本: {text}1314译文:15"""3. 成本优化
python
1# 根据任务复杂度选择模型2def smart_llm_selection(task_complexity):3 if task_complexity == "simple":4 return ChatOpenAI(model="gpt-3.5-turbo") # 便宜5 elif task_complexity == "complex":6 return ChatOpenAI(model="gpt-4") # 贵但强大7 8# 使用缓存9import langchain10langchain.llm_cache = InMemoryCache()1112# 批量处理13chain.apply([{"input": "q1"}, {"input": "q2"}]) # 比单独调用快常见问题
Q1: 如何处理超长文本?
python
1from langchain.text_splitter import RecursiveCharacterTextSplitter2from langchain.chains import MapReduceDocumentsChain, ReduceDocumentsChain3from langchain.chains.combine_documents.stuff import StuffDocumentsChain45# 1. 切分文本6text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)7docs = text_splitter.create_documents([long_text])89# 2. Map-Reduce处理10map_reduce_chain = MapReduceDocumentsChain(11 llm_chain=llm_chain,12 reduce_documents_chain=reduce_chain13)1415result = map_reduce_chain.run(docs)Q2: 如何debug链的执行?
python
1# 方法1: 开启verbose2chain = LLMChain(llm=llm, prompt=prompt, verbose=True)34# 方法2: 使用debug5import langchain6langchain.debug = True78# 方法3: 自定义callback9class DebugCallback(BaseCallbackHandler):10 def on_chain_start(self, serialized, inputs, **kwargs):11 print(f"开始执行: {serialized['name']}")12 print(f"输入: {inputs}")Q3: 如何集成自定义LLM?
python
1from langchain.llms.base import LLM2from typing import Optional, List34class CustomLLM(LLM):5 model_name: str = "custom-model"6 7 @property8 def _llm_type(self) -> str:9 return "custom"10 11 def _call(12 self,13 prompt: str,14 stop: Optional[List[str]] = None15 ) -> str:16 # 调用你的模型API17 response = your_model_api(prompt)18 return response19 20 @property21 def _identifying_params(self):22 return {"model_name": self.model_name}2324# 使用25custom_llm = CustomLLM()26chain = LLMChain(llm=custom_llm, prompt=prompt)学习资源
官方资源
教程课程
社区
总结
LangChain是构建LLM应用的强大框架,通过本指南你已经掌握:
- ✅ LangChain的核心概念和组件
- ✅ Models、Prompts、Chains、Agents、Memory的使用
- ✅ 4个完整的实战项目
- ✅ 高级特性和最佳实践
- ✅ 常见问题的解决方案
评论区 / Comments