1. 引言

随着大语言模型(LLM)技术的快速发展,如何有效地构建基于LLM的应用程序成为了开发者面临的重要挑战。LangChain作为一个专门为此设计的开源框架,为开发者提供了一套完整的工具链,使得构建复杂的AI应用变得更加简单和高效。

2. LangChain概述

2.1 什么是LangChain

LangChain是一个开源框架,专门用于开发由大语言模型(LLM)驱动的应用程序。它提供了一套标准化的接口、工具和端到端的链式调用机制,使开发者能够轻松地将LLM集成到各种应用场景中。

graph TD A[开发者] --> B[LangChain框架] B --> C[大语言模型] B --> D[外部数据源] B --> E[工具集成] C --> F[智能应用] D --> F E --> F

2.2 核心设计理念

LangChain的设计基于以下几个核心理念:

mindmap root((LangChain核心理念)) 模块化设计 独立使用 组合使用 松耦合架构 标准化接口 统一调用方式 多LLM支持 兼容性保证 链式组合 工作流构建 组件串联 复杂任务分解 数据感知 外部数据源 实时数据处理 多格式支持 代理能力 工具交互 环境感知 自主决策

2.3 主要特性

  • 多模型支持:支持OpenAI、Anthropic、Hugging Face等多种LLM
  • 丰富的组件库:提供提示模板、链、代理、记忆等核心组件
  • 灵活的数据处理:支持多种文档格式和数据源
  • 强大的检索能力:集成向量数据库和检索算法
  • 可扩展性:易于添加自定义组件和集成

3. LangChain架构详解

3.1 整体架构

LangChain采用分层架构设计,从底层的模型接口到上层的应用逻辑,形成了一个完整的技术栈:

graph TB subgraph "应用层" A1[智能问答系统] A2[文档分析工具] A3[代码生成器] A4[智能助手] end subgraph "框架层" B1[Chains 链式调用] B2[Agents 智能代理] B3[Memory 记忆管理] B4[Tools 工具集成] end subgraph "组件层" C1[Prompts 提示模板] C2[Document Loaders 文档加载] C3[Text Splitters 文本分割] C4[Embeddings 向量化] C5[Vector Stores 向量存储] C6[Retrievers 检索器] end subgraph "模型层" D1[OpenAI GPT] D2[Anthropic Claude] D3[Hugging Face Models] D4[Local Models] end A1 --> B1 A2 --> B2 A3 --> B3 A4 --> B4 B1 --> C1 B2 --> C2 B3 --> C3 B4 --> C4 C1 --> D1 C2 --> D2 C3 --> D3 C4 --> D4

3.2 核心组件

LangChain的核心组件可以分为以下几个主要类别:

  1. 模型抽象层:统一不同LLM的调用接口
  2. 提示工程:管理和优化提示模板
  3. 链式处理:组合多个步骤形成工作流
  4. 智能代理:实现自主决策和工具调用
  5. 记忆系统:管理对话历史和上下文
  6. 数据处理:处理各种格式的文档和数据
  7. 检索系统:实现高效的信息检索

4. 核心组件深入分析

4.1 Models(模型)

Models是LangChain的基础组件,提供了与各种大语言模型交互的统一接口。

4.1.1 LLM(大语言模型)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain.llms import OpenAI, HuggingFacePipeline
from langchain.chat_models import ChatOpenAI

# OpenAI GPT模型
llm = OpenAI(
    model_name="gpt-3.5-turbo-instruct",
    temperature=0.7,
    max_tokens=1000
)

# 聊天模型
chat_model = ChatOpenAI(
    model_name="gpt-3.5-turbo",
    temperature=0.7
)

# Hugging Face模型
hf_llm = HuggingFacePipeline.from_model_id(
    model_id="microsoft/DialoGPT-medium",
    task="text-generation"
)

4.1.2 模型配置与优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from langchain.llms import OpenAI
from langchain.callbacks import get_openai_callback

# 配置模型参数
llm = OpenAI(
    temperature=0.7,        # 控制输出随机性
    max_tokens=1000,        # 最大输出长度
    top_p=0.9,             # 核采样参数
    frequency_penalty=0.1,  # 频率惩罚
    presence_penalty=0.1    # 存在惩罚
)

