当前位置: 首页 > news >正文

LangChain实战(二十三):性能优化与生产环境最佳实践

本文是《LangChain实战课》系列的第二十三篇,将深入探讨LangChain应用在生产环境中需要考虑的各种关键问题,包括性能优化、错误处理、成本控制、监控日志等,帮助你构建稳定高效的AI应用系统。

一、前言

在前面的文章中,我们学习了如何使用LangChain构建各种AI应用并将其部署为API服务。然而,将应用从开发环境迁移到生产环境需要考虑更多因素:性能、稳定性、成本、可观测性等。本文将分享在生产环境中运行LangChain应用的最佳实践和优化策略。

二、缓存策略优化

1. 请求级别缓存

from langchain.cache import SQLiteCache, RedisCache
import langchain
import sqlite3# 使用SQLite缓存
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")# 或者使用Redis缓存(推荐用于生产环境)
from redis import Redis
langchain.llm_cache = RedisCache(redis_=Redis(host='localhost', port=6379))# 自定义缓存策略
from langchain.cache import BaseCache
from typing import Optional, Any
import hashlib
import jsonclass CustomCache(BaseCache):def __init__(self):self.cache = {}def lookup(self, prompt: str, llm_string: str) -> Optional[Any]:key = self._generate_key(prompt, llm_string)return self.cache.get(key)def update(self, prompt: str, llm_string: str, return_val: Any) -> None:key = self._generate_key(prompt, llm_string)self.cache[key] = return_valdef _generate_key(self, prompt: str, llm_string: str) -> str:return hashlib.md5(f"{prompt}{llm_string}".encode()).hexdigest()# 使用自定义缓存
langchain.llm_cache = CustomCache()

2. 语义缓存

from langchain.globals import set_llm_cache
from langchain.cache import SemanticCache
from langchain.embeddings import OpenAIEmbeddings# 基于语义相似度的缓存
set_llm_cache(SemanticCache(embedding=OpenAIEmbeddings(),similarity_threshold=0.8  # 相似度阈值)
)

3. 向量存储缓存

from langchain.storage import LocalFileStore
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.cache import SQLiteCache# 创建基于向量存储的缓存系统
store = LocalFileStore("./cache/")
embeddings = OpenAIEmbeddings()# 在链中显式使用缓存
from langchain.chains import LLMChain
from langchain.callbacks import ManagerCallbackHandlerclass CachedChain:def __init__(self, chain):self.chain = chainself.cache = {}async def arun(self, input_dict, **kwargs):cache_key = self._generate_cache_key(input_dict)if cache_key in self.cache:return self.cache[cache_key]result = await self.chain.arun(input_dict, **kwargs)self.cache[cache_key] = resultreturn resultdef _generate_cache_key(self, input_dict):import jsonreturn hashlib.md5(json.dumps(input_dict, sort_keys=True).encode()).hexdigest()

三、异步处理优化

1. 异步链设计

import asyncio
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chat_models import ChatOpenAIclass AsyncChainProcessor:def __init__(self, max_concurrent=10):self.semaphore = asyncio.Semaphore(max_concurrent)async def process_batch(self, inputs):"""批量处理输入,控制并发数"""tasks = []for input_data in inputs:task = self._process_single(input_data)tasks.append(task)results = await asyncio.gather(*tasks, return_exceptions=True)return resultsasync def _process_single(self, input_data):"""处理单个输入,带有信号量控制"""async with self.semaphore:try:# 模拟异步处理await asyncio.sleep(0.1

文章转载自:

http://OqrvAfDb.ygztf.cn
http://iMw9qtjK.ygztf.cn
http://5eqTKhdf.ygztf.cn
http://AiLIajuf.ygztf.cn
http://4bdXFM9B.ygztf.cn
http://hZVCcEqV.ygztf.cn
http://OnEpkzwx.ygztf.cn
http://eTswVy4z.ygztf.cn
http://6CWGfWls.ygztf.cn
http://arHsegQa.ygztf.cn
http://K2N1xo9I.ygztf.cn
http://qEeSORCa.ygztf.cn
http://uRHwSjvv.ygztf.cn
http://EpwGYf73.ygztf.cn
http://cYDDfX6H.ygztf.cn
http://1RLwXaWO.ygztf.cn
http://TbC7aBlr.ygztf.cn
http://syAAh4LB.ygztf.cn
http://Pm6zeG1z.ygztf.cn
http://lmyo3dbY.ygztf.cn
http://9aZTwwyl.ygztf.cn
http://eJqylAev.ygztf.cn
http://PttLRAyy.ygztf.cn
http://mmHHnbr9.ygztf.cn
http://m8xHuNCd.ygztf.cn
http://9x0iIbsy.ygztf.cn
http://uCGLlZCZ.ygztf.cn
http://CWPZf3hK.ygztf.cn
http://QhpPpaKj.ygztf.cn
http://CFkfTL71.ygztf.cn
http://www.dtcms.com/a/373009.html

相关文章:

  • 如何优雅地清理Hugging Face缓存到本地的模型文件(2025最新版)
  • 企业微信AI功能升级:选对企业微信服务商协助四大AI场景落地
  • Firefox Window 开发流程(四)
  • Oracle 备份与恢复常见的七大问题
  • 奥迪A5L×华为:品牌营销视角下的燃油车智能突围战!
  • LAMPSecurity: CTF5靶场渗透
  • 【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
  • 金融量化指标--3Beta 贝塔
  • leetcode10(跳跃游戏 II)
  • <数据集>无人机航拍人员搜救识别数据集<目标检测>
  • [每周一更]-(第159期):Go 工程师视角:容器化技术(Docker/Kubernetes)与CI/CD流程的应用场景
  • 低代码拖拽实现与bpmn-js详解
  • 六、Docker 核心技术:Dockerfile 指令详解
  • scp 网间拷贝
  • 20250908_开启10.1.3.174_rzmes数据库的TSC_YYPLAN表补充日志+编写《Oracle 表级补充日志开启操作手册》
  • 从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构
  • TensorFlow 面试题及详细答案 120道(111-120)-- 综合与拓展问题
  • 身份证号识别案例
  • 对口型视频创作指南:AI如何让“假唱”变成真艺术?
  • [免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
  • Spark RDD转DataFrame的三种方式
  • Gradio全解10——Streaming:流式传输的音频应用(7)——ElevenLabs:高级智能语音技术
  • 通义万相wan2.2 Fun系列--Camera镜头控制与lnp首尾帧视频模型
  • AI Coding — 基于RAG的Token窗口优化方案
  • Mac OS上搭建 http server
  • springboot项目详细配置rabbitmq及使用rabbitmq完成评论功能
  • ios面试八股文
  • 硬件(五) 存储、ARM 架构与指令系统
  • SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
  • 【51单片机】【protues仿真】基于51单片机宠物投食系统