mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-07-09 13:22:10 +02:00
240 lines
12 KiB
Markdown
240 lines
12 KiB
Markdown
|
|
# GraphRAG Utendaji Uboreshaji Maelezo ya Kiufundi
|
|||
|
|
|
|||
|
|
## Muhtasari
|
|||
|
|
|
|||
|
|
Maelezo haya yanaeleza uboreshaji kamili wa utendaji wa algorithm ya GraphRAG (Graph Retrieval-Augmented Generation) katika TrustGraph. Matumizi ya sasa yana vizuizi vya utendaji muhimu ambavyo hu limit scalability na muda wa majibu. Maelezo haya yanashughulikia maeneo manne makuu ya uboreshaji:
|
|||
|
|
|
|||
|
|
1. **Uboreshaji wa Ufuatiliaji wa Grafu**: Ondoa maswali ya hivi karibuni ya database na utumie utafiti wa kikundi.
|
|||
|
|
2. **Uboreshaji wa Utatuzi wa Labe**: Badilisha upataji wa mlolongo wa lebo kwa operesheni za sambamba/kikundi.
|
|||
|
|
3. **Uboreshaji wa Mkakati wa Kumbukumbu**: Implement caching kwa akili pamoja na uondoshaji wa LRU na utaratibu wa kupata data.
|
|||
|
|
4. **Uboreshaji wa Maswali**: Ongeza kumbukumbu ya matokeo na caching ya embeddings ili kuboresha muda wa majibu.
|
|||
|
|
|
|||
|
|
## Malengo
|
|||
|
|
|
|||
|
|
- **Punguza Idadi ya Maswali ya Database**: Punguza kwa 50-80% jumla ya maswali ya database kupitia kikundi na caching.
|
|||
|
|
- **Boresha Muda wa Majibu**: Lenga ujenzi wa subgraph wa haraka 3-5x na utatuzi wa lebo wa haraka 2-3x.
|
|||
|
|
- **Boresha Scalability**: Unga grafu kubwa zaidi za maarifa na usimamizi bora wa kumbukumbu.
|
|||
|
|
- **Dumishe Usahihi**: Dumishe utendakazi na ubora wa matokeo ya GraphRAG iliyopo.
|
|||
|
|
- **Wezesha Ujazo**: Boresha uwezo wa usindikaji sambamba kwa maombi mengi sambamba.
|
|||
|
|
- **Punguza Uwepo wa Kumbukumbu**: Implement miundo ya data na usimamizi wa kumbukumbu bora.
|
|||
|
|
- **Ongeza Ufuatiliaji**: Jumuisha metriki za utendaji na uwezo wa ufuatiliaji.
|
|||
|
|
- **Hakikisha Utiaji Njia**: Ongeza utunzaji sahihi wa makosa na mitaratibu ya muda.
|
|||
|
|
|
|||
|
|
## Asili
|
|||
|
|
|
|||
|
|
Matumizi ya sasa ya GraphRAG katika `trustgraph-flow/trustgraph/retrieval/graph_rag/graph_rag.py` ina masuala muhimu ya utendaji ambayo yanaathiri sana scalability ya mfumo:
|
|||
|
|
|
|||
|
|
### Matatizo ya Sasa ya Utendaji
|
|||
|
|
|
|||
|
|
**1. Ufuatiliaji Usio na Ufanisi wa Grafu (`follow_edges` function, mistari 79-127)**
|
|||
|
|
- Hufanya maswali 3 tofauti ya database kwa kila entiti kwa kila ngazi.
|
|||
|
|
- Mfumo wa swali: maswali yanayozingatia mada, yanayozingatia predikat, na yanayozingatia kitu kwa kila entiti.
|
|||
|
|
- Hakuna kikundi: Kila swali hutumia entiti moja tu wakati mmoja.
|
|||
|
|
- Hakuna ugunduzi wa mzunguko: Inaweza kutembelea nodi sawa mara nyingi.
|
|||
|
|
- Matumizi ya recursive bila kumbukumbu hupelekea utata wa kielelekeo.
|
|||
|
|
- Utata wa muda: O(entities × max_path_length × triple_limit³)
|
|||
|
|
|
|||
|
|
**2. Utatuzi Mfululizo wa Labe (`get_labelgraph` function, mistari 144-171)**
|
|||
|
|
- Hufanya usindikaji wa kila sehemu ya triple (mada, predikat, kitu) mfululizo.
|
|||
|
|
- Kila wito wa `maybe_label` inaweza kusababisha swali la database.
|
|||
|
|
- Hakuna utekelezaji au kikundi sambamba wa maswali ya lebo.
|
|||
|
|
- Hupelekea hadi simu 3 × subgraph_size za database.
|
|||
|
|
|
|||
|
|
**3. Mkakati wa Msingi wa Kumbukumbu (`maybe_label` function, mistari 62-77)**
|
|||
|
|
- Cache rahisi ya kamusi bila mipaka ya saizi au TTL.
|
|||
|
|
- Hakuna sera ya kuondolewa kwa cache hupelekea ukuaji usio na kikomo wa kumbukumbu.
|
|||
|
|
- Upotezaji wa cache husababisha maswali ya database ya kibinafsi.
|
|||
|
|
- Hakuna kupata data au uongezaji mahiri wa cache.
|
|||
|
|
|
|||
|
|
**4. Mfumo Usio bora wa Maswali**
|
|||
|
|
- Maswali ya ufanano wa vector ya entiti hayahifadhiwi kati ya maombi sawa.
|
|||
|
|
- Hakuna kumbukumbu ya matokeo kwa mifumo ya swali iliyorudiwa.
|
|||
|
|
- Uboreshaji wa maswali unokosekana kwa mifumo ya kawaida ya ufikiaji.
|
|||
|
|
|
|||
|
|
**5. Masuala Muhimu ya Muda wa Kitu (`rag.py:96-102`)**
|
|||
|
|
- **Kitu cha GraphRag kinaundwa kila maombi**: Instance mpya huundwa kwa kila swali, na kupoteza faida zote za cache.
|
|||
|
|
- **Kitu cha swali kina muda mfupi sana**: Huundwa na kuharibiwa ndani ya utekelezaji wa swali moja (mistari 201-207).
|
|||
|
|
- **Cache ya lebo huwezeshwa kila maombi**: Uongezaji wa cache na maarifa yaliyokusanywa hayapotei kati ya maombi.
|
|||
|
|
- **Utoaji wa upya wa mteja**: Wateja wa database wanaweza kuanzishwa tena kwa kila maombi.
|
|||
|
|
- **Uboreshaji usio na maombi**: Haiwezi kufaidika na mifumo ya swali au kushiriki matokeo.
|
|||
|
|
|
|||
|
|
### Uchambuzi wa Athari za Utendaji
|
|||
|
|
|
|||
|
|
Jalada la mbaya zaidi linalowezekana kwa swali la kawaida:
|
|||
|
|
- **Uongezaji wa Entiti**: Swali 1 la ufanano wa vector
|
|||
|
|
- **Ufuatiliaji wa Grafu**: entities × max_path_length × 3 × maswali ya triple_limit
|
|||
|
|
- **Utatuzi wa Labe**: maswali ya lebo ya `subgraph_size` × 3 ya kibinafsi
|
|||
|
|
|
|||
|
|
Kwa vigezo vya chagu msingi (entities 50, urefu wa njia 2, kikomo cha triple 30, saizi ya subgraph 150):
|
|||
|
|
- **Maswali ya chini**: 1 + (50 × 2 × 3 × 30) + (150 × 3) = **maswali 9,451 ya database**
|
|||
|
|
- **Muda wa majibu**: 15-30 sekunde kwa grafu za ukubwa wa wastani
|
|||
|
|
- **Matumizi ya kumbukumbu**: Ukuaji usio na kikomo wa cache baada ya muda
|
|||
|
|
- **Ufanisi wa cache**: 0% - caches huwezeshwa kila maombi
|
|||
|
|
- **Utoaji wa kitu**: Kitu cha GraphRag + Kitu cha swali kinaundwa/kuharibiwa kwa kila maombi
|
|||
|
|
|
|||
|
|
Maelezo haya yanashughulikia pengo hizi kwa kutumia maswali ya kikundi, caching kwa akili, na usindikaji sambamba. Kwa kuongeza ufanisi wa mifumo ya swali na ufikiaji wa data, TrustGraph inaweza:
|
|||
|
|
- Unga grafu kubwa za maarifa na milioni ya entiti
|
|||
|
|
- Kutoa muda wa majibu wa chini ya sekunde kwa swali la kawaida
|
|||
|
|
- Kushughulikia maombi ya GraphRAG ya sambamba mamia
|
|||
|
|
- Kuongezeka kwa ufanisi na saizi na utata wa grafu
|
|||
|
|
|
|||
|
|
## Ubunifu wa Kiufundi
|
|||
|
|
|
|||
|
|
### Usanifu
|
|||
|
|
|
|||
|
|
Uboreshaji wa utendaji wa GraphRAG unahitaji vipengele hivi vya kiufundi:
|
|||
|
|
|
|||
|
|
#### 1. **Urekebishaji wa Usanifu wa Muda wa Kitu**
|
|||
|
|
- **Fanya GraphRag kuwa wa muda mrefu**: Hamisha instance ya GraphRag hadi ngazi ya Processor ili kudumu katika maombi.
|
|||
|
|
- **Dumishe caches**: Dumishe cache ya lebo, cache ya embedding, na cache ya matokeo ya swali kati ya maombi.
|
|||
|
|
- **Boresha Kitu cha Swali**: Rekebisha Swali kama muktadha wa utekelezaji nyepesi, sio kontena ya data.
|
|||
|
|
- **Usaidizi wa miunganisho**: Dumishe miunganisho ya mteja wa database katika maombi.
|
|||
|
|
|
|||
|
|
Moduli: `trustgraph-flow/trustgraph/retrieval/graph_rag/rag.py` (imebadilishwa)
|
|||
|
|
|
|||
|
|
#### 2. **Njia Iliyo bora ya Ufuatiliaji wa Grafu**
|
|||
|
|
- Badilisha `follow_edges` ya recursive na utafutaji wa msingi wa upana wa iterative
|
|||
|
|
- Implement utunzaji wa kikundi wa entiti katika kila ngazi ya utafutaji
|
|||
|
|
- Ongeza ugunduzi wa mzunguko kwa kufuatilia nodi zilizotembelea
|
|||
|
|
- Jumuisha kumalizika mapema wakati mipaka inafikiwa
|
|||
|
|
|
|||
|
|
Moduli: `trustgraph-flow/trustgraph/retrieval/graph_rag/optimized_traversal.py`
|
|||
|
|
|
|||
|
|
#### 3. **Mfumo Sambamba wa Utatuzi wa Labe**
|
|||
|
|
- Kundi maswali ya lebo kwa entiti nyingi wakati mmoja
|
|||
|
|
- Implement mifumo ya async/kusubiri kwa ufikiaji wa sambamba wa database
|
|||
|
|
- Ongeza kupata data mahiri kwa mifumo ya kawaida ya lebo
|
|||
|
|
- Jumusha mikakati ya uongezaji wa lebo
|
|||
|
|
|
|||
|
|
Moduli: `trustgraph-flow/trustgraph/retrieval/graph_rag/label_resolution.py`
|
|||
|
|
|
|||
|
|
#### 4. **Mkakati wa Kina wa Kumbukumbu**
|
|||
|
|
- Implement cache ya LRU na TTL
|
|||
|
|
- Zana za ufuatiliaji wa utendaji wa cache
|
|||
|
|
- Usalama wa maswali na utunzaji wa rasilimali
|
|||
|
|
|
|||
|
|
**Mbinu ya Ufuatiliaji ya Kumbukumbu**:
|
|||
|
|
```python
|
|||
|
|
class LRUCacheWithTTL:
|
|||
|
|
def __init__(self, max_size: int, default_ttl: int = 3600):
|
|||
|
|
self.cache = OrderedDict()
|
|||
|
|
self.max_size = max_size
|
|||
|
|
self.default_ttl = default_ttl
|
|||
|
|
self.access_times = {}
|
|||
|
|
|
|||
|
|
async def get(self, key: str) -> Optional[Any]:
|
|||
|
|
if key in self.cache:
|
|||
|
|
# Check TTL expiration
|
|||
|
|
if time.time() - self.access_times[key] > self.default_ttl:
|
|||
|
|
del self.cache[key]
|
|||
|
|
del self.access_times[key]
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
# Move to end (most recently used)
|
|||
|
|
self.cache.move_to_end(key)
|
|||
|
|
return self.cache[key]
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
async def put(self, key: str, value: Any):
|
|||
|
|
if key in self.cache:
|
|||
|
|
self.cache.move_to_end(key)
|
|||
|
|
else:
|
|||
|
|
if len(self.cache) >= self.max_size:
|
|||
|
|
# Remove least recently used
|
|||
|
|
oldest_key = next(iter(self.cache))
|
|||
|
|
del self.cache[oldest_key]
|
|||
|
|
del self.access_times[oldest_key]
|
|||
|
|
|
|||
|
|
self.cache[key] = value
|
|||
|
|
self.access_times[key] = time.time()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 5. **Uboreshaji wa Swali na Ufuatiliaji**
|
|||
|
|
- **Ukusanyaji wa Metriki za Utendaji**:
|
|||
|
|
- **Upekuzi na Muda**:
|
|||
|
|
- **Usimamizi wa Rasilimali**:
|
|||
|
|
- **Ufuatiliaji**:
|
|||
|
|
|
|||
|
|
**Muda wa Majibu**:
|
|||
|
|
- Ufuatiliaji wa utendaji wa GraphRAG
|
|||
|
|
- Ufuatiliaji wa maswali ya database
|
|||
|
|
- Ufuatiliaji wa matumizi ya kumbukumbu
|
|||
|
|
- Ufuatiliaji wa utekelezaji wa maombi
|
|||
|
|
|
|||
|
|
## Mkakati wa Kujaribu
|
|||
|
|
|
|||
|
|
### Kujaribu Kawaida
|
|||
|
|
- Kujaribu sehemu kwa sehemu kwa utafutaji, caching, na utatuzi wa lebo
|
|||
|
|
- Ujaribu bandia wa mashambulio ya database kwa utendaji
|
|||
|
|
- Kujaribu cache ya uondoshaji na utekelezaji wa TTL
|
|||
|
|
- Kujaribu utunzaji na muda wa makosa
|
|||
|
|
|
|||
|
|
### Kujaribu Kuunganisha
|
|||
|
|
- Kujaribu swali la GraphRAG kamili na uboreshaji
|
|||
|
|
- Kujaribu mashambulio ya database ya kweli
|
|||
|
|
- Kujaribu uendeshaji sambamba na usimamizi wa rasilimali
|
|||
|
|
- Kujaribu ugunduzi na usimamizi wa rasilimali
|
|||
|
|
- Kujaribu utangamano na API iliyopo ya GraphRAG
|
|||
|
|
- Kujaribu na nyuma tofauti za database
|
|||
|
|
- Kuhakikisha usahihi wa matokeo ikilinganisha na utumizi wa sasa
|
|||
|
|
|
|||
|
|
### Kujaribu Utendaji
|
|||
|
|
- Kujaribu utendaji dhidi ya utumizi wa sasa
|
|||
|
|
- Kujaribu mzigo kwa saizi tofauti na utata wa grafu
|
|||
|
|
- Kujaribu shinikizo kwa mipaka ya kumbukumbu na muunganisho
|
|||
|
|
- Kujaribu utangamano kwa uboreshaji wa utendaji
|
|||
|
|
|
|||
|
|
### Kujaribu Utangamano
|
|||
|
|
- Hakikisha utangamano wa API ya GraphRAG iliyopo
|
|||
|
|
- Jaribu na nyuma tofauti za database
|
|||
|
|
- Hakikisha usahihi wa matokeo ikilinganisha na utumizi wa sasa
|
|||
|
|
|
|||
|
|
## Mpango wa Utekelezaji
|
|||
|
|
|
|||
|
|
### Njia ya Utekelezaji Moja kwa Moja
|
|||
|
|
Kwa kuwa API zinaidhinishwa kubadilika, implement uboreshaji moja kwa moja bila utata wa uhamishaji:
|
|||
|
|
|
|||
|
|
1. **Badilisha njia ya `follow_edges`**: Andika upya na utafutaji ulioidhinishwa wa kikundi
|
|||
|
|
2. **Boresha `get_labelgraph`**: Implement utatuzi sambamba wa lebo
|
|||
|
|
3. **Ongeza GraphRag ya muda mrefu**: Badilisha Processor ili itumie instance ya GraphRag iliyodumu
|
|||
|
|
4. **Implement cache ya lebo**: Ongeza safu ya caching kwenye darasa la GraphRag
|
|||
|
|
|
|||
|
|
### Nguvu ya Marekebisho
|
|||
|
|
- **Darasa la swali**: Badilisha ~50 mistari katika `follow_edges`, ongeza ~30 mistari ya utunzaji wa kikundi
|
|||
|
|
- **Darasa la GraphRag**: Ongeza safu ya caching (~40 mistari)
|
|||
|
|
- **Darasa la Processor**: Badilisha ili utumie instance ya GraphRag iliyodumu (~20 mistari)
|
|||
|
|
- **Jumla**: ~140 mistari ya mabadiliko iliyolengwa, haswa ndani ya madarasa yaliyopo
|
|||
|
|
|
|||
|
|
## Ratiba
|
|||
|
|
|
|||
|
|
**Wiki ya 1: Utumizi wa Msingi**
|
|||
|
|
- Badilisha `follow_edges` na utafutaji wa kikundi wa iterative
|
|||
|
|
- Implement utatuzi wa sambamba wa lebo katika `get_labelgraph`
|
|||
|
|
- Ongeza instance ya GraphRag iliyodumu kwa Processor
|
|||
|
|
- Implement safu ya caching ya lebo
|
|||
|
|
|
|||
|
|
**Wiki ya 2: Kujaribu na Kuunganisha**
|
|||
|
|
- Kujaribu kawaida kwa mantiki mpya ya utafutaji na caching
|
|||
|
|
- Kujaribu utendaji dhidi ya utumizi wa sasa
|
|||
|
|
- Kujaribu kuunganisha na data ya grafu ya kweli
|
|||
|
|
- Tathmini ya msimamizi wa msimamizi wa msimamizi wa msimamizi wa msimamizi
|
|||
|
|
- Kujaribu utangamano
|
|||
|
|
|
|||
|
|
**Wiki ya 3: Utekelezaji**
|
|||
|
|
- Tepeleza utumizi uliorekebishwa
|
|||
|
|
- Fuatilia uboreshaji wa utendaji
|
|||
|
|
- Rekebisha TTL ya cache na saizi za kikundi kulingana na matumizi halisi
|
|||
|
|
|
|||
|
|
## Maswali Yaliyofungwa
|
|||
|
|
|
|||
|
|
- **Pooli ya Muunganisho wa Database**: Je, tunapaswa kutumia pooli ya muunganisho ya database maalum au kutegemea pooli ya mteja wa database iliyopo?
|
|||
|
|
- **Usaidizi wa Kumbukumbu**: Je, cache ya lebo na ya embedding inapaswa kuendelea katika kuchelewesha huduma?
|
|||
|
|
- **Kumbukumbu Iliyosambaa**: Kwa usimamizi wa idadi nyingi, je, tunapaswa kutumia kumbukumbu iliyosambaa kwa Redis/Memcached?
|
|||
|
|
- **Umbizo la Matokeo ya Swali**: Je, tunapaswa kuongeza ufanisi wa uwakilishi wa ndani wa triple kwa ufanisi bora wa kumbukumbu?
|
|||
|
|
- **Uunganisho wa Ufuatiliaji**: Metriki gani zinapaswa kuonyeshwa kwenye mifumo ya ufuatiliaji iliyopo (Prometheus, n.k.)?
|
|||
|
|
|
|||
|
|
## Marejeleo
|
|||
|
|
|
|||
|
|
- [Utekelezaji wa awali wa GraphRAG](trustgraph-flow/trustgraph/retrieval/graph_rag/graph_rag.py)
|
|||
|
|
- [Kanuni za Usanifu za TrustGraph](architecture-principles.md)
|
|||
|
|
- [Maelezo ya Usimamizi wa Mkusanyiko](collection-management.md)
|