LangChain模板应用解析:从聊天机器人到数据分析

LangChain模板应用解析:从聊天机器人到数据分析

本文深入解析了LangChain框架的核心模板应用,涵盖了从智能聊天机器人、SQL查询与数据分析到文档处理与信息提取的完整技术栈。文章详细介绍了各个模块的架构设计、核心组件实现、高级功能特性以及实际应用场景,为开发者提供了从基础到高级的完整解决方案指南。

聊天机器人模板实现

LangChain提供了强大的聊天机器人模板实现,让开发者能够快速构建智能对话系统。这些模板基于LangChain Expression Language (LCEL) 构建,提供了高度模块化和可定制的架构。

核心架构设计

LangChain的聊天机器人模板采用分层架构,主要包含以下核心组件:

mermaid

关键组件详解

1. 对话历史管理

LangChain使用BaseChatMessageHistory抽象类来管理对话历史,支持多种存储后端:

from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.messages import HumanMessage, AIMessage

class InMemoryChatMessageHistory(BaseChatMessageHistory):
    """内存中的对话历史实现"""
    def __init__(self):
        self.messages = []
    
    def add_message(self, message: BaseMessage) -> None:
        self.messages.append(message)
    
    def clear(self) -> None:
        self.messages = []
2. 提示词模板系统

聊天机器人使用动态提示词模板,支持上下文感知的对话生成:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

chat_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手,说话像海盗一样"),
    MessagesPlaceholder(variable_name="chat_history"),
    ("user", "{input}")
])
3. 语言模型集成

支持多种语言模型的无缝集成:

from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

model = ChatOpenAI(temperature=0.7)
output_parser = StrOutputParser()

完整聊天链实现

下面是基于LCEL的完整聊天机器人实现:

from typing import List, Optional
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_models import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import Runnable
from langchain_core.pydantic_v1 import BaseModel, Field

class ChatInput(BaseModel):
    """聊天输入模型"""
    chat_history: Optional[List[BaseMessage]] = Field(
        description="之前的聊天消息"
    )
    input: str = Field(..., description="用户的最新查询")

def format_chat_history(input_dict: dict) -> dict:
    """格式化聊天历史"""
    messages = input_dict.get("chat_history") or []
    return {
        "chat_history": messages,
        "input": input_dict["input"]
    }

# 构建聊天链
chat_chain = (
    format_chat_history
    | chat_prompt
    | model
    | output_parser
)

高级功能:自动评估系统

LangChain提供了先进的聊天机器人评估系统,无需显式用户反馈:

from langsmith.evaluation import EvaluationResult, RunEvaluator

class ResponseEffectivenessEvaluator(RunEvaluator):
    """基于后续用户响应评估聊天机器人效果"""
    
    def evaluate_run(self, run: Run, example: Optional[Example] = None) -> EvaluationResult:
        # 分析用户后续响应来评估之前AI回复的效果
        if not run.inputs.get("chat_history"):
            return EvaluationResult(
                key="response_effectiveness", 
                comment="无聊天历史"
            )
        
        # 使用LLM进行自动评估
        evaluation = self.evaluator_runnable.invoke(run.inputs)
        return EvaluationResult(**evaluation)

部署与集成

LangServe部署

通过LangServe可以轻松部署聊天机器人API:

from fastapi import FastAPI
from langserve import add_routes

app = FastAPI()
add_routes(app, chat_chain, path="/chatbot")
客户端调用
from langserve.client import RemoteRunnable

chatbot = RemoteRunnable("http://localhost:8000/chatbot")
response = chatbot.invoke({
    "input": "你好,你能帮我什么?",
    "chat_history": []
})

配置参数详解

参数类型默认值描述
temperaturefloat0.7生成创造性,0-1之间
max_tokensint1024最大生成token数
chat_history_limitint10保留的对话历史条数
streamingboolFalse是否启用流式响应

性能优化策略

  1. 对话历史修剪:自动移除过时的对话内容
  2. 缓存机制:对常见问题使用缓存响应
  3. 批量处理:支持多个对话的同时处理
  4. 异步支持:全链路异步操作支持
# 异步聊天链实现
async def async_chat_chain(input_data: ChatInput) -> str:
    """异步聊天处理"""
    result = await chat_chain.ainvoke(input_data.dict())
    return result

错误处理与监控

完善的错误处理机制确保聊天机器人的稳定性:

from langchain.callbacks import tracing_v2_enabled

def safe_chat_invoke(input_data: dict):
    """安全的聊天调用"""
    try:
        with tracing_v2_enabled() as callback:
            result = chat_chain.invoke(input_data)
            return result, callback.latest_run.id
    except Exception as e:
        # 记录错误并返回友好提示
        logger.error(f"Chat invocation failed: {e}")
        return "抱歉,我遇到了一些问题,请稍后再试。", None