# 监控API调用成本
with get_openai_callback() as cb:
    result = llm("解释什么是机器学习")
    print(f"总计tokens: {cb.total_tokens}")
    print(f"总计成本: ${cb.total_cost}")

4.2 Prompts(提示)

Prompts组件负责管理和优化提示模板,是与LLM交互的关键接口。

4.2.1 提示模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain.prompts import PromptTemplate, ChatPromptTemplate
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)

# 基础提示模板
prompt_template = PromptTemplate(
    input_variables=["product", "audience"],
    template="""
    为{product}写一份针对{audience}的营销文案。
    要求:
    1. 突出产品特点
    2. 符合目标受众需求
    3. 语言生动有趣
    
    营销文案:
    """
)

# 聊天提示模板
system_template = "你是一个专业的{role},请根据用户需求提供专业建议。"
system_message_prompt = SystemMessagePromptTemplate.from_template(system_template)

human_template = "我需要关于{topic}的建议,具体情况是:{context}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([
    system_message_prompt,
    human_message_prompt
])

4.2.2 Few-shot提示

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from langchain.prompts import FewShotPromptTemplate

# 定义示例
examples = [
    {
        "question": "什么是Python?",
        "answer": "Python是一种高级编程语言,以其简洁的语法和强大的功能而闻名。"
    },
    {
        "question": "什么是机器学习?",
        "answer": "机器学习是人工智能的一个分支,通过算法让计算机从数据中学习模式。"
    }
]

# 示例模板
example_prompt = PromptTemplate(
    input_variables=["question", "answer"],
    template="问题:{question}\n答案:{answer}"
)

# Few-shot提示模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="以下是一些问答示例:",
    suffix="问题:{input}\n答案:",
    input_variables=["input"]
)

4.3 Chains(链)

Chains是LangChain的核心概念,允许将多个组件链接起来形成复杂的工作流。

4.3.1 基础链类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from langchain.chains import LLMChain, SimpleSequentialChain, SequentialChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0.7)

# LLM链
prompt = PromptTemplate(
    input_variables=["topic"],
    template="写一篇关于{topic}的简短介绍"
)
llm_chain = LLMChain(llm=llm, prompt=prompt)

# 顺序链
first_prompt = PromptTemplate(
    input_variables=["topic"],
    template="为{topic}生成一个创意标题"
)
first_chain = LLMChain(llm=llm, prompt=first_prompt)

second_prompt = PromptTemplate(
    input_variables=["title"],
    template="基于标题'{title}'写一段开头"
)
second_chain = LLMChain(llm=llm, prompt=second_prompt)

sequential_chain = SimpleSequentialChain(
    chains=[first_chain, second_chain],
    verbose=True
)

4.3.2 复杂链组合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from langchain.chains import SequentialChain

# 多输入输出的顺序链
title_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["topic"],
        template="为{topic}生成一个吸引人的标题"
    ),
    output_key="title"
)

content_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["topic", "title"],
        template="基于主题'{topic}'和标题'{title}',写一篇详细的文章"
    ),
    output_key="content"
)

summary_chain = LLMChain(
    llm=llm,
    prompt=PromptTemplate(
        input_variables=["content"],
        template="为以下文章写一个简洁的摘要:\n{content}"
    ),
    output_key="summary"
)

overall_chain = SequentialChain(
    chains=[title_chain, content_chain, summary_chain],
    input_variables=["topic"],
    output_variables=["title", "content", "summary"],
    verbose=True
)

4.4 Agents(代理)

Agents是LangChain中最强大的组件之一,能够根据用户输入自主决策使用哪些工具。

4.4.1 代理类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from langchain.agents import initialize_agent, AgentType
from langchain.tools import DuckDuckGoSearchRun, Tool
from langchain.llms import OpenAI
import requests

llm = OpenAI(temperature=0)

# 定义工具
search = DuckDuckGoSearchRun()

def get_weather(city: str) -> str:
    """获取指定城市的天气信息"""
    # 这里应该调用真实的天气API
    return f"{city}的天气:晴天,温度25°C"

weather_tool = Tool(
    name="Weather",
    description="获取城市天气信息",
    func=get_weather
)

