langchain自定义提示&输入参数不清楚

Ani*_*Ani 8 langchain

我不明白示例文档中的 customprompt 如何工作:https://python.langchain.com/en/latest/modules/chains/index_examples/qa_with_sources.html

提示对象定义为:

PROMPT = PromptTemplate(template=template, input_variables=["summaries", "question"])

期待两个输入摘要和问题

但是,仅在问题(作为查询)中传递内容,而不是摘要中传递的内容

chain = load_qa_with_sources_chain(OpenAI(temperature=0), chain_type="stuff", prompt=PROMPT)
query = "What did the president say about Justice Breyer"
chain({"input_documents": docs, "question": query}, return_only_outputs=True)
where docs = docsearch.similarity_search(query)
Run Code Online (Sandbox Code Playgroud)

问题 1(针对): input_documentsqa_with_sources如何映射到摘要?

同样,我不清楚链接 https://python.langchain.com/en/latest/modules/chains/index_examples/summarize.html上的文档

prompt_template = """Write a concise summary of the following:


{text}


CONCISE SUMMARY IN ITALIAN:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
chain({"input_documents": docs}, return_only_outputs=True)
Run Code Online (Sandbox Code Playgroud)

更多问题(针对summarize): 2. docs
是如何映射到text 的,我在哪里可以知道这一点? 3.map_prompt和combine_prompt相同时如何工作? 4. 在哪里可以看到函数的参数?当我使用代码时,我只是得到以下输出

print('load_summarize_chain params: ', inspect.signature(load_summarize_chain))

load_summarize_chain 参数: (llm: langchain.schema.BaseLanguageModel, chain_type: str = 'stuff', verbose: 可选[bool] = None, **kwargs: Any) -> langchain.chains.combine_documents.base.BaseCombineDocumentsChain

and*_*ece 17

我自己仍在学习LangChain,但我会分享我在自己的搜索中找到的答案。

笔记:

  • 为了清晰起见,OP 问题进行了轻微编辑。
  • 每个问题单独发表可能会更好,但我确实很高兴将它们放在一起,因为它促使我​​将它们之间的点联系起来。所以希望这对其他人也有用。

问题1

在 中load_qa_with_sources_chain()PROMPT定义为:

PROMPT = PromptTemplate(template=template, input_variables=["summaries", "question"])

它需要两个输入,'summaries'并且'question'.

但是,传入的内容是 only question=query,而不是 NOT 'summaries'

chain = load_qa_with_sources_chain(OpenAI(temperature=0), chain_type="stuff", prompt=PROMPT) query = "What did the president say about Justice Breyer" chain({"input_documents": docs, "question": query}, return_only_outputs=True)

如何input_documents映射到summaries

答案1

首先,stuff链加载器接受我们传入的提示并LLMChain使用该提示定义一个。然后您可以看到它llm_chain用于初始化StuffDocumentsChain.

def _load_stuff_chain(
    llm: BaseLanguageModel,
    prompt: BasePromptTemplate = stuff_prompt.PROMPT,
    document_prompt: BasePromptTemplate = stuff_prompt.EXAMPLE_PROMPT,
    document_variable_name: str = "summaries",
    verbose: Optional[bool] = None,
    **kwargs: Any,
) -> StuffDocumentsChain:
    llm_chain = LLMChain(llm=llm, prompt=prompt, verbose=verbose)
    return StuffDocumentsChain(
        llm_chain=llm_chain,
        document_variable_name=document_variable_name,
        document_prompt=document_prompt,
        verbose=verbose,
        **kwargs,
    )
Run Code Online (Sandbox Code Playgroud)

但还要注意_load_stuff_chain(): document_prompt和还有另外两个参数document_variable_name

  • document_prompt:如果我们不传入 custom document_prompt,它就会依赖EXAMPLE_PROMPT,这是非常具体的。(由于篇幅太长,这里就不重发了。)
  • document_variable_name:在这里您可以看到'summaries'第一个作为默认值出现的位置。我们可以看到它定义

llm_chain 中用于放置文档的变量名称

在同一个stuff.py脚本中,有一个_get_inputs()方法可以收集将进入 LLM 进行评估的所有输入。这些输入之一是

inputs[self.document_variable_name] = self.document_separator.join(doc_strings)

现在我们知道这实际上是inputs['summaries']默认的。另外,旁注,doc_strings每个doc格式都使用(通过)docs进行格式化。document_promptformat_document()

好的,现在我们已经差不多完成了,系统的最后一步stuff是将所有docs, 格式化为document_prompts, 发送到 进行llm_chain评估。这是在combine_docs()以下调用中完成的llm_chain.predict()

return self.llm_chain.predict(callbacks=callbacks, **inputs), {}

请记住,我们使用传入的llm_chain原始值进行了初始化PROMPT,现在很明显它都期望'question'AND'summaries'作为输入变量。

问题2

summarize_chain在示例中:

prompt_template = """Write a concise summary of the following:


{text}


CONCISE SUMMARY IN ITALIAN:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
chain({"input_documents": docs}, return_only_outputs=True)
Run Code Online (Sandbox Code Playgroud)

如何docs映射到text

答案2

从这里开始,这变得更容易,因为许多summarize链代码遵循与qa链类似的模式。

我们可以看到_load_map_reduce_chain()一个默认值, 'text',它被分配给document_variable_name初始化MapReduceDocumentChain并返回的 。

另请注意 L52 和 L54,其中LLMChain初始化了两个不同的对象,一个用于map(takes map_prompt),另一个用于reduce(takes combine_prompt)。

# L52
map_chain = LLMChain(llm=llm, prompt=map_prompt, verbose=verbose)
# L54
reduce_chain = LLMChain(llm=_reduce_llm, prompt=combine_prompt, verbose=verbose)
Run Code Online (Sandbox Code Playgroud)

然后reduce_chain被内置到 中,这是我们首先可以看到( 的默认值) 和( 现在内置到)combine_document_chain之间的关系的地方。'text'combine_document_variable_namePROMPTreduce_chain

 combine_document_chain = StuffDocumentsChain(
        llm_chain=reduce_chain,
        document_variable_name=combine_document_variable_name,
        verbose=verbose,
    )
Run Code Online (Sandbox Code Playgroud)

问题3

它如何工作并map_prompt相同combine_prompt

答案3

此处两个提示相同的事实看起来可能是为了示例方便,因为建议的提示是通用的:>`“编写以下内容的简明摘要:{text} #...”`

用户可以为map_prompt和输入不同的值combine_prompt;映射步骤对每个文档应用提示,而组合步骤应用一个提示将映射结果组合在一起。

您可以在代码中看到这些步骤发生的位置:

LLM链的map应用combine_docs()步骤如下MapReduceDocumentsChain

# self.document_variable_name = 'text'
# d.page_content is the text content from each :doc: in :docs:

"""Combine documents in a map reduce manner.

Combine by mapping first chain over all documents, then reducing the results.
This reducing can be done recursively if needed (if there are many documents).
"""
# L144
results = self.llm_chain.apply(
            # FYI - this is parallelized and so it is fast.
            [{self.document_variable_name: d.page_content, **kwargs} for d in docs],
            callbacks=callbacks,
        )
Run Code Online (Sandbox Code Playgroud)

_process_results()然后在方法中调用reduce步骤,特别是在_collapse_chain()combine_documents_chain()部分。

问题4

在哪里可以看到函数的参数load_summarize_chain()

答案4

所有summarize变体(stuffmap_reduce等)均在 中定义summarize/__init__.py。在此特定示例中,map_reduce链参数位于 L40-51 上。