aseven2022 2025-12-05 23:43 采纳率: 100%
浏览 11
已结题

langchain的数据库检索和gradio搭配时性能下降

问题内容:langchain的数据库检索和gradio搭配时性能下降

环境:
windows11
langchain 1.1.0
gradio 6.0.0
大模型API提供商:deepseek
嵌入模型:Qwen3-Embedding-0.6B

问题描述

起初使用langchain简单尝试了一下RAG,然后使用gradio作为前端展示,但是检测的时候发现在gradio中,langchain数据库的 vector_store.similarity_search() 检索会变得特别慢,达到二三十秒,但是如果不用gradio的话,检索只耗时零点几秒,尝试了不同的数据库 chromadb, FAISS, Qdrant结果都类似

  • 下面以FAISS为例,做一个简单的问题复现

简单的完整代码复现

1. 不使用gradio

from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain_community.vectorstores import FAISS
from langchain.tools import tool
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_core.messages import HumanMessage

import os
import time
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
logger = logging.getLogger(__name__)

agent = None
vector_store = None

def create_vector(text_dir: str):
    """创建向量数据库"""
    s_time = time.time()
    global vector_store
    loader = TextLoader(text_dir, encoding='utf-8')
    documents = loader.load()
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20)
    texts = text_splitter.split_documents(documents)
    embedding = HuggingFaceEmbeddings(model_name="Qwen/Qwen3-Embedding-0.6B")
    if vector_store is None:
        vector_store = FAISS.from_documents(texts, embedding)
    e_time = time.time()
    logger.info(f"创建向量数据库耗时: {e_time - s_time:.2f} 秒")


@tool
def search_vector(query: str) -> str:
    """向量数据库检索故事信息"""
    s_time = time.time()
    global vector_store
    if vector_store is None:
        return "向量数据库未创建"
    docs = vector_store.similarity_search(query, k=3)
    result = "\n".join([doc.page_content for doc in docs])
    e_time = time.time()
    logger.info(f"向量数据库检索耗时: {e_time - s_time:.2f} 秒")
    return result

def get_model():
    """返回聊天模型"""
    return init_chat_model(
        'deepseek-chat',
        api_key = os.getenv('DEEPSEEK_API_KEY')
    )

def get_agent():
    """生成Langchain Agent"""
    s_time = time.time()
    model = get_model()
    agent = create_agent(
        model=model,
        tools=[search_vector],
        system_prompt="你是一个有帮助的助手,擅长回答与提供的故事内容相关的问题。"
    )
    e_time = time.time()
    logger.info(f"创建Agent耗时: {e_time - s_time:.2f} 秒")
    return agent

if __name__ == "__main__":
    # 以一段AI生成的短故事为例进行嵌入
    create_vector('story_test.txt')
    agent = get_agent()
    # 这里为了测试方便,直接用invoke调用了
    result = agent.invoke(
        {'messages': [HumanMessage(content="请检索并简要描述故事的主角。")]}
    )
    print(f'AI: {result["messages"][-1].content}')

调用的截图如下:

img

可以看到数据库检索是很快的,这次的示例中是0.1s

但是问题就出在部署到gradio

2. 使用gradio前端


#...前面代码不变
# main前加上gradio获取结果的函数
import gradio as gr

def get_result(msg, history):
    """获取AI回复结果"""
    s_time = time.time()
    if agent is not None:
        result = agent.invoke(
            {'messages': [HumanMessage(content=msg)]}
        )
        e_time = time.time()
        logger.info(f"gradio 获取AI回复耗时: {e_time - s_time:.2f} 秒")
        yield result["messages"][-1].content

if __name__ == "__main__":
    create_vector('story_test.txt')
    agent = get_agent()
    # 启用gradio
    gr.ChatInterface(
        fn=get_result,
    ).launch()

结果截图如下:

img

img

这次的测试中,agent多次检索了数据库以获取足够信息,但是每次的检索时长都大幅提升,从0.1s提升到了几十秒,而且从info信息来看,也没有出现重复初始化数据库或agent的情况,纯属是数据库检索变慢了
为了验证上述猜想,将**数据库检索步骤换成time.sleep()**,新的工具函数如下

@tool
def search_vector(query: str) -> str:
    """向量数据库检索故事信息"""
    s_time = time.time()
    global vector_store
    if vector_store is None:
        return "向量数据库未创建"
    # docs = vector_store.similarity_search(query, k=3)
    # result = "\n".join([doc.page_content for doc in docs])
    time.sleep(3)  # 模拟检索延时
    result = '未检索到结果'
    e_time = time.time()
    logger.info(f"向量数据库检索耗时: {e_time - s_time:.2f} 秒")
    return result

再次运行(把"故事"打成“古树”了,但这不重要)

img

img

agent同样检索了很多次,这次每次的时间几乎就是 time.sleep()的时间,所以基本有充足理由确定在gradio中,AI回复变慢的原因是数据库检索 vector_store.similarity_search()性能大幅下降了。

这个问题困扰我很久了😭,大家在使用langchian时有类型的问题吗,可以分享一下解决经验吗?

  • 写回答

4条回答 默认 最新

  • aseven2022 2025-12-26 14:57
    关注

    最近更新了langchain的新版本,正常了,应该是langchain的问题

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月5日