tools = [search, weather_tool]

# 初始化代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

4.4.2 自定义代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain.agents import Tool, AgentExecutor, BaseMultiActionAgent
from langchain.schema import AgentAction, AgentFinish
from typing import List, Union

class CustomAgent(BaseMultiActionAgent):
    """自定义代理实现"""
    
    def plan(self, intermediate_steps, **kwargs) -> Union[List[AgentAction], AgentFinish]:
        """规划下一步行动"""
        user_input = kwargs.get("input", "")
        
        if "天气" in user_input:
            return [AgentAction(
                tool="Weather",
                tool_input=user_input,
                log="用户询问天气,使用天气工具"
            )]
        elif "搜索" in user_input:
            return [AgentAction(
                tool="Search",
                tool_input=user_input,
                log="用户需要搜索,使用搜索工具"
            )]
        else:
            return AgentFinish(
                return_values={"output": "我不确定如何处理这个请求"},
                log="无法确定合适的工具"
            )
    
    @property
    def input_keys(self):
        return ["input"]

4.5 Memory(记忆)

Memory组件负责管理对话历史和上下文信息,使AI应用能够保持连贯的对话。

4.5.1 记忆类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from langchain.memory import (
    ConversationBufferMemory,
    ConversationBufferWindowMemory,
    ConversationSummaryMemory,
    ConversationSummaryBufferMemory
)
from langchain.chains import ConversationChain

llm = OpenAI(temperature=0)

# 缓冲记忆 - 保存所有对话历史
buffer_memory = ConversationBufferMemory()

# 窗口记忆 - 只保存最近k轮对话
window_memory = ConversationBufferWindowMemory(k=5)

# 摘要记忆 - 对历史对话进行摘要
summary_memory = ConversationSummaryMemory(llm=llm)

# 摘要缓冲记忆 - 结合摘要和缓冲
summary_buffer_memory = ConversationSummaryBufferMemory(
    llm=llm,
    max_token_limit=100
)

# 使用记忆的对话链
conversation = ConversationChain(
    llm=llm,
    memory=buffer_memory,
    verbose=True
)

4.5.2 自定义记忆

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from langchain.memory.chat_memory import BaseChatMemory
from langchain.schema import BaseMessage, HumanMessage, AIMessage

class CustomMemory(BaseChatMemory):
    """自定义记忆实现"""
    
    def __init__(self, max_messages: int = 10):
        super().__init__()
        self.max_messages = max_messages
        self.messages = []
    
    def save_context(self, inputs: dict, outputs: dict):
        """保存对话上下文"""
        human_message = HumanMessage(content=inputs.get("input", ""))
        ai_message = AIMessage(content=outputs.get("output", ""))
        
        self.messages.extend([human_message, ai_message])
        
        # 保持消息数量在限制内
        if len(self.messages) > self.max_messages:
            self.messages = self.messages[-self.max_messages:]
    
    def clear(self):
        """清空记忆"""
        self.messages = []

4.6 Document Loaders(文档加载器)

Document Loaders负责从各种数据源加载和处理文档。

4.6.1 常用文档加载器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain.document_loaders import (
    TextLoader,
    PyPDFLoader,
    CSVLoader,
    UnstructuredHTMLLoader,
    DirectoryLoader,
    WebBaseLoader
)

# 文本文件加载器
text_loader = TextLoader("document.txt")
text_docs = text_loader.load()

# PDF加载器
pdf_loader = PyPDFLoader("document.pdf")
pdf_docs = pdf_loader.load()

# CSV加载器
csv_loader = CSVLoader("data.csv")
csv_docs = csv_loader.load()

# 网页加载器
web_loader = WebBaseLoader("https://example.com")
web_docs = web_loader.load()

# 目录加载器
directory_loader = DirectoryLoader(
    "documents/",
    glob="**/*.txt",
    loader_cls=TextLoader
)
directory_docs = directory_loader.load()

4.6.2 自定义文档加载器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from langchain.document_loaders.base import BaseLoader
from langchain.schema import Document
import json

