Module Ensemble#
The ModuleEnsemble Cog enables ensembling methods within generative AI workflows, allowing multiple independent sampler to generate diverse outputs that are subsequently aggregated to produce a final, refined response. This approach enhances the robustness and quality of generated content by leveraging the collective strengths of various solution path.
Implementation
All options within the ModuleEnsemble Cog follow a common process: sample then aggregate. To facilitate this process, the option transforms the target module into a workflow, wherein the entry point is multiple independent samplers each initialized with a clone of the original module, followed by an aggregator that processes proposals of these samplers and to generate a final response.
Note
The ensemble cog introduces significant structural change to the whole workflow, adding multiple modules that can be tuned independently. Take self-consistency as an example, choosing a different configuration for each sampling path can lead to a more diverse set of responses, increasing the chance of hitting the correct answer and reducing output bias.
Universal-Self-Consistency#
The UniversalSelfConsistency option provides a simple implementation of the paper. It operates by spawning multiple workers and adding a llm-based aggregator. The aggregator analyzes all proposals and synthesizes a final answer that reflects the majority consensus. This method is particularly effective for tasks requiring complex reasoning and ensures that the final output is both comprehensive and coherent.
Example Usage#
To utilize the ModuleEnsemble Cog with the UniversalSelfConsistency option, you can define the search space as follows:
from cognify.hub.cogs import NoChange, ModuleEnsemble, UniversalSelfConsistency
# Define the ensemble options
ensemble_options = [
NoChange(),
# We can also ask the option to change the temperature during sampling
UniversalSelfConsistency(num_path=5, temperature=0.7, change_temperature=True)
]
# Initialize the ModuleEnsemble Cog
ensemble_cog = ModuleEnsemble(
name="ensemble_example",
options=ensemble_options,
)
Cognify also allows direct application of any ensemble options to your workflow:
import cognify
from cognify.graph.program import Workflow
from cognify.hub.cogs import UniversalSelfConsistency
agent = cognify.Model(...)
usc = UniversalSelfConsistency(num_path=3)
ensembled_new_agent: Workflow = usc.apply(agent)
# Easiest way to use the workflow with the same interface
agent.invoke = ensembled_new_agent.invoke
agent.forward(
{
"input_label_1": "value ...",
"input_label_2": "value ..."
}
)