关于 langchain-architecture
面向使用 LangChain 构建 LLM 应用的开发者,介绍 Agent、链、记忆、文档处理、回调及架构模式。
主要功能
- 01Agent 与工具设计
- 02多步链模式
- 03对话记忆选项
- 04文档加载与检索
- 05用于监控的回调
适用场景
- 01设计可调用工具的 Agent
- 02组合多步 LLM 工作流
- 03构建文档检索流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ hermeticormus/ libreuiux-claude-code --skill langchain-architecture安装后在 Claude Code 中输入/langchain-architecture确认已加载。
详细介绍
LangChain 架构
掌握 LangChain 框架,使用 Agent、链、记忆和工具集成构建复杂的大模型应用。
何时使用此技能
- 构建可调用工具的自主 AI Agent
- 实现复杂的多步骤大模型工作流
- 管理对话记忆和状态
- 将大模型与外部数据源和 API 集成
- 创建模块化、可复用的大模型应用组件
- 实现文档处理流水线
- 构建生产级大模型应用
核心概念
1. Agent
使用大模型自主决定采取哪些操作的系统。
Agent 类型:
- ReAct:以交错方式进行推理和行动
- OpenAI Functions:利用函数调用 API
- Structured Chat:处理多输入工具
- Conversational:针对聊天界面优化
- Self-Ask with Search:将复杂查询分解为多个部分
2. 链
对大模型或其他实用程序的一系列调用。
链类型:
- LLMChain:基础提示词与大模型的组合
- SequentialChain:按顺序执行多个链
- RouterChain:将输入路由到专用链
- TransformChain:在各步骤之间转换数据
- MapReduceChain:并行处理并汇总结果
3. 记忆
用于在多次交互间保留上下文的系统。
记忆类型:
- ConversationBufferMemory:存储所有消息
- ConversationSummaryMemory:总结较早的消息
- ConversationBufferWindowMemory:保留最近的 N 条消息
- EntityMemory:跟踪有关实体的信息
- VectorStoreMemory:基于语义相似度检索
4. 文档处理
加载、转换和存储文档,以供检索。
组件:
- Document Loaders:从各种来源加载文档
- Text Splitters:智能地将文档拆分为块
- Vector Stores:存储和检索嵌入
- Retrievers:获取相关文档
- Indexes:整理文档,以便高效访问
5. 回调
用于日志记录、监控和调试的钩子。
使用场景:
- 请求/响应日志记录
- 跟踪令牌用量
- 延迟监控
- 错误处理
- 收集自定义指标
快速开始
from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemory
# Initialize LLM
llm = OpenAI(temperature=0)
# Load tools
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Add memory
memory = ConversationBufferMemory(memory_key="chat_history")
# Create agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
# Run agent
result = agent.run("What's the weather in SF? Then calculate 25 * 4")
架构模式
模式 1:使用 LangChain 实现 RAG
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
# Load and process documents
loader = TextLoader('documents.txt')
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# Create vector store
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(texts, embeddings)
# Create retrieval chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)
# Query
result = qa_chain({"query": "What is the main topic?"})
模式 2:使用工具的自定义 Agent
from langchain.agents import Tool, AgentExecutor
from langchain.agents.react.base import ReActDocstoreAgent
from langchain.tools import tool
@tool
def search_database(query: str) -> str:
"""Search internal database for information."""
# Your database search logic
return f"Results for: {query}"
@tool
def send_email(recipient: str, content: str) -> str:
"""Send an email to specified recipient."""
# Email sending logic
return f"Email sent to {recipient}"
tools = [search_database, send_email]
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
模式 3:多步骤链
from langchain.chains import LLMChain, SequentialChain
from langchain.prompts import PromptTemplate
# Step 1: Extract key information
extract_prompt = PromptTemplate(
input_variables=["text"],
template="Extract key entities from: {text}\n\nEntities:"
)
extract_chain = LLMChain(llm=llm, prompt=extract_prompt, output_key="entities")
# Step 2: Analyze entities
analyze_prompt = PromptTemplate(
input_variables=["entities"],
template="Analyze these entities: {entities}\n\nAnalysis:"
)
analyze_chain = LLMChain(llm=llm, prompt=analyze_prompt, output_key="analysis")
# Step 3: Generate summary
summary_prompt = PromptTemplate(
input_variables=["entities", "analysis"],
template="Summarize:\nEntities: {entities}\nAnalysis: {analysis}\n\nSummary:"
)
summary_chain = LLMChain(llm=llm, prompt=summary_prompt, output_key="summary")
# Combine into sequential chain
overall_chain = SequentialChain(
chains=[extract_chain, analyze_chain, summary_chain],
input_variables=["text"],
output_variables=["entities", "analysis", "summary"],
verbose=True
)
记忆管理最佳实践
选择合适的记忆类型
# For short conversations (< 10 messages)
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
# For long conversations (summarize old messages)
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm)
# For sliding window (last N messages)
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=5)
# For entity tracking
from langchain.memory import ConversationEntityMemory
memory = ConversationEntityMemory(llm=llm)
# For semantic retrieval of relevant history
from langchain.memory import VectorStoreRetrieverMemory
memory = VectorStoreRetrieverMemory(retriever=retriever)
回调系统
自定义回调处理器
from langchain.callbacks.base import BaseCallbackHandler
class CustomCallbackHandler(BaseCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
print(f"LLM started with prompts: {prompts}")
def on_llm_end(self, response, **kwargs):
print(f"LLM ended with response: {response}")
def on_llm_error(self, error, **kwargs):
print(f"LLM error: {error}")
def on_chain_start(self, serialized, inputs, **kwargs):
print(f"Chain started with inputs: {inputs}")
def on_agent_action(self, action, **kwargs):
print(f"Agent taking action: {action}")
# Use callback
agent.run("query", callbacks=[CustomCallbackHandler()])
测试策略
import pytest
from unittest.mock import Mock
def test_agent_tool_selection():
# Mock LLM to return specific tool selection
mock_llm = Mock()
mock_llm.predict.return_value = "Action: search_database\nAction Input: test query"
agent = initialize_agent(tools, mock_llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
result = agent.run("test query")
# Verify correct tool was selected
assert "search_database" in str(mock_llm.predict.call_args)
def test_memory_persistence():
memory = ConversationBufferMemory()
memory.save_context({"input": "Hi"}, {"output": "Hello!"})
assert "Hi" in memory.load_memory_variables({})['history']
assert "Hello!" in memory.load_memory_variables({})['history']
性能优化
1. 缓存
from langchain.cache import InMemoryCache
import langchain
langchain.llm_cache = InMemoryCache()
2. 批处理
# Process multiple documents in parallel
from langchain.document_loaders import DirectoryLoader
from concurrent.futures import ThreadPoolExecutor
loader = DirectoryLoader('./docs')
docs = loader.load()
def process_doc(doc):
return text_splitter.split_documents([doc])
with ThreadPoolExecutor(max_workers=4) as executor:
split_docs = list(executor.map(process_doc, docs))
3. 流式响应
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()])
资源
- references/agents.md:深入了解 Agent 架构
- references/memory.md:记忆系统模式
- references/chains.md:链组合策略
- references/document-processing.md:文档加载与索引
- references/callbacks.md:监控与可观测性
- assets/agent-template.py:可用于生产环境的 Agent 模板
- assets/memory-config.yaml:记忆配置示例
- assets/chain-example.py:复杂链示例
常见问题
- 记忆溢出:未管理对话历史长度
- 工具选择错误:工具描述不佳会使 Agent 困惑
- 超出上下文窗口:超出大模型令牌限制
- 没有错误处理:未捕获和处理 Agent 故障
- 检索效率低:未优化向量存储查询
生产环境检查清单
- 实现适当的错误处理
- 添加请求/响应日志记录
- 监控令牌用量和成本
- 为 Agent 执行设置超时限制
- 实现速率限制
- 添加输入验证
- 使用边缘案例进行测试
- 设置可观测性(回调)
- 实现回退策略
- 对提示词和配置进行版本控制
评论
支持 Markdown