我运行了以下基于 Langchain 和 Chroma 的代码,它应该在生产环境中运行,用户作为面向聊天机器人的客户端,所以我期望它,或者也许我应该说我希望它应该运行一两秒内,但我发现这部分运行大约需要半分钟,这对于我的用例来说太慢了,如果您有任何建议,我将非常感激,以使其更快,谢谢非常感谢您宝贵的时间和帮助!
def generate_chain():
chain = load_qa_with_sources_chain(
OpenAI(temperature=0, openai_api_key=openai.api_key),
chain_type="map_reduce"
)
return chain
def ask_docs(relevant_documents, query):
chain = generate_chain()
sourced_answer_obj = chain(
{"input_documents": [relevant_document[0] for relevant_document in relevant_documents],
"question": query}, return_only_outputs=True)
sourced_answer_str = sourced_answer_obj['output_text'].strip()
return sourced_answer_str
我尝试了上面的代码,我预计它需要大约一秒或更短的时间,但最终花了半分钟
最佳答案
可以进行一些潜在的优化来提高代码的性能。以下是一些建议:
避免每次调用ask_docs函数时都重新生成链: 目前,每次调用ask_docs时都会调用generate_chain函数。生成链涉及加载 QA 模型及其相关资源,这可能是一项耗时的操作。为了提高性能,您可以生成一次链并在后续查询中重复使用它。
例如:
# Define the chain outside of the ask_docs function
chain = generate_chain()
# Call ask_docs function multiple times, reusing the chain
answer1 = ask_docs(relevant_documents1, query1)
answer2 = ask_docs(relevant_documents2, query2)
在generate_chain函数外部加载OpenAI API key : 在generate_chain函数中,每次调用时都会加载OpenAI API key 。这可以通过在函数外部加载 API key 并将其作为参数传递来优化。这样,您只需加载 API key 一次,并在必要时重复使用它。
批量输入文档: 您可以考虑将文档批量处理在一起,而不是将每个相关文档单独传递到链中。批处理有助于减少 API 调用数量并有可能提高性能。修改ask_docs函数以接受相关文档列表而不是单个文档,然后将批量文档传递到链上。
这是应用了这些优化的代码的更新版本:
# Load the OpenAI API key outside the function
openai_api_key = openai.api_key
def generate_chain():
chain = load_qa_with_sources_chain(
OpenAI(temperature=0, openai_api_key=openai_api_key),
chain_type="map_reduce"
)
return chain
# Generate the chain once outside the function
chain = generate_chain()
def ask_docs(relevant_documents, query):
sourced_answer_obj = chain(
{"input_documents": [doc[0] for doc in relevant_documents],
"question": query}, return_only_outputs=True)
sourced_answer_str = sourced_answer_obj['output_text'].strip()
return sourced_answer_str
通过应用这些优化,您应该会在运行代码时观察到性能的提高。请记住根据您的具体用例进行更改并相应地验证结果。
关于python - 如何在 Python 中优化基于 OpenAI 的聊天机器人的 NLP 处理时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76352127/