LangChain 框架深度解析与应用实践
LangChain 框架深度解析与应用实践
LangChain是一个强大的开源框架,专门用于构建基于大语言模型(LLM)的应用程序。它提供了一套完整的工具、组件和接口,使开发者能够轻松地将LLM集成到各种应用程序中,实现复杂的人工智能功能。
🧩 LangChain 核心概念
LangChain的核心理念是将复杂的AI应用分解为可重用的组件,这些组件可以通过链式调用的方式组合起来,形成强大的AI应用。
1. LLMs and Prompts(语言模型和提示)
LangChain支持多种大语言模型,包括OpenAI GPT系列、Anthropic Claude、Hugging Face模型等。
Prompt Templates(提示模板)
import { PromptTemplate } from "langchain/prompts";
// 创建提示模板
const template = `你是一个专业的{role},请基于以下信息回答问题:
上下文:{context}
问题:{question}
请提供详细、准确的回答。`;
const promptTemplate = new PromptTemplate({
template,
inputVariables: ["role", "context", "question"],
});
// 使用模板
const formattedPrompt = await promptTemplate.format({
role: "技术顾问",
context: "React是一个JavaScript库",
question: "React的主要特点是什么?"
});2. Chains(链)
Chains是LangChain的核心概念,允许将多个组件链接在一起:
Simple Sequential Chain(简单顺序链)
Sequential Chain(顺序链)
import { SequentialChain, LLMChain } from "langchain/chains";
import { ChatOpenAI } from "langchain/chat_models/openai";
import { PromptTemplate } from "langchain/prompts";
const model = new ChatOpenAI({ temperature: 0.7 });
// 第一个链:生成摘要
const summarizePrompt = new PromptTemplate({
template: "请为以下文本生成简洁的摘要:{text}",
inputVariables: ["text"],
});
const summarizeChain = new LLMChain({
prompt: summarizePrompt,
llm: model,
outputKey: "summary",
});
// 第二个链:基于摘要生成标题
const titlePrompt = new PromptTemplate({
template: "基于以下摘要生成一个吸引人的标题:{summary}",
inputVariables: ["summary"],
});
const titleChain = new LLMChain({
prompt: titlePrompt,
llm: model,
outputKey: "title",
});
// 组合成顺序链
const overallChain = new SequentialChain({
chains: [summarizeChain, titleChain],
inputVariables: ["text"],
outputVariables: ["summary", "title"],
});3. Agents(代理)
Agents能够根据输入动态选择要执行的动作:
ReAct Agent(推理和行动代理)
Self-Asking Agent(自问自答代理)
import { initializeAgentExecutorWithOptions } from "langchain/agents";
import { ChatOpenAI } from "langchain/chat_models/openai";
import { SerpAPI } from "langchain/tools";
const model = new ChatOpenAI({ temperature: 0 });
const tools = [
new SerpAPI(process.env.SERPAPI_API_KEY, {
gl: "us",
hl: "en",
}),
];
const executor = await initializeAgentExecutorWithOptions(
tools,
model,
{
agentType: "zero-shot-react-description",
verbose: true,
}
);
const result = await executor.call({
input: "今天北京的天气怎么样?"
});4. Memory(记忆)
LangChain提供了多种记忆管理机制:
Buffer Memory(缓冲记忆)
Conversation Summary Memory(对话摘要记忆)
import { ConversationSummaryMemory } from "langchain/memory";
import { ChatOpenAI } from "langchain/chat_models/openai";
const model = new ChatOpenAI({ temperature: 0 });
const memory = new ConversationSummaryMemory({
llm: model,
memoryKey: "chat_history",
inputKey: "input",
});
// 在链中使用记忆
const chain = new LLMChain({
llm: model,
prompt: new PromptTemplate({
template: "之前的对话:{chat_history}\n\n用户:{input}\nAI:",
inputVariables: ["chat_history", "input"],
}),
memory,
});5. Indexes(索引)
用于处理外部数据源和文档:
Document Loaders(文档加载器)
Text Splitters(文本分割器)
Vector Stores(向量存储)
import { Document } from "langchain/document";
import { RecursiveCharacterTextSplitter } from "langchain/text_splitter";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { Chroma } from "langchain/vectorstores/chroma";
// 加载文档
const docs: Document[] = [
new Document({ pageContent: "这是第一个文档的内容..." }),
new Document({ pageContent: "这是第二个文档的内容..." }),
];
// 文本分割
const textSplitter = new RecursiveCharacterTextSplitter({
chunkSize: 1000,
chunkOverlap: 200,
});
const splitDocs = await textSplitter.splitDocuments(docs);
// 创建向量存储
const embeddings = new OpenAIEmbeddings();
const vectorStore = await Chroma.fromDocuments(splitDocs, embeddings, {
collectionName: "my-documents",
});
// 相似性搜索
const results = await vectorStore.similaritySearch("查询内容", 2);🔧 LangChain 核心组件详解
1. Models(模型)
LangChain支持多种类型的AI模型:
Chat Models(聊天模型)
import { ChatOpenAI } from "langchain/chat_models/openai";
import { HumanMessage, SystemMessage } from "langchain/schema";
const chat = new ChatOpenAI({
temperature: 0.8,
modelName: "gpt-3.5-turbo",
});
const response = await chat.call([
new SystemMessage("你是一个专业的技术顾问"),
new HumanMessage("请解释什么是微服务架构?")
]);Text Completion Models(文本补全模型)
2. Tools(工具)
Tools是LangChain中可被Agent调用的功能:
内置工具
自定义工具
import { DynamicTool } from "langchain/tools";
// 创建自定义工具
const customTool = new DynamicTool({
name: "weather_api",
description: "获取指定城市的天气信息",
func: async (city: string) => {
// 实际的天气API调用
const response = await fetch(`https://api.weather.com/v1/weather?city=${city}`);
const data = await response.json();
return `${city}的天气:${data.temperature}°C, ${data.condition}`;
},
});
// 在Agent中使用
const tools = [customTool];
const executor = await initializeAgentExecutorWithOptions(tools, model, {
agentType: "zero-shot-react-description",
});3. Output Parsers(输出解析器)
用于解析和结构化LLM的输出:
Structured Output Parser(结构化输出解析器)
import { StructuredOutputParser } from "langchain/output_parsers";
import { z } from "zod";
const parser = StructuredOutputParser.fromZodSchema(
z.object({
mood: z.string().describe("情绪状态"),
color: z.string().describe("代表颜色"),
comment: z.string().describe("评论"),
})
);
const formatInstructions = parser.getFormatInstructions();
const prompt = new PromptTemplate({
template: "回答用户的问题。\n{format_instructions}\n{question}",
inputVariables: ["question"],
partialVariables: { format_instructions: formatInstructions },
});
const input = await prompt.format({ question: "今天感觉怎么样?" });
const response = await model.call(input);
const parsed = await parser.parse(response);🚀 高级应用模式
1. Retrieval-Augmented Generation (RAG)
RAG结合了检索和生成的优势:
import { RetrievalQAChain } from "langchain/chains";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { Chroma } from "langchain/vectorstores/chroma";
// 创建RAG链
const vectorStore = new Chroma(new OpenAIEmbeddings(), {
collectionName: "knowledge-base"
});
const retriever = vectorStore.asRetriever();
const qaChain = RetrievalQAChain.fromLLM(model, retriever, {
returnSourceDocuments: true,
verbose: true,
});
const result = await qaChain.call({
query: "关于这个主题的具体信息是什么?"
});2. Multi-Modal Applications(多模态应用)
结合文本、图像等多种输入:
Vision-Language Models(视觉-语言模型)
3. Conversational AI(对话AI)
构建复杂的对话系统:
Context Management(上下文管理)
import { ConversationChain } from "langchain/chains";
const conversation = new ConversationChain({
llm: model,
memory: new ConversationSummaryMemory({
llm: model,
memoryKey: "history",
}),
});
// 连续对话
const response1 = await conversation.call({ input: "你好!" });
const response2 = await conversation.call({ input: "你能帮我做什么?" });
const response3 = await conversation.call({ input: "请推荐一些编程语言" });📊 LangChain 生态系统
1. LangServe
用于部署LangChain应用的服务器:
from langserve import RemoteRunnable
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# 创建可部署的链
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个友好的AI助手"),
("human", "{question}")
])
chain = prompt | ChatOpenAI() | StrOutputParser()
# 部署
app = FastAPI()
app.include_router(chain.with_types(input_type=str).with_config({"run_name": "llm_chain"}).bind()).as_router()2. LangSmith
用于监控、调试和评估LangChain应用:
3. LangGraph
用于构建状态图驱动的AI应用:
from langgraph.graph import StateGraph, END
class State(TypedDict):
query: str
documents: List[Document]
response: str
def retrieve(state: State) -> State:
# 检索相关文档
docs = vector_store.similarity_search(state["query"])
return {"documents": docs}
def generate(state: State) -> State:
# 基于文档生成响应
context = "\n".join([doc.page_content for doc in state["documents"]])
response = llm(f"基于以下信息回答:{context}\n问题:{state['query']}")
return {"response": response}
# 构建状态图
workflow = StateGraph(State)
workflow.add_node("retrieve", retrieve)
workflow.add_node("generate", generate)
workflow.set_entry_point("retrieve")
workflow.add_edge("retrieve", "generate")
workflow.add_edge("generate", END)
app = workflow.compile()🛠️ 实际应用案例
1. 智能客服系统
import { ConversationalRetrievalQAChain } from "langchain/chains";
import { OpenAIEmbeddings } from "langchain/embeddings/openai";
import { PineconeStore } from "langchain/vectorstores/pinecone";
// 客服知识库
const embeddings = new OpenAIEmbeddings();
const vectorStore = await PineconeStore.fromExistingIndex(embeddings, {
pineconeIndex: pineconeClient.index("customer-support"),
});
const qaChain = ConversationalRetrievalQAChain.fromLLM(
model,
vectorStore.asRetriever(),
{
returnSourceDocuments: true,
verbose: true,
}
);
// 处理客户咨询
const result = await qaChain.call({
question: "我的订单什么时候能到货?",
chat_history: [],
});2. 文档分析助手
import { createRetrievalChain } from "langchain/chains/retrieval";
import { createStuffDocumentsChain } from "langchain/chains/combine_documents";
// 创建文档分析链
const combineDocsChain = await createStuffDocumentsChain({
llm: model,
documentPrompt: new PromptTemplate({
template: "{page_content}",
inputVariables: ["page_content"],
}),
});
const retrievalChain = await createRetrievalChain({
combineDocsChain,
retriever: vectorStore.asRetriever(),
});
const result = await retrievalChain.invoke({
input: "这份合同的主要条款是什么?"
});3. 代码审查助手
const codeReviewPrompt = new PromptTemplate({
template: `请审查以下代码并提供改进建议:
代码:{code}
请关注:
1. 代码质量
2. 安全漏洞
3. 性能问题
4. 最佳实践
提供具体的改进建议:`,
inputVariables: ["code", "language"],
});
const codeReviewChain = new LLMChain({
llm: model,
prompt: codeReviewPrompt,
});
const reviewResult = await codeReviewChain.call({
code: "// 用户提交的代码",
language: "typescript",
});🚀 最佳实践
1. 性能优化
2. 错误处理
3. 安全考虑
📈 LangChain 未来发展
1. 更强的多模态支持
2. 更好的可观察性
3. 更丰富的生态系统
LangChain作为AI应用开发的重要框架,为开发者提供了构建复杂AI系统的强大工具集。通过合理的组件组合和链式调用,可以快速构建出功能丰富、性能优异的AI应用。随着生态系统的不断完善,LangChain将继续在AI应用开发领域发挥重要作用。