python 如何为RetrievalQA.from_chain_type添加内存?或者,如何向ConversationalRetrievalChain添加自定义提示符?

bd1hkmkf  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(733)

如何为RetrievalQA.from_chain_type添加内存?或者,如何向ConversationalRetrievalChain添加自定义提示符?
在过去的两周里,我一直在尝试制作一个聊天机器人,它可以在文档上聊天(所以不仅仅是一个语义搜索/问答,所以有记忆),而且还有一个自定义提示。我已经尝试了所有链的每一种组合,到目前为止,我得到的最接近的是ConversationalRetrievalChain,但没有自定义提示,和RetrievalQA.from_chain_type,但没有内存

rsaldnfx

rsaldnfx1#

你有没有试过传入chain_type_kwargs(下面是源代码的截图,供快速参考)?
文档并没有让你很容易地理解引擎盖下的东西,但是这里有一些东西可以实现你的目标。
您可以在此GitHub Link设置中找到该笔记本

from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.memory import ConversationBufferMemory
from langchain import PromptTemplate
from langchain.retrievers import TFIDFRetriever

retriever = TFIDFRetriever.from_texts(
    ["Our client, a gentleman named Jason, has a dog whose name is Dobby",
     "Jason has a good friend called Emma",
     "Emma has a cat whose name is Sullivan"])

然后定义自定义提示:

template = """
Use the following context (delimited by <ctx></ctx>) and the chat history (delimited by <hs></hs>) to answer the question:
------
<ctx>
{context}
</ctx>
------
<hs>
{history}
</hs>
------
{question}
Answer:
"""
prompt = PromptTemplate(
    input_variables=["history", "context", "question"],
    template=template,
)

请注意输入变量使用了什么,特别是'history''question',因为在设置内存时需要匹配这些变量:

qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(),
    chain_type='stuff',
    retriever=retriever,
    verbose=True,
    chain_type_kwargs={
        "verbose": True,
        "prompt": prompt,
        "memory": ConversationBufferMemory(
            memory_key="history",
            input_key="question"),
    }
)

现在可以调用qa.run({"query": "who's the client's friend?"})
“客户的朋友是艾玛”
然后是qa.run("and her pet's name is?")
“艾玛的宠物叫苏利文。”
要检查和验证内存/聊天记录:qa.combine_documents_chain.memory
ConversationBufferMemory(chat_memory=ChatMessageHistory(messages=[HumanMessage(content=“谁是客户的朋友?“,additional_kwargs={}),AIMessage(content=“客户的朋友是Emma.",additional_kwargs={}),HumanMessage(content=“她的宠物的名字是?“,additional_kwargs={}),AIMessage(content=“Emma's pet's name is Sullivan.",additional_kwargs={})]),output_key=None,input_key='question',return_messages=False,human_prefix='Human',ai_prefix='AI',memory_key='history')

相关问题