Adding a project profile¶
Project profiles keep project-specific retrieval and answering behavior out of the generic RAG pipeline.
Use a profile when a target project needs custom behavior such as:
query expansion for project-specific terminology;
filtering noisy source types;
reranking results for known intents;
deterministic direct answers for structured questions.
Relevant files¶
src/githelp/project_profiles/base.py
src/githelp/project_profiles/generic.py
src/githelp/project_profiles/mmore.py
src/githelp/project_profiles/factory.py
1. Create a profile class¶
Add a new module under:
src/githelp/project_profiles/
The class should implement the same methods as ProjectProfile:
from __future__ import annotations
from githelp.project_profiles.base import ProjectProfile
from githelp.retrieval.base import RetrievalResult
class ExampleProjectProfile(ProjectProfile):
def expand_query(self, question: str) -> str:
return question
def filter_results(
self,
results: list[RetrievalResult],
question: str,
) -> list[RetrievalResult]:
return results
def rerank_results(
self,
results: list[RetrievalResult],
question: str,
) -> list[RetrievalResult]:
return results
def answer_directly(
self,
question: str,
results: list[RetrievalResult],
) -> str | None:
return None
2. Register the profile¶
Update:
src/githelp/project_profiles/factory.py
Add a branch for the profile name:
if profile_name == "example":
return ExampleProjectProfile()
3. Select the profile in config¶
Set the app config field:
project_profile: example
The profile is selected from an app-level config such as:
configs/app_config.yaml
Generated data/projects/<project_name>/project_config.yaml files describe
source paths but do not select a profile. The default app config remains set to
mmore, so switch it to generic or a custom profile when changing projects.
4. Add tests¶
Add focused tests under:
tests/
Useful tests include:
query expansion keeps important original terms;
filtering removes only the intended sources;
reranking moves expected sources upward;
direct answers return
Nonewhen evidence is insufficient.
For profile behavior that depends on retrieved sources, build DocumentRecord
and RetrievalResult fixtures directly. This keeps tests fast and independent
from MMORE indexes or local LLM models.