class JSONLoader(BaseLoader):
    """自定义JSON文档加载器"""
    
    def __init__(self, file_path: str, content_key: str = "content"):
        self.file_path = file_path
        self.content_key = content_key
    
    def load(self) -> List[Document]:
        """加载JSON文档"""
        documents = []
        
        with open(self.file_path, 'r', encoding='utf-8') as file:
            data = json.load(file)
            
            if isinstance(data, list):
                for item in data:
                    content = item.get(self.content_key, "")
                    metadata = {k: v for k, v in item.items() if k != self.content_key}
                    documents.append(Document(page_content=content, metadata=metadata))
            else:
                content = data.get(self.content_key, "")
                metadata = {k: v for k, v in data.items() if k != self.content_key}
                documents.append(Document(page_content=content, metadata=metadata))
        
        return documents

4.7 Vector Stores(向量存储)

Vector Stores用于存储和检索文档的向量表示,是实现语义搜索的关键组件。

4.7.1 向量存储实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from langchain.vectorstores import Chroma, FAISS, Pinecone
from langchain.embeddings import OpenAIEmbeddings, HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter

# 初始化嵌入模型
embeddings = OpenAIEmbeddings()
# 或使用开源嵌入模型
# embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")

# 文档分割
text_splitter = CharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
texts = text_splitter.split_documents(documents)

