forked from Archives/langchain
52 lines
3.4 KiB
Markdown
52 lines
3.4 KiB
Markdown
# CombineDocuments Chains
|
|
CombineDocuments chains are useful for when you need to run a language over multiple documents.
|
|
Common use cases for this include question answering, question answering with sources, summarization, and more.
|
|
For more information on specific use cases as well as different methods for **fetching** these documents, please see
|
|
[this overview](/use_cases/combine_docs.md).
|
|
|
|
This documentation now picks up from after you've fetched your documents - now what?
|
|
How do you pass them to the language model in a format it can understand?
|
|
There are a few different methods, or chains, for doing so. LangChain supports four of the more common ones - and
|
|
we are actively looking to include more, so if you have any ideas please reach out! Note that there is not
|
|
one best method - the decision of which one to use is often very context specific. In order from simplest to
|
|
most complex:
|
|
|
|
## Stuffing
|
|
Stuffing is the simplest method, whereby you simply stuff all the related data into the prompt as context
|
|
to pass to the language model. This is implemented in LangChain as the `StuffDocumentsChain`.
|
|
|
|
**Pros:** Only makes a single call to the LLM. When generating text, the LLM has access to all the data at once.
|
|
|
|
**Cons:** Most LLMs have a context length, and for large documents (or many documents) this will not work as it will result in a prompt larger than the context length.
|
|
|
|
The main downside of this method is that it only works one smaller pieces of data. Once you are working
|
|
with many pieces of data, this approach is no longer feasible. The next two approaches are designed to help deal with that.
|
|
|
|
## Map Reduce
|
|
This method involves an initial prompt on each chunk of data (for summarization tasks, this
|
|
could be a summary of that chunk; for question-answering tasks, it could be an answer based solely on that chunk).
|
|
Then a different prompt is run to combine all the initial outputs. This is implemented in the LangChain as the `MapReduceDocumentsChain`.
|
|
|
|
**Pros:** Can scale to larger documents (and more documents) than `StuffDocumentsChain`. The calls to the LLM on individual documents are independent and can therefore be parallelized.
|
|
|
|
**Cons:** Requires many more calls to the LLM than `StuffDocumentsChain`. Loses some information during the final combining call.
|
|
|
|
## Refine
|
|
This method involves an initial prompt on the first chunk of data, generating some output.
|
|
For the remaining documents, that output is passed in, along with the next document,
|
|
asking the LLM to refine the output based on the new document.
|
|
|
|
**Pros:** Can pull in more relevant context, and may be less lossy than `MapReduceDocumentsChain`.
|
|
|
|
**Cons:** Requires many more calls to the LLM than `StuffDocumentsChain`. The calls are also NOT independent, meaning they cannot be paralleled like `MapReduceDocumentsChain`. There is also some potential dependencies on the ordering of the documents.
|
|
|
|
|
|
## Map-Rerank
|
|
This method involves running an initial prompt on each chunk of data, that not only tries to complete a
|
|
task but also gives a score for how certain it is in its answer. The responses are then
|
|
ranked according to this score, and the highest score is returned.
|
|
|
|
**Pros:** Similar pros as `MapReduceDocumentsChain`. Compared to `MapReduceDocumentsChain`, it requires fewer calls.
|
|
|
|
**Cons:** Cannot combine information between documents. This means it is most useful when you expect there to be a single simple answer in a single document.
|