我不明白示例文档中的 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,但我会分享我在自己的搜索中找到的答案。
笔记:
在 中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?
首先,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'作为输入变量。
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?
从这里开始,这变得更容易,因为许多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)
它如何工作并map_prompt相同combine_prompt?
用户可以为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()部分。
在哪里可以看到函数的参数load_summarize_chain()?
所有summarize变体(stuff、map_reduce等)均在 中定义summarize/__init__.py。在此特定示例中,map_reduce链参数位于 L40-51 上。
| 归档时间: |
|
| 查看次数: |
23446 次 |
| 最近记录: |