# Chroma向量存储
chroma_db = Chroma.from_documents(
    documents=texts,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# FAISS向量存储
faiss_db = FAISS.from_documents(
    documents=texts,
    embedding=embeddings
)

# 保存和加载FAISS索引
faiss_db.save_local("faiss_index")
loaded_faiss_db = FAISS.load_local("faiss_index", embeddings)

4.7.2 向量检索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 相似性搜索
query = "什么是机器学习?"
similar_docs = chroma_db.similarity_search(query, k=3)

# 带分数的相似性搜索
similar_docs_with_scores = chroma_db.similarity_search_with_score(query, k=3)

# 最大边际相关性搜索
mmr_docs = chroma_db.max_marginal_relevance_search(query, k=3)

# 自定义过滤器
filtered_docs = chroma_db.similarity_search(
    query,
    k=3,
    filter={"source": "document.pdf"}
)

4.8 Retrievers(检索器)

Retrievers提供了更高级的检索接口,支持多种检索策略。

4.8.1 基础检索器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from langchain.retrievers import (
    VectorStoreRetriever,
    BM25Retriever,
    EnsembleRetriever
)

# 向量存储检索器
vector_retriever = VectorStoreRetriever(
    vectorstore=chroma_db,
    search_kwargs={"k": 5}
)

# BM25检索器(基于关键词)
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 5

# 集成检索器(结合多种检索方法)
ensemble_retriever = EnsembleRetriever(
    retrievers=[vector_retriever, bm25_retriever],
    weights=[0.7, 0.3]
)

4.8.2 自定义检索器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from langchain.retrievers.base import BaseRetriever
from langchain.schema import Document
from typing import List

class CustomRetriever(BaseRetriever):
    """自定义检索器"""
    
    def __init__(self, documents: List[Document]):
        self.documents = documents
    
    def get_relevant_documents(self, query: str) -> List[Document]:
        """获取相关文档"""
        # 实现自定义检索逻辑
        relevant_docs = []
        query_lower = query.lower()
        
        for doc in self.documents:
            if query_lower in doc.page_content.lower():
                relevant_docs.append(doc)
        
        return relevant_docs[:5]  # 返回前5个相关文档
    
    async def aget_relevant_documents(self, query: str) -> List[Document]:
        """异步获取相关文档"""
        return self.get_relevant_documents(query)

5. 实际应用场景

5.1 问答系统

构建基于文档的智能问答系统:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 构建问答系统
def build_qa_system(documents):
    # 创建向量存储
    embeddings = OpenAIEmbeddings()
    vectorstore = Chroma.from_documents(documents, embeddings)
    
    # 创建检索器
    retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
    
    # 创建问答链
    qa_chain = RetrievalQA.from_chain_type(
        llm=OpenAI(temperature=0),
        chain_type="stuff",
        retriever=retriever,
        return_source_documents=True
    )
    
    return qa_chain

# 使用问答系统
qa_system = build_qa_system(documents)
result = qa_system({"query": "什么是深度学习?"})
print(f"答案: {result['result']}")
print(f"来源: {result['source_documents']}")

5.2 文档分析

实现智能文档分析和摘要:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from langchain.chains.summarize import load_summarize_chain
from langchain.chains import AnalyzeDocumentChain

def analyze_document(document_path):
    # 加载文档
    loader = PyPDFLoader(document_path)
    documents = loader.load()
    
    # 创建摘要链
    summarize_chain = load_summarize_chain(
        llm=OpenAI(temperature=0),
        chain_type="map_reduce"
    )
    
    # 创建文档分析链
    analyze_chain = AnalyzeDocumentChain(
        combine_docs_chain=summarize_chain
    )
    
    # 分析文档
    summary = analyze_chain.run(documents)
    return summary

# 使用文档分析
summary = analyze_document("research_paper.pdf")
print(f"文档摘要: {summary}")

5.3 代码生成

构建智能代码生成助手:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

def create_code_generator():
    prompt_template = PromptTemplate(
        input_variables=["language", "description", "requirements"],
        template="""
        请用{language}编写代码来实现以下功能:
        
        功能描述:{description}
        
        具体要求:
        {requirements}
        
        请提供完整的、可运行的代码,并包含必要的注释。
        
        代码:
        ```{language}
        """
    )
    
    code_chain = LLMChain(
        llm=OpenAI(temperature=0.3),
        prompt=prompt_template
    )
    
    return code_chain

# 使用代码生成器
code_generator = create_code_generator()
result = code_generator.run({
    "language": "Python",
    "description": "实现一个简单的计算器",
    "requirements": "支持加减乘除运算,包含错误处理"
})
print(result)

5.4 智能助手

构建多功能智能助手:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
import requests
import json

def create_smart_assistant():
    # 定义工具
    def search_web(query: str) -> str:
        """搜索网络信息"""
        # 实现网络搜索逻辑
        return f"搜索结果:{query}"
    
    def calculate(expression: str) -> str:
        """计算数学表达式"""
        try:
            result = eval(expression)
            return f"计算结果:{result}"
        except:
            return "计算错误,请检查表达式"
    
    def get_weather(city: str) -> str:
        """获取天气信息"""
        # 实现天气查询逻辑
        return f"{city}的天气:晴天,25°C"
    
    tools = [
        Tool(name="Search", description="搜索网络信息", func=search_web),
        Tool(name="Calculator", description="计算数学表达式", func=calculate),
        Tool(name="Weather", description="获取天气信息", func=get_weather)
    ]
    
    # 创建代理
    assistant = initialize_agent(
        tools=tools,
        llm=OpenAI(temperature=0),
        agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
        verbose=True
    )
    
    return assistant

# 使用智能助手
assistant = create_smart_assistant()
response = assistant.run("北京的天气怎么样?")
print(response)

6. 开发实践指南

6.1 环境搭建

6.1.1 安装依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 基础安装
pip install langchain

# 安装特定集成
pip install langchain[openai]  # OpenAI集成
pip install langchain[anthropic]  # Anthropic集成
pip install langchain[huggingface]  # Hugging Face集成

# 安装向量存储依赖
pip install chromadb  # Chroma
pip install faiss-cpu  # FAISS
pip install pinecone-client  # Pinecone

# 安装文档处理依赖
pip install pypdf  # PDF处理
pip install unstructured  # 非结构化文档
pip install beautifulsoup4  # HTML处理

6.1.2 环境配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import os
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

# 设置API密钥
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-api-key"
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "your-huggingface-token"

# 设置代理(如果需要)
os.environ["HTTP_PROXY"] = "http://proxy.example.com:8080"
os.environ["HTTPS_PROXY"] = "https://proxy.example.com:8080"

6.2 基础使用示例

6.2.1 简单的LLM调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from langchain.llms import OpenAI

# 初始化模型
llm = OpenAI(temperature=0.7)

# 简单调用
response = llm("解释什么是人工智能")
print(response)

# 批量调用
questions = [
    "什么是机器学习?",
    "什么是深度学习?",
    "什么是神经网络?"
]
responses = llm.generate(questions)
for response in responses.generations:
    print(response[0].text)

6.2.2 使用提示模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 创建提示模板
prompt = PromptTemplate(
    input_variables=["topic", "audience"],
    template="为{audience}解释{topic},要求通俗易懂"
)

# 创建链
chain = LLMChain(llm=llm, prompt=prompt)

# 执行链
result = chain.run(topic="量子计算", audience="中学生")
print(result)

6.3 高级应用开发

6.3.1 构建RAG系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

def build_rag_system(data_directory: str):
    # 1. 加载文档
    loader = DirectoryLoader(data_directory, glob="**/*.txt")
    documents = loader.load()
    
    # 2. 分割文档
    text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=1000,
        chunk_overlap=200
    )
    texts = text_splitter.split_documents(documents)
    
    # 3. 创建向量存储
    embeddings = OpenAIEmbeddings()
    vectorstore = Chroma.from_documents(texts, embeddings)
    
    # 4. 创建检索器
    retriever = vectorstore.as_retriever(
        search_type="similarity",
        search_kwargs={"k": 3}
    )
    
    # 5. 创建QA链
    qa_chain = RetrievalQA.from_chain_type(
        llm=OpenAI(temperature=0),
        chain_type="stuff",
        retriever=retriever,
        return_source_documents=True
    )
    
    return qa_chain

