python 如何检测ConversationalRetrievalChain是否调用了OpenAI LLM?

ulydmbyx  于 2023-08-02  发布在  Python
关注(0)|答案(2)|浏览(108)

我有以下代码:

chat_history = []
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(chunks, embeddings)
qa = ConversationalRetrievalChain.from_llm(OpenAI(temperature=0.1), db.as_retriever())
result = qa({"question": "What is stack overflow", "chat_history": chat_history})

字符串
代码创建嵌入,创建一个FAISS内存中的向量数据库,其中包含我在chunks数组中的一些文本,然后它创建一个ConversationalRetrievalChain,然后提出一个问题。
根据我对ConversationalRetrievalChain的理解,当被问到一个问题时,它会首先查询FAISS vector db,然后,如果它找不到任何匹配的东西,它会去OpenAI回答这个问题。我的理解是否正确?)
我如何检测它是否真的调用了OpenAI来获取答案,或者它是否能够从内存中的向量数据库中获取答案?result对象包含questionchat_historyanswer属性,除此之外什么都没有。

vnjpjtjt

vnjpjtjt1#

我个人不认为ConversationalRetrievalChain可以从文档中获得任何答案,而无需在提供的示例中向OpenAI发送API请求。但我不是这方面的Maven,我可能是错的。
但是你可以使用另一个更便宜/本地的llm作为压缩最终问题的方法,以帮助优化令牌计数。
以下是他们的例子:

qa = ConversationalRetrievalChain.from_llm(
    ChatOpenAI(temperature=0, model="gpt-4"),
    vectorstore.as_retriever(),
    condense_question_llm = ChatOpenAI(temperature=0, model='gpt-3.5-turbo'),
)

字符串
可以跟踪API使用情况的方法如下:

from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
    result = llm("Tell me a joke")
    print(cb)


使用的令牌:42个提示符:4枚完成令牌:38个成功请求:1总成本(美元):0.00084美元
另一个有用的方法是使用额外的工具来跟踪请求:https://github.com/amosjyng/langchain-visualizer

myss37ts

myss37ts2#

您可以通过检查结果对象中的“answer”属性是否存在且不为空来检测答案是否是从内存中的向量数据库中获得的。如果它存在,答案来自数据库;否则,它由OpenAI模型生成。

相关问题