ვექტორული ძიება და ტექსტის დამუშავება
PRX მოიცავს ტექსტის დამუშავების პაიპლაინს, რომელიც სემანტიკური მეხსიერების ამოღებას აძლიერებს. ეს პაიპლაინი ამუშავებს ტექსტის ფრაგმენტაციას, ვექტორულ ემბედინგს, თემების ამოღებასა და შინაარსის ფილტრაციას -- ნედლ საუბრის ტექსტს ძიებად, ორგანიზებულ მეხსიერების ჩანაწერებად გარდაქმნის.
არქიტექტურა
ტექსტის დამუშავების პაიპლაინი ოთხი ეტაპისგან შედგება, თითოეული დამოუკიდებლად კონფიგურირებადი:
ნედლი ტექსტი
│
▼
┌──────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐
│ფრაგმენტატ│───►│ ემბედერი │───►│ თემების │───►│ ფილტრი │
│ორი │ │ │ │ ამომღები │ │ │
└──────────┘ └───────────┘ └───────────┘ └──────────┘
ტექსტის თითოეული თემის მიხედ. შენახვის
დაყოფა ფრაგმენტის კლასიფიკაცია გადაწყვეტ.
ფრაგმენტ. ვექტორიზაციავექტორული ძიება
ვექტორული ძიება საშუალებას იძლევა სემანტიკური მსგავსების ამოღება -- მოგონებების პოვნა, რომლებიც კონცეპტუალურად დაკავშირებულია შეკითხვასთან, თუნდაც ზუსტი სიტყვები განსხვავდებოდეს.
როგორ მუშაობს
- ინდექსირება -- თითოეული მეხსიერების ფრაგმენტი ემბედირდება მკვრივ ვექტორში (მაგ., 768 განზომილება)
- შენახვა -- ვექტორები ინახება ვექტორულ ინდექსში (sqlite-vec, pgvector ან მეხსიერებაში)
- შეკითხვა -- ძიების შეკითხვა ემბედირდება იმავე მოდელით
- ამოღება -- ინდექსი აბრუნებს top-K ვექტორებს კოსინუსური მსგავსებით
- ხელახალი რანჟირება -- არასავალდებულოდ, შედეგები ხელახლა რანჟირდება ჯვარ-კოდირებით უფრო მაღალი სიზუსტისთვის
კონფიგურაცია
[memory.vector]
enabled = true
index_type = "sqlite-vec" # "sqlite-vec", "pgvector", ან "memory"
similarity_metric = "cosine" # "cosine", "dot_product", ან "euclidean"
top_k = 10
similarity_threshold = 0.5
rerank = false
rerank_model = "cross-encoder/ms-marco-MiniLM-L-6-v2"ინდექსის ტიპები
| ინდექსის ტიპი | საცავი | მუდმივობა | საუკეთესო |
|---|---|---|---|
sqlite-vec | ლოკალური ფაილი | დიახ | ერთ-მომხმარებლიანი, ლოკალური განთავსებები |
pgvector | PostgreSQL | დიახ | მრავალ-მომხმარებლიანი, პროდაქშენ განთავსებები |
memory | პროცესში | არა (მხოლოდ სესია) | ტესტირება და ეფემერული სესიები |
კონფიგურაციის მითითება
| ველი | ტიპი | ნაგულისხმევი | აღწერა |
|---|---|---|---|
enabled | bool | true | ვექტორული ძიების ჩართვა ან გამორთვა |
index_type | String | "sqlite-vec" | ვექტორული ინდექსის ბექენდი |
similarity_metric | String | "cosine" | მანძილის მეტრიკა მსგავსების შედარებისთვის |
top_k | usize | 10 | შეკითხვაზე დასაბრუნებელი შედეგების რაოდენობა |
similarity_threshold | f64 | 0.5 | მინიმალური მსგავსების ქულა (0.0--1.0) შედეგებში ჩასართავად |
rerank | bool | false | ჯვარ-კოდერის ხელახალი რანჟირების ჩართვა გაუმჯობესებული სიზუსტისთვის |
rerank_model | String | "" | ჯვარ-კოდერის მოდელის სახელი (მხოლოდ rerank = true-ისას) |
ef_search | usize | 64 | HNSW ძიების პარამეტრი (უფრო მაღალი = უფრო ზუსტი, ნელი) |
ტექსტის ფრაგმენტაცია
ემბედინგამდე, გრძელი ტექსტი უფრო პატარა ფრაგმენტებად უნდა დაიყოს. PRX ორ ფრაგმენტაციის სტრატეგიას გვთავაზობს: ტოკენზე ორიენტირებულსა და სემანტიკურს.
ტოკენზე ორიენტირებული ფრაგმენტაცია
ტოკენზე ორიენტირებული ფრაგმენტაცია ყოფს ტექსტს ტოკენის საზღვრებზე, რათა თითოეული ფრაგმენტი ემბედინგ მოდელის კონტექსტის ფანჯარაში მოთავსდეს. იგი პატივს სცემს სიტყვისა და წინადადების საზღვრებს სიტყვის შუაში დაჭრის თავიდან ასაცილებლად.
[memory.chunker]
strategy = "token"
max_tokens = 512
overlap_tokens = 64
tokenizer = "cl100k_base" # OpenAI-თან თავსებადი ტოკენიზატორიალგორითმი:
- შეყვანილი ტექსტის ტოკენიზაცია კონფიგურირებული ტოკენიზატორით
- არაუმეტეს
max_tokensტოკენის ფრაგმენტებად დაყოფა - თითოეული ფრაგმენტი წინასთან
overlap_tokens-ით გადაიფარება კონტექსტის შესანარჩუნებლად საზღვრებზე - ფრაგმენტის საზღვრები წინადადების ან აბზაცის გადახვევებთან სწორდება, როდესაც ეს შესაძლებელია
სემანტიკური ფრაგმენტაცია
სემანტიკური ფრაგმენტაცია იყენებს ემბედინგის მსგავსებას ტექსტში ბუნებრივი თემატური საზღვრების საპოვნელად. ფიქსირებული ტოკენის რაოდენობაზე დაყოფის ნაცვლად, იგი ამოიცნობს, სად იცვლება თემა.
[memory.chunker]
strategy = "semantic"
max_tokens = 1024
min_tokens = 64
breakpoint_threshold = 0.3ალგორითმი:
- ტექსტის წინადადებებად დაყოფა
- თითოეული წინადადების ემბედინგის გამოთვლა
- თანმიმდევრულ წინადადებებს შორის კოსინუსური მსგავსების გამოთვლა
- მსგავსების
breakpoint_threshold-ზე ქვემოთ დავარდნისას, ფრაგმენტის საზღვრის ჩასმა - მცირე ფრაგმენტების (
min_tokens-ზე ქვემოთ) მიმდებარე ფრაგმენტებთან შერწყმა
ფრაგმენტაციის კონფიგურაციის მითითება
| ველი | ტიპი | ნაგულისხმევი | აღწერა |
|---|---|---|---|
strategy | String | "token" | ფრაგმენტაციის სტრატეგია: "token" ან "semantic" |
max_tokens | usize | 512 | მაქსიმალური ტოკენები ფრაგმენტზე |
overlap_tokens | usize | 64 | თანმიმდევრულ ფრაგმენტებს შორის გადაფარვა (მხოლოდ token სტრატეგია) |
tokenizer | String | "cl100k_base" | ტოკენიზატორის სახელი ტოკენების დასათვლელად |
min_tokens | usize | 64 | მინიმალური ტოკენები ფრაგმენტზე (მხოლოდ semantic სტრატეგია) |
breakpoint_threshold | f64 | 0.3 | მსგავსების ვარდნის ზღურბლი თემატური საზღვრებისთვის (მხოლოდ semantic სტრატეგია) |
სტრატეგიის არჩევა
| კრიტერიუმი | ტოკენზე ორიენტირებული | სემანტიკური |
|---|---|---|
| სიჩქარე | სწრაფი (ფრაგმენტაციისას ემბედინგის გამოძახებები არ არის) | ნელი (წინადადებაზე ემბედინგი საჭიროა) |
| ხარისხი | კარგი ერთგვაროვანი შინაარსისთვის | უკეთესი მრავალთემატური დოკუმენტებისთვის |
| პროგნოზირებადობა | თანმიმდევრული ფრაგმენტის ზომები | ცვალებადი ფრაგმენტის ზომები |
| გამოყენება | ჩატის ლოგები, მოკლე შეტყობინებები | გრძელი დოკუმენტები, შეხვედრის ჩანაწერები |
თემების ამოღება
PRX ავტომატურად ამოიღებს თემებს მეხსიერების ჩანაწერებიდან კატეგორიებად ორგანიზებისთვის. თემები აუმჯობესებს ამოღებას კონკრეტულ დომენებში ფილტრირებული ძიების საშუალებით.
როგორ მუშაობს
- ფრაგმენტაციის შემდეგ, თითოეული ფრაგმენტი ანალიზდება თემატური საკვანძო სიტყვებისა და სემანტიკური შინაარსისთვის
- თემების ამომღები ანიჭებს ერთ ან მეტ თემატურ ეტიკეტს კონფიგურირებადი ტაქსონომიიდან
- თემები ინახება მეხსიერების ჩანაწერთან ერთად მეტამონაცემების სახით
- გახსენებისას, შეკითხვებს შეუძლიათ არასავალდებულოდ ფილტრაცია თემით შედეგების შესავიწროვებლად
კონფიგურაცია
[memory.topics]
enabled = true
max_topics_per_entry = 3
taxonomy = "auto" # "auto", "fixed", ან "hybrid"
custom_topics = [] # მხოლოდ taxonomy = "fixed" ან "hybrid"-ისას
min_confidence = 0.6ტაქსონომიის რეჟიმები
| რეჟიმი | აღწერა |
|---|---|
auto | თემები დინამიურად გენერირდება შინაარსიდან. ახალი თემები იქმნება საჭიროებისამებრ. |
fixed | მხოლოდ custom_topics-იდან თემები ენიჭება. შინაარსი, რომელიც არცერთ თემას არ ემთხვევა, კატეგორიზებული არ რჩება. |
hybrid | უპირატესობას ანიჭებს custom_topics-ს, მაგრამ ქმნის ახალ თემებს, როდესაც შინაარსი არცერთ არსებულ ეტიკეტს არ ემთხვევა. |
თემების კონფიგურაციის მითითება
| ველი | ტიპი | ნაგულისხმევი | აღწერა |
|---|---|---|---|
enabled | bool | true | თემების ამოღების ჩართვა ან გამორთვა |
max_topics_per_entry | usize | 3 | მაქსიმალური თემატური ეტიკეტები მეხსიერების ჩანაწერზე |
taxonomy | String | "auto" | ტაქსონომიის რეჟიმი: "auto", "fixed", ან "hybrid" |
custom_topics | [String] | [] | მორგებული თემატური ეტიკეტები fixed/hybrid ტაქსონომიებისთვის |
min_confidence | f64 | 0.6 | მინიმალური ნდობის ქულა (0.0--1.0) თემის მინიჭებისთვის |
შინაარსის ფილტრაცია
ყველა შეტყობინება არ ღირს გრძელვადიან მეხსიერებაში შენახვა. შინაარსის ფილტრი ავტოშენახვის ევრისტიკებს იყენებს იმის გადასაწყვეტად, რომელი შინაარსი უნდა შეინახოს და რომელი უგულებელყოს.
ავტოშენახვის ევრისტიკები
ფილტრი აფასებს თითოეულ კანდიდატ მეხსიერების ჩანაწერს რამდენიმე კრიტერიუმის მიხედვით:
| ევრისტიკა | აღწერა | წონა |
|---|---|---|
| ინფორმაციის სიმკვრივე | უნიკალური ტოკენების თანაფარდობა მთლიან ტოკენებთან. დაბალი სიმკვრივის ტექსტი (მაგ., "კარგი", "მადლობა") ფილტრდება | მაღალი |
| სიახლე | მსგავსება არსებულ მოგონებებთან. უკვე შენახულთან ძალიან მსგავსი შინაარსი გამოტოვდება | მაღალი |
| შესაბამისობა | სემანტიკური მსგავსება მომხმარებლის ცნობილ ინტერესებთან და აქტიურ თემებთან | საშუალო |
| შესრულებადობა | სამოქმედო ელემენტების, გადაწყვეტილებების ან ვალდებულებების არსებობა (მაგ., "მე გავაკეთებ...", "მოდით გავაკეთოთ...") | საშუალო |
| სიახლის მიკერძოება | ბოლო კონტექსტს მაღალი წონა აქვს მოკლევადიანი შესაბამისობისთვის | დაბალი |
კომპოზიტური ქულა გამოითვლება შეწონილი ჯამის სახით. autosave_threshold-ზე დაბალი ქულის ჩანაწერები არ ინახება.
კონფიგურაცია
[memory.filter]
enabled = true
autosave_threshold = 0.4
novelty_threshold = 0.85 # გამოტოვება თუ >85% მსგავსია არსებულ მოგონებასთან
min_length = 20 # 20 სიმბოლოზე მოკლე ჩანაწერების გამოტოვება
max_length = 10000 # 10,000 სიმბოლოზე გრძელი ჩანაწერების მოკლება
exclude_patterns = [
"^(ok|thanks|got it|sure)$",
"^\\s*$",
]ფილტრის კონფიგურაციის მითითება
| ველი | ტიპი | ნაგულისხმევი | აღწერა |
|---|---|---|---|
enabled | bool | true | შინაარსის ფილტრაციის ჩართვა ან გამორთვა |
autosave_threshold | f64 | 0.4 | მინიმალური კომპოზიტური ქულა (0.0--1.0) მოგონების შესანახად |
novelty_threshold | f64 | 0.85 | მაქსიმალური მსგავსება არსებულ მოგონებებთან დედუპლიკაციამდე |
min_length | usize | 20 | მეხსიერების ჩანაწერის მინიმალური სიმბოლოების სიგრძე |
max_length | usize | 10000 | მაქსიმალური სიმბოლოების სიგრძე (გრძელი ჩანაწერები იკვეცება) |
exclude_patterns | [String] | [] | regex შაბლონები შინაარსისთვის, რომელიც არასოდეს უნდა შეინახოს |
სრული პაიპლაინის მაგალითი
სრული კონფიგურაცია ოთხივე ეტაპის კომბინაციით:
[memory]
backend = "embeddings"
[memory.embeddings]
provider = "ollama"
model = "nomic-embed-text"
dimension = 768
[memory.vector]
enabled = true
index_type = "sqlite-vec"
top_k = 10
similarity_threshold = 0.5
[memory.chunker]
strategy = "semantic"
max_tokens = 1024
min_tokens = 64
breakpoint_threshold = 0.3
[memory.topics]
enabled = true
taxonomy = "hybrid"
custom_topics = ["coding", "architecture", "debugging", "planning"]
[memory.filter]
enabled = true
autosave_threshold = 0.4
novelty_threshold = 0.85დაკავშირებული გვერდები
- მეხსიერების სისტემის მიმოხილვა
- ემბედინგების ბექენდი -- ემბედინგ პროვაიდერის კონფიგურაცია
- SQLite ბექენდი -- ლოკალური საცავი sqlite-vec ინდექსისთვის
- PostgreSQL ბექენდი -- საცავი pgvector ინდექსისთვის
- მეხსიერების ჰიგიენა -- შეკუმშვისა და გასუფთავების სტრატეგიები