找回密码
 立即注册
首页 业界区 业界 AI开发-python-langchain框架(1-8-2 缓存机制——验证 ...

AI开发-python-langchain框架(1-8-2 缓存机制——验证缓存的效果)

秦欣艷 10 小时前
  在AI应用中,缓存机制的经济价值不仅节省Token成本,还能消除用户等待焦虑、提升系统吞吐量、保障服务稳定性——这才是企业级应用的真正痛点。
  当用户提出一个常见问题时,首次调用大模型需要经历网络传输、排队等待、模型推理等完整链路,响应时间通常在1至3秒。这个时长已超过人类对“流畅交互”的心理阈值(200毫秒),用户会明显感知到“卡顿”和“等待焦虑”。而启用缓存后,相同问题的后续请求直接从本地数据库读取结果,响应时间骤降至10毫秒以内——这种“无感秒回”的体验,让用户感觉系统始终在线、反应迅捷,极大提升了产品专业度和信任感。
       下面看看这段代码,就能清晰的体现使用缓存后能提升的用户体验。(同一个问题问大模型三次,第一次没有缓存,后两次有缓存)
  1. import os
  2. import time
  3. from langchain_community.cache import SQLiteCache
  4. from langchain_openai import ChatOpenAI
  5. from langchain.globals import set_llm_cache, get_llm_cache
  6. # ========== 1. 清理旧缓存(确保演示纯净)==========
  7. CACHE_DB = "langchain_demo.db"
  8. if os.path.exists(CACHE_DB):
  9.     os.remove(CACHE_DB)
  10.     print(f" 已清理旧缓存: {CACHE_DB}")
  11. # ========== 2. 启用缓存 ==========
  12. set_llm_cache(SQLiteCache(database_path=CACHE_DB))
  13. print(f" 缓存已启用: {get_llm_cache()}\n")
  14. # ========== 3. 配置 LLM ==========
  15. llm = ChatOpenAI(
  16.     api_key=os.getenv("DEEPSEEK_API_KEY"),
  17.     base_url=os.getenv("DEEP_URL"),  # Deepseek 的 API 基础地址
  18.     model="deepseek-v3:671b",  # Deepseek 对话模型(可选:deepseek-chat-pro 等高级模型)
  19.     temperature=0.7,  # 温度参数(0-1,越低越稳定)
  20.     max_tokens=1024  # 最大生成 tokens
  21. )
  22. # ========== 4. 核心演示函数 ==========
  23. def demonstrate_cache_effect(query: str, repeat: int = 3):
  24.     """
  25.     演示缓存效果:首次调用(慢) vs 后续调用(快)
  26.     Args:
  27.         query: 要提问的问题
  28.         repeat: 重复调用次数(第1次未缓存,后续应命中缓存)
  29.     """
  30.     print("=" * 60)
  31.     print(f" 测试问题: "{query}"")
  32.     print(f" 将重复调用 {repeat} 次(第1次无缓存,后续应命中缓存)")
  33.     print("=" * 60 + "\n")
  34.     durations = []
  35.     for i in range(repeat):
  36.         print(f"\n[第 {i + 1} 次调用]")
  37.         start = time.perf_counter()  # 高精度计时
  38.         # 关键:使用完全相同的输入触发缓存
  39.         response = llm.invoke(query)
  40.         duration = (time.perf_counter() - start) * 1000  # 转为毫秒
  41.         durations.append(duration)
  42.         # 判断是否命中缓存(通过耗时阈值粗略判断)
  43.         is_cached = i > 0   # 首次通常 >500ms,缓存通常 <50ms
  44.         if i > 0:
  45.             print('缓存命中,耗时:'+str(duration))
  46.         else:
  47.             print('真实请求,耗时:'+str(duration))
  48.         print(f" 回答: {response.content[:60]}...")
  49. # ========== 5. 执行演示 ==========
  50. if __name__ == "__main__":
  51.     # 测试标准问题(确保完全相同的字符串)
  52.     demonstrate_cache_effect("太阳系哪个行星最大?", repeat=3)
复制代码
 运行结果:
 
 已清理旧缓存: langchain_demo.db
 缓存已启用:

============================================================
 测试问题: "太阳系哪个行星最大?"
 将重复调用 3 次(第1次无缓存,后续应命中缓存)
============================================================


[第 1 次调用]
真实请求,耗时:17445.118000000093
 回答: 太阳系中最大的行星是**木星**。以下是关于木星的一些关键信息:

### 木星的基本特征:
1. **体积与质量** ...

[第 2 次调用]
缓存命中,耗时:410.93799999998737
 回答: 太阳系中最大的行星是**木星**。以下是关于木星的一些关键信息:

### 木星的基本特征:
1. **体积与质量** ...

[第 3 次调用]
缓存命中,耗时:1.475199999731558
 回答: 太阳系中最大的行星是**木星**。以下是关于木星的一些关键信息:

### 木星的基本特征:
1. **体积与质量** ...

 
结论:从时间消耗上看,缓存命中几何倍数的缩短了用户等待时间,提升了用户的使用体验。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册