这个聊天机器人模板实现展示了LangChain在构建生产级对话系统方面的强大能力,结合了现代LLM技术、灵活的架构设计和企业级的监控评估体系。

SQL查询与数据分析应用

在现代数据驱动的应用开发中,SQL数据库查询与数据分析是LangChain框架的核心能力之一。通过将大型语言模型与SQL数据库无缝集成,LangChain为开发者提供了强大的自然语言到SQL查询转换能力,使得非技术用户也能通过自然语言与数据库进行交互。

核心架构与组件

LangChain的SQL查询功能建立在几个关键组件之上:

SQLDatabase 类:作为数据库连接的抽象层,支持多种数据库方言(SQLite、PostgreSQL、MySQL等),提供表结构信息获取、查询执行等基础功能。

from langchain_community.utilities import SQLDatabase

# 连接SQLite数据库
db = SQLDatabase.from_uri("sqlite:///nba_roster.db", sample_rows_in_table_info=2)

# 获取表结构信息
schema = db.get_table_info()
print(schema)

SQLDatabaseToolkit:工具包封装了常用的数据库操作工具,包括:

  • ListSQLDatabaseTool:列出数据库中的表
  • InfoSQLDatabaseTool:获取表的详细结构和示例数据
  • QuerySQLDataBaseTool:执行SQL查询
  • QuerySQLCheckerTool:检查SQL查询语法
from langchain_community.agent_toolkits import SQLDatabaseToolkit
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)
toolkit = SQLDatabaseToolkit(db=db, llm=llm)
tools = toolkit.get_tools()

自然语言到SQL查询转换

LangChain通过精心设计的提示模板实现自然语言到SQL的转换:

from langchain_core.prompts import ChatPromptTemplate

sql_prompt_template = """Based on the table schema below, write a SQL query that would answer the user's question:
{schema}

Question: {question}
SQL Query:"""

prompt = ChatPromptTemplate.from_messages([
    ("system", "Given an input question, convert it to a SQL query. No pre-amble."),
    ("human", sql_prompt_template)
])

完整的SQL查询工作流

LangChain提供了完整的端到端SQL查询解决方案:

mermaid

实际应用示例

基础查询示例

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

sql_chain = (
    RunnablePassthrough.assign(schema=lambda x: db.get_table_info())
    | prompt
    | llm.bind(stop=["\nSQLResult:"])
    | StrOutputParser()
)

# 执行自然语言查询
question = "What team is Klay Thompson on?"
sql_query = sql_chain.invoke({"question": question})
print(f"生成的SQL: {sql_query}")

# 执行查询并获取结果
result = db.run(sql_query)
print(f"查询结果: {result}")

带结果解释的完整链

response_template = """Based on the table schema below, question, sql query, and sql response, write a natural language response:
{schema}

Question: {question}
SQL Query: {query}
SQL Response: {response}"""

full_chain = (
    RunnablePassthrough.assign(query=sql_chain)
    | RunnablePassthrough.assign(
        schema=lambda x: db.get_table_info(),
        response=lambda x: db.run(x["query"])
    )
    | ChatPromptTemplate.from_template(response_template)
    | llm
)

response = full_chain.invoke({"question": "How many unique teams are there?"})
print(response.content)

高级功能:SQL代理

对于复杂的多步查询,LangChain提供了SQL代理功能:

from langchain_community.agent_toolkits import create_sql_agent

agent = create_sql_agent(
    llm=llm,
    db=db,
    agent_type="tool-calling",
    verbose=True
)

# 执行复杂查询
result = agent.invoke("找出平均得分最高的前3个球队")
print(result["output"])

支持的数据库类型

LangChain支持多种主流数据库系统:

数据库类型连接字符串示例特性支持
SQLitesqlite:///database.db完全支持
PostgreSQLpostgresql://user:pass@host:port/db完全支持
MySQLmysql://user:pass@host:port/db完全支持
Microsoft SQL Servermssql+pyodbc://...基本支持
Oracleoracle://user:pass@host:port/db基本支持

性能优化与最佳实践

  1. 表结构缓存:合理设置 sample_rows_in_table_info 参数,避免每次查询都获取大量示例数据
  2. 查询限制:在提示模板中加入 LIMIT 子句限制,防止返回过多数据
  3. 错误处理:实现查询语法检查和重试机制
  4. 安全性:避免执行DML操作(INSERT/UPDATE/DELETE)
# 安全配置示例
db = SQLDatabase.from_uri(
    "sqlite:///database.db",
    sample_rows_in_table_info=3,  # 限制示例行数
    include_tables=["allowed_table"]  # 限制可访问的表
)

实际业务场景应用

电商数据分析

