首页 > 编程问答 >如何使用 LangChain 查看 MultiQueryRetriever 管道中的最终提示?

如何使用 LangChain 查看 MultiQueryRetriever 管道中的最终提示?

时间:2024-07-27 15:37:13浏览次数:7  
标签:python langchain large-language-model ollama

我目前正在使用 LangChain 库开展一个项目,我想从向量数据库中检索相关文档,然后使用 Ollama LLM 根据这些文档生成答案。

以下是我当前的实现:

import logging

logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)

# Define the prompt template for generating multiple query versions
QUERY_PROMPT = PromptTemplate(
    input_variables=["question"],
    template="""You are an AI language model assistant. Your task is to generate five
    different versions of the given user question to retrieve relevant documents from
    a vector database. By generating multiple perspectives on the user question, your
    goal is to help the user overcome some of the limitations of the distance-based
    similarity search. Provide these alternative questions separated by newlines.
    Original question: {question}""",
)

# Initialize the MultiQueryRetriever
retriever = MultiQueryRetriever.from_llm(
    vectordb.as_retriever(), 
    ollama,
    prompt=QUERY_PROMPT
)

# Modified RAG prompt for generating the final response
template = """Answer the question based ONLY on the following context:
{context}
Question: {question}
"""

# Create the final QA chain
prompt = ChatPromptTemplate.from_template(template)

from langchain_core.runnables import RunnableLambda


def inspect(state):
    """Print the state passed between Runnables in a langchain and pass it on"""
    print(state)
    return state


qa_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | RunnableLambda(inspect)  # Add the inspector here to print the intermediate results
    | prompt
    | ollama
    | StrOutputParser()
)

# Invoke the QA chain with a sample query
qa_chain.invoke("Give 10 quotes from this articles related to love?")

我该如何在发送到 Ollama LLM 进行处理之前查看由 qa_chain 生成的最终提示?我想查看包含上下文和用户问题的确切提示。


代码中添加的 inspect 函数可以打印出 retriever prompt 之间的中间状态,但无法看到最终发送给 Ollama LLM 的提示。这是因为 prompt 本身是一个 Runnable 对象,它会在内部将上下文和问题组合成最终提示。

为了查看最终提示,需要修改 prompt 的调用方式,或者在 Ollama LLM 调用之前拦截最终提示。以下提供两种方法:

方法一:修改 prompt 调用方式

可以将 prompt 的调用从管道中分离出来,以便在调用 LLM 之前查看最终提示。

# ... (之前的代码) ...

def inspect_final_prompt(context, question):
    """打印最终提示并返回上下文和问题"""
    final_prompt = prompt.format(context=context, question=question)
    print("最终提示:\n" + final_prompt)
    return final_prompt

# 修改后的 QA 链
qa_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | RunnableLambda(inspect)  # 保留之前的 inspector
    | RunnableMap({"context": lambda x: x["context"], "question": lambda x: x["question"]}) # 将字典拆分为两个参数
    | RunnableLambda(inspect_final_prompt)  # 添加新的 inspector 来打印最终提示
    | ollama
    | StrOutputParser()
)

# ... (之后的代码) ...

在这个修改后的代码中,我们添加了一个新的 inspect_final_prompt 函数,它接收上下文和问题作为参数,然后使用 prompt.format() 方法生成最终提示并打印出来。

方法二:使用自定义 LLM Wrapper

可以创建一个自定义的 LLM wrapper,它可以在调用底层 LLM 之前拦截并打印最终提示。

from langchain_core.llms import BaseLLM

class MyOllama(BaseLLM):
    """自定义 Ollama LLM wrapper,用于打印最终提示"""

    def __init__(self, ollama_instance):
        self.ollama_instance = ollama_instance

    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        print("最终提示:\n" + prompt)
        return self.ollama_instance(prompt, stop=stop)

# ... (之前的代码) ...

# 使用自定义 LLM wrapper
ollama = MyOllama(ollama) 

# ... (之后的代码) ...

在这个例子中,我们创建了一个名为 MyOllama 的自定义 LLM wrapper,它继承自 BaseLLM 。在 _call 方法中,我们首先打印最终提示,然后调用原始的 Ollama LLM 实例。

