请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

prompt.partial(format_instructions=parser.get_format_instructions())是起什么作用的

老师您好,这块我用您给的提示词来解析用户输入的问题,老是出现参数识别不准或是掉了某个参数,导致查询失败了,特别是这块的内容,不是很理解,按道理来说这个参数应该在提示词中显性标识出来,这种写法意思在提示词插入这个format_instructions?
图片描述
这块麻烦老师给个解释

正在回答

1回答

你提出了一个好问题,这里没有细讲,partial主要是将部分变量在提示词中实例化,最常见的场景是对日期的渲染,比如你的提示词中希望提示词被触发时,自动渲染当前的时间,但是又不能硬编码时间,就需要用到它,类似:

from datetime import datetime


def _get_datetime():
    now = datetime.now()
    return now.strftime("%m/%d/%Y, %H:%M:%S")
    
 prompt = PromptTemplate(
    template="Tell me a {adjective} joke about the day {date}",
    input_variables=["adjective", "date"],
)
partial_prompt = prompt.partial(date=_get_datetime)
print(partial_prompt.format(adjective="funny"))

那么在课程这个例子里比较特殊的地方是,format_instructions并没有显式的传入到prompt中,但是实际上这个过程langchain是在内部处理了。我们使用了ChatPromptTemplate,阅读源码可以看到,它有一个format方法:

def format(self, **kwargs) -> str:
    # Get the partial variables and update with kwargs
    partial_kwargs = self.partial_variables.copy()
    partial_kwargs.update(kwargs)

    # Format the messages
    formatted_messages = []
    for message in self.messages:
        if isinstance(message, BaseMessagePromptTemplate):
            formatted_messages.append(message.format(**partial_kwargs))
        elif isinstance(message, BaseMessage):
            formatted_messages.append(message.content)
        else:
            raise ValueError(f"Unexpected message type: {type(message)}")

    return self.output_parser.format(formatted_messages)

它主要做的几件事:

1.复制partial_variables字典,并使用kwargs参数更新它。这样可以确保kwargs中提供的任何变量都会覆盖partial_variables中的对应变量。

2.遍历messages列表,对于每个消息,根据其类型进行格式化:

. 如果消息是BaseMessagePromptTemplate的实例,则调用其format方法,并传入更新后的partial_kwargs。

 如果消息是BaseMessage的实例,则直接使用其content属性。

 如果消息类型不是以上两种,则抛出ValueError异常。

3.将格式化后的消息列表传递给output_parser的format方法进行最终的格式化。

当我们调用prompt.partial(format_instructions=parser.get_format_instructions())时,实际上是在修改ChatPromptTemplate对象的partial_variables属性。在这种情况下,format_instructions被添加到partial_variables字典中,其值为parser.get_format_instructions()返回的格式化指令。当我们最终调用chain.invoke方法时,Langchain库会在内部调用prompt.format方法来格式化提示模板。在format方法内部,它会检查partial_variables字典,并将其中的变量替换到提示模板中对应的占位符上。所以,即使在提示模板中没有显式地包含{format_instructions}占位符,Langchain库也会在内部将format_instructions的值插入到提示字符串的适当位置。


1 回复 有任何疑惑可以回复我~
  • 提问者 慕标8269443 #1
    好的,谢谢老师的解答,大致理解,这里多问一句疑问,我根据您的指示,去看了ChatPromptTemplate的源码,里面涉及到format的实现,但是与老师上面贴的代码不一致,请问这是langchain版本的问题吗?还是我找错了地方,下面是我找到的源码
        def format(self, **kwargs: Any) -> str:
            """Format the chat template into a string.
    
            Args:
                **kwargs: keyword arguments to use for filling in template variables
                          in all the template messages in this chat template.
    
            Returns:
                formatted string
            """
            return self.format_prompt(**kwargs).to_string()
    麻烦老师给个指引
    回复 有任何疑惑可以回复我~ 2024-04-27 22:51:34
  • tomiezhang 回复 提问者 慕标8269443 #2
    https://github.com/langchain-ai/langchain/blob/master/libs/core/langchain_core/prompts/chat.py#L1067 可以看下这里对partial_variables的维护和使用
    回复 有任何疑惑可以回复我~ 2024-04-27 23:34:09
  • 提问者 慕标8269443 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2024-04-28 08:41:34
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信