# 使用RAG系统
rag_system = build_rag_system("./documents")
result = rag_system({"query": "如何优化机器学习模型?"})

6.3.2 构建对话系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from langchain.memory import ConversationBufferWindowMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate

def build_conversation_system():
    # 自定义对话提示
    template = """
    你是一个友好的AI助手,请根据对话历史和用户输入提供有帮助的回答。
    
    对话历史:
    {history}
    
    用户: {input}
    助手:"""
    
    prompt = PromptTemplate(
        input_variables=["history", "input"],
        template=template
    )
    
    # 创建记忆
    memory = ConversationBufferWindowMemory(k=5)
    
    # 创建对话链
    conversation = ConversationChain(
        llm=OpenAI(temperature=0.7),
        prompt=prompt,
        memory=memory,
        verbose=True
    )
    
    return conversation

# 使用对话系统
conversation_system = build_conversation_system()

# 多轮对话
print(conversation_system.predict(input="你好,我想了解机器学习"))
print(conversation_system.predict(input="能给我推荐一些学习资源吗?"))
print(conversation_system.predict(input="我应该从哪里开始学习?"))

7. 最佳实践

7.1 性能优化

7.1.1 缓存策略

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from langchain.cache import InMemoryCache, SQLiteCache
from langchain.globals import set_llm_cache
import langchain

# 内存缓存
set_llm_cache(InMemoryCache())

# SQLite缓存
set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# 使用缓存
llm = OpenAI(temperature=0)
result1 = llm("什么是机器学习?")  # 第一次调用API
result2 = llm("什么是机器学习?")  # 从缓存获取

7.1.2 批处理优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from langchain.llms import OpenAI
from langchain.schema import LLMResult

# 批量处理
llm = OpenAI(temperature=0)
prompts = [
    "解释机器学习",
    "解释深度学习",
    "解释神经网络"
]

# 批量调用比单独调用更高效
batch_result = llm.generate(prompts)

7.1.3 异步处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import asyncio
from langchain.llms import OpenAI

async def async_llm_call():
    llm = OpenAI(temperature=0)
    
    # 异步调用
    tasks = [
        llm.agenerate(["什么是AI?"]),
        llm.agenerate(["什么是ML?"]),
        llm.agenerate(["什么是DL?"])
    ]
    
    results = await asyncio.gather(*tasks)
    return results

# 运行异步任务
results = asyncio.run(async_llm_call())

7.2 错误处理

7.2.1 重试机制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from langchain.llms import OpenAI
from tenacity import retry, stop_after_attempt, wait_exponential
import logging

@retry(
    stop=stop_after_attempt(3),
    wait=wait_exponential(multiplier=1, min=4, max=10)
)
def robust_llm_call(prompt: str):
    try:
        llm = OpenAI(temperature=0)
        return llm(prompt)
    except Exception as e:
        logging.error(f"LLM调用失败: {e}")
        raise

# 使用重试机制
try:
    result = robust_llm_call("解释量子计算")
    print(result)
except Exception as e:
    print(f"最终失败: {e}")