# 分析销售数据
question = "显示2023年每个月的总销售额,按月份排序"
result = full_chain.invoke({"question": question})

# 客户行为分析  
question = "找出购买频率最高的前10位客户及其购买次数"
result = full_chain.invoke({"question": question})

金融报表查询

# 财务指标计算
question = "计算每个季度的营收同比增长率"
result = full_chain.invoke({"question": question})

# 风险指标监控
question = "显示逾期超过30天的借款金额和笔数"
result = full_chain.invoke({"question": question})

通过LangChain的SQL查询能力,企业可以构建智能的数据查询界面,让业务人员能够用自然语言直接与数据库交互,大大降低了数据访问的技术门槛,提高了数据分析的效率和 accessibility。

文档处理与信息提取

在现代AI应用中,文档处理和信息提取是构建智能系统的核心环节。LangChain提供了强大的工具链来处理各种格式的文档,并从非结构化文本中提取结构化信息,为后续的分析和应用奠定基础。

文档加载器生态系统

LangChain拥有丰富的文档加载器生态系统,支持从多种来源加载文档:

文档类型加载器类主要功能
PDF文档UnstructuredPDFLoader解析PDF文本和表格
网页内容WebBaseLoader, RecursiveUrlLoader抓取和解析网页
文本文件TextLoader, DirectoryLoader加载本地文本文件
数据库SQLDatabaseLoader从数据库查询结果创建文档
API数据各种API加载器从REST API获取数据

文档加载器的核心抽象是BaseLoader类,它定义了统一的接口:

from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document

class CustomLoader(BaseLoader):
    def lazy_load(self) -> Iterator[Document]:
        # 实现懒加载逻辑
        yield Document(page_content="内容", metadata={"source": "来源"})

半结构化文档处理

对于包含表格和文本混合的PDF文档,LangChain使用Unstructured库进行智能解析:

from unstructured.partition.pdf import partition_pdf

# 解析PDF文档,提取文本和表格
raw_pdf_elements = partition_pdf(
    filename="document.pdf",
    extract_images_in_pdf=False,
    infer_table_structure=True,
    chunking_strategy="by_title",
    max_characters=4000,
)

# 分类处理不同元素
tables = []
texts = []
for element in raw_pdf_elements:
    if "Table" in str(type(element)):
        tables.append(str(element))
    elif "CompositeElement" in str(type(element)):
        texts.append(str(element))

信息提取技术

LangChain提供了多种信息提取方法,从简单的文本提取到复杂的结构化数据抽取:

基于Pydantic的结构化提取
from typing import List, Optional
from langchain.chains.openai_tools import create_extraction_chain_pydantic
from langchain_core.pydantic_v1 import BaseModel

# 定义提取模式
class Person(BaseModel):
    """人员信息"""
    name: str
    age: Optional[int] = None
    occupation: Optional[str] = None

class Company(BaseModel):
    """公司信息"""
    name: str
    industry: Optional[str] = None

# 创建提取链
extraction_chain = create_extraction_chain_pydantic([Person, Company], llm)

# 执行提取
result = extraction_chain.invoke({
    "input": "张三今年28岁,是腾讯的软件工程师。李四25岁,在阿里巴巴做数据分析。"
})
OpenAI函数调用提取

利用OpenAI的函数调用能力进行精准信息提取:

from langchain.utils.openai_functions import convert_pydantic_to_openai_function

# 转换Pydantic模型为OpenAI函数
function = [convert_pydantic_to_openai_function(Person)]

# 绑定函数到模型
model_with_functions = llm.bind(functions=function, function_call={"name": "Person"})

# 构建提取流水线
extraction_pipeline = (
    prompt | model_with_functions | json_parser
)

多模态文档处理

对于包含图像和文本的复杂文档,LangChain支持多模态处理:

mermaid

文档分块策略

有效的文档分块是信息提取的关键,LangChain提供多种分块策略:

from langchain_text_splitters import (
    RecursiveCharacterTextSplitter,
    TokenTextSplitter,
    SemanticChunker
)

# 递归字符分块
recursive_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", " ", ""]
)

# 语义分块
semantic_splitter = SemanticChunker(
    embeddings=embeddings,
    breakpoint_threshold_type="percentile",
    breakpoint_threshold_amount=90
)

# 处理文档
documents = loader.load()
chunks = recursive_splitter.split_documents(documents)

实时信息提取管道

构建端到端的信息提取管道:

sequenceDiagram
    participant User
    participant Loader
    participant Splitter
    participant Extractor
    participant LLM
    participant Output

    User->>Loader: 提供文档源
    Loader->>Splitter: 加载并传递文档
    Splitter->>Extractor: 分块处理
    Extractor->>LLM: 发送提取请求
    LLM->>Extractor: 返回结构化数据
    Extractor->>

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值