选择哪种方法取决于的偏好和具体需求。

标签:python,langchain,large-language-model,ollama
From: 78800797

相关文章

  • python datetime timedelta 对于没有小数部分的时间返回 0.0
    我正在使用datetime.timedelta来获取python中进程的持续时间。defget_time_difference(start_time,end_time):time_in_seconds=(end_time-start_time)returnstr(datetime.timedelta(seconds=time_in_seconds))[:-3]文档指出“所有参数都是可选的......
  • 如何运行从我正在编写的另一个 Python 脚本获取命令行参数的 Python 脚本?
    我有一个python3脚本,如下所示:...defmain():parser=argparse.ArgumentParser(description='Performnormalisationchecksonpass2files')parser.add_argument('-p','--parser',action='store',help='parse......
  • Python 抓取 urllib2 HTTP 错误
    我正在尝试抓取一个网站,但我的代码仅在我打开该网站然后刷新它时才有效。我尝试了多种方法,但不断出现以下两个错误:第一个:ValueError:“HTTPError:HTTP错误416:请求的范围无法满足”urlslist=open("list_urls.txt").read()urlslist=urlslist.split("\n")forurlslistinurl......
  • 【Python】利用 face_recognition 库进行人脸检测识别【附完整示例】
    1.背景条件1.1安装所需库首先安装face_recognition和Pillow这两个库。您可以使用以下命令来安装它们:pipinstallface_recognitionPillow-ihttps://pypi.tuna.tsinghua.edu.cn/simple1.2拷贝代码安装完成后,您就可以在本地运行以下提供的代码了。importfac......
  • 本地部署大模型?看这篇就够了,Ollama 部署和实战
    写在前面前几篇,分享的都是如何白嫖国内外各大厂商的免费大模型服务~有小伙伴问,如果我想在本地搞个大模型玩玩,有什么解决方案?Ollama,它来了,专为在本地机器便捷部署和运行大模型而设计。也许是目前最便捷的大模型部署和运行工具,配合OpenWebUI,人人都可以拥有大模型自由。......
  • 太强了,Python+Excel真的是神仙组合!
    本书是由流行开源Python库xlwings的创始人:费利克斯·朱姆斯坦(FelixZumstein)所撰写。他详细阐述了如何将Python与Excel结合使用,让任务自动化,从而实现效率飞跃。为了帮助初学者克服对Python的恐惧,作者特意将教程内容设计成从简单到复杂的顺序进行介绍。这本书PDF共282页,分为4个......
  • 在 Python 中获取精确的 Android GPS 位置
    我尝试在Python中获取Android手机的GPS位置(使用QPython3应用程序)。这种可行,但是Android中似乎有几个LocationProvider:gps:纯gps定位,速度慢,耗能,但非常准确,正是我所需要的。网络:GPS和wifi/小区定位的混合,更快,但不太准确被动......
  • ollama llama3.1 8b openbuddy 模型
    openbuddy对于llama3.18b模型进行了少量的中文训练实现了不错的中文理解处理,以下是使用社区提供的gguf格式,制作一个ollama新模型模型制作下载模型下载gguf文件,推荐使用加速工具Modelfile参考了llama3.1的FROM/home/models/openbuddy-llama3.1-8b-v22.1-......
  • 使用 docker run 将 Python 单击选项传递给 ENTRYPOINT 会出现错误:“在 $PATH 中找不
    我有一个简单的python脚本,我想在docker容器内运行它。它打印一行消息“Hello{name}”。python脚本使用clickCLI界面来定义收件人名称,如果我直接运行它(不使用dockerrun命令),它将如下所示:pythonhello.py-nSmithDockerbuild命令:dockerbuild.-thello:1.......
  • 标题:在 OpenSees Python 中定义具有特定卸载行为的双线性弹塑性材料
    我正在使用Python中的OpenSees,我想定义一种在负载下表现出双线性弹塑性行为的材料。但是,我需要在卸载过程中将材质返回到其原始位置,遵循准确的加载路径。在此处输入图像描述我不确定如何在OpenSees中正确实现卸载行为,我正在寻找实现这一具体材料反应的指导。......