7.2.2 异常处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
from langchain.llms import OpenAI
from langchain.schema import OutputParserException

def safe_llm_chain(prompt: str):
    try:
        llm = OpenAI(temperature=0)
        result = llm(prompt)
        return {"success": True, "result": result}
    except OutputParserException as e:
        return {"success": False, "error": f"输出解析错误: {e}"}
    except Exception as e:
        return {"success": False, "error": f"未知错误: {e}"}

# 安全调用
response = safe_llm_chain("解释机器学习")
if response["success"]:
    print(response["result"])
else:
    print(f"错误: {response['error']}")

7.3 安全考虑

7.3.1 输入验证

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import re
from typing import Optional

def validate_input(user_input: str) -> Optional[str]:
    """验证用户输入"""
    # 检查输入长度
    if len(user_input) > 1000:
        return "输入过长"
    
    # 检查恶意内容
    malicious_patterns = [
        r"<script.*?>.*?</script>",
        r"javascript:",
        r"on\w+\s*=",
    ]
    
    for pattern in malicious_patterns:
        if re.search(pattern, user_input, re.IGNORECASE):
            return "检测到潜在恶意内容"
    
    return None

def safe_process_input(user_input: str):
    # 验证输入
    error = validate_input(user_input)
    if error:
        return f"输入验证失败: {error}"
    
    # 处理输入
    llm = OpenAI(temperature=0)
    return llm(user_input)

7.3.2 API密钥管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import os
from cryptography.fernet import Fernet

class SecureConfig:
    """安全配置管理"""
    
    def __init__(self):
        self.key = os.environ.get("ENCRYPTION_KEY")
        if not self.key:
            self.key = Fernet.generate_key()
        self.cipher = Fernet(self.key)
    
    def encrypt_api_key(self, api_key: str) -> str:
        """加密API密钥"""
        return self.cipher.encrypt(api_key.encode()).decode()
    
    def decrypt_api_key(self, encrypted_key: str) -> str:
        """解密API密钥"""
        return self.cipher.decrypt(encrypted_key.encode()).decode()

# 使用安全配置
config = SecureConfig()
encrypted_key = config.encrypt_api_key("your-api-key")
decrypted_key = config.decrypt_api_key(encrypted_key)

8. 生态系统与集成

8.1 第三方集成

8.1.1 数据库集成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from langchain.vectorstores import Pinecone, Weaviate
from langchain.document_loaders import MongoDBLoader
import pinecone

# Pinecone集成
pinecone.init(
    api_key="your-pinecone-api-key",
    environment="your-environment"
)

pinecone_store = Pinecone.from_documents(
    documents,
    embeddings,
    index_name="langchain-index"
)

# MongoDB集成
mongo_loader = MongoDBLoader(
    connection_string="mongodb://localhost:27017/",
    db_name="your_db",
    collection_name="your_collection"
)
mongo_docs = mongo_loader.load()

8.1.2 Web框架集成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from flask import Flask, request, jsonify
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

app = Flask(__name__)

# 初始化对话系统
memory = ConversationBufferMemory()
conversation = ConversationChain(
    llm=OpenAI(temperature=0.7),
    memory=memory
)

@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('message')
    response = conversation.predict(input=user_input)
    return jsonify({'response': response})

if __name__ == '__main__':
    app.run(debug=True)

8.2 社区资源

8.2.1 有用的工具和库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# LangSmith - 调试和监控
from langsmith import Client

client = Client()

# LangServe - 部署LangChain应用
from langserve import add_routes
from fastapi import FastAPI

app = FastAPI()
add_routes(app, conversation, path="/chat")

# LangGraph - 构建复杂的工作流
from langgraph import Graph

graph = Graph()
graph.add_node("start", lambda x: x)
graph.add_node("process", lambda x: process_data(x))
graph.add_edge("start", "process")

9. 未来发展趋势

9.1 应用场景

mindmap root((LangChain未来应用)) 企业级应用 智能客服 文档管理 知识库问答 业务流程自动化 教育领域 个性化学习 智能辅导 自动评分 课程推荐 创意产业 内容生成 创意写作 设计辅助 音乐创作 科研领域 文献分析 实验设计 数据解释 假设生成