Spaces:
Runtime error
Runtime error
| # 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. | |