Практычныя прытамулкі: Я паспрабаваў вікнуць свой база дадзеных вектараў. RAG стала набагато кращая з…
Практычныя прытамулкі: Я паспраўціў свой база дадзення вектараў. RAG стала набагато кращай за дапамогою контрактав, пераканаў і спецыяльных слотаў для коду, якія можна выкарыстоўваць командам, якія викорыстоўваюць гэты патэрн.
Наступныя прыміткі восстанавляюць практычны шлях, які можна адпрацаваць на прыкладзе тэксту “Я пазбіраў свой база дадзеных вектароў. RAG стала набагато кращай з PageIndex”. Акцэнс ставіцца на контракты, перакрычанняя і месцы для коду, які можна проста заместіць, а не на мотывацыйныя аспекты. Калі працуеце на стадіі агляду, спачатку запісайце контракт: неабяжныя вхідныя даны, сігнал успеху і тое, што вядзецца праз частковыя неудачы. Такі список перакрычанняя дапамагае заліцьваты пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія перакрычанняя і обробка некоректных паведамленняў є частью продукту, а не чымсь, што дадаецца пазнейш.
Основная міфацыя Vector RAG
Ключоўная міфія стаджовых роботах найкраща працюе, калі яе розглядаць як вимерную паверхню. Запісаўце адна «золатая» транскрыпцыя, адин прыклад неудачы і прыметку па вярнэнню да поперадньага стану пры розшырэнні масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Раздзеляйце правілы часткавання інфармацыі ад правіл яе выкарыстоўвання. Змена адных не павінна вымагаць перапісвання іншых, калі змянююцца паказнікі якосці.
PageIndex: RAG без базы дадзеных вектараў
PageIndex RAG без данага этапу працюе наяўней, калі яго спрыяваць як мерыемую паверхню. Зберажыце адна ідеальная транскрыпція, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Спрыявайце гэты этап як кантракт межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце критэрыя успеху і не падзеўляйцеся частым, непূরным выкананнем задачы. Раздзеліце правілы фрагментавання дадзеных і правілы ўзяць іх. Змена адных не павінна вымагаць перапісву іншых, калі зменяюцыся показнікі якосці.
Як працюе PageIndex: двухэтапны процес
Як працюе PageIndex: Этап працюе наяўней калі яго спрыяваць як мерыемую паверхню. Зберажыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Запісвайце часы выконання і косты токеноў або запытак праза функцыйнае рэзультат. Відразлівае паказанне костаў з’являецца перашкоду неспакою, калі процес пераходзіць з дэмовай среды ў спяльнаныя сераўы. Раздзеліце політыку часткавага оброблэння дадзеных ад політыкі ўтрымання іх. Змена адной з яных не павінна вымагаць перапісвы другой, калі зменяюцца паказнікі якосці. Як працюе PageIndex: Этап працюе наяўней калі яго спрыяваць як мерыемую паверхню. Зберажыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу дзеяння. Дакументавайце як правільны, так і альтернатыўны шляхы роботы. Перапрыбуткі, людзкі контроль і обробка некоректных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
Пачатак работы: Адкрыцце PageIndex локальна
У стадії «Пачатак роботы з PageIndex» неабяцо практычна вказаць інпуты, адміністратара крока та крэтыяры выходу пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына нехарактэрнай роботы должна вказываць на адзін конкрэтны элемент, а не на заплутаны ланцюг задач. Прыкладзіце фрагменты тексту, якія насправды лежаць у падставе адпаведнай адказы. Без ціх праменаванняў аператары не зможаць разлічыць галюцинацію ад працягу індексавання.
git clone https://github.com/VectifyAI/PageIndex.git
cd PageIndex
pip3 install --upgrade -r requirements.txt
CHATGPT_API_KEY=your_openai_api_key_here
python3 run_pageindex.py --pdf_path /path/to/annual_report.pdf
python3 run_pageindex.py --md_path /path/to/technical_spec.md
Як насправды выглядае індекс
У стадії «Што насправды ў індексе» неабходна пазначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння пры перадзеіснавленні коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Спрыяйце цій стадіі як даговору межаў вхідных даных і перакананых выходных рэзультатаў. Даць назвы артыфактам, пазначыць критэрыя успеху і не прымкнуцца да тыхнявага частковага завершэння. Указваць тыя часткі тексту, якія фактычна лежаць у падставе адпаведнай адказы. Без ціх цитатаў аператары не зможаць разлічыць галюцинацію ад прасоў у індексаванні.
{
"document": "Apple Inc. Annual Report 2023",
"index": {
"title": "Apple Inc. Annual Report 2023",
"summary": "Comprehensive financial and operational report covering revenue, product segments, risks, and strategic outlook",
"children": [
{
"title": "Business Overview",
"summary": "Company description, product lines, and market position",
"pages": [1, 8],
"children": [...]
},
{
"title": "Financial Results",
"summary": "Revenue, operating income, EPS, and segment performance for fiscal 2023",
"pages": [45, 72],
"children": [
{
"title": "Revenue by Product Category",
"summary": "iPhone, Mac, iPad, Wearables, and Services revenue breakdown",
"pages": [46, 52]
},
{
"title": "Geographic Revenue Distribution",
"summary": "Americas, Europe, Greater China, Japan, Rest of Asia Pacific",
"pages": [53, 58]
}
]
},
{
"title": "Risk Factors",
"summary": "Operational, market, regulatory, and competitive risks",
"pages": [89, 110]
}
]
}
}
Запыткі да індексу: як гэта працюе
У стадії «Запит даха індэксу» неабяжна практычна ваказваць параметры запыту, адпаведальнага за шаг і крэтыяры завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск шагу з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выконання і кост токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рашчыткам, калі процес пераходзіць з дэмовай среды ў спяльную. Указваць тые часткі тексту, якія фактычна лежалі в основе адпаведнай адказы. Без цых цітатаў аператары не можуць разлічыць галюцинацію ад прасоў у індэксаванні. У стадії «Запит даха індэксу» неабяжна практычна ваказваць параметры запыту, адпаведальнага за шаг і крэтыяры завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск шагу з вядомай точкі контролю, не падозрываючы прыхованы стан. Адначасова документаваць успешны і варыянт вяснавання проблем. Перапрыбуткі, людзкія перакрыцця і обробка нераспрацаваных паведамленняў є часткай продукту, а не чымсь, што дадаецца пазней.
import json
from openai import OpenAI
client = OpenAI()
def navigate_index(query: str, index_node: dict, depth: int = 0) -> list[dict]:
"""
Recursively navigate the document index using LLM reasoning.
Returns list of relevant leaf nodes with page references.
"""
children = index_node.get("children", [])
if not children:
# Leaf node: return this section as relevant
return [index_node]
# Ask the LLM which branches are relevant to the query
children_summary = "\n".join([
f"[{i}] {child['title']}: {child['summary']}"
for i, child in enumerate(children)
])
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": (
"You are navigating a document index to find sections relevant "
"to a query. Select the index numbers of sections that are likely "
"to contain the answer. Return a JSON array of selected indices."
)
},
{
"role": "user",
"content": (
f"Query: {query}\n\n"
f"Available sections:\n{children_summary}\n\n"
f"Which sections should I look into? Return JSON array of indices only."
)
}
],
temperature=0,
response_format={"type": "json_object"}
)
selected = json.loads(response.choices[0].message.content).get("indices", [])
relevant_nodes = []
for idx in selected:
if idx # Recurse into selected branches
relevant_nodes.extend(
navigate_index(query, children[idx], depth + 1)
)
return relevant_nodes
def answer_with_pageindex(query: str, index: dict, document_pages: dict) -> str:
"""
Full PageIndex retrieval and answer generation.
"""
# Navigate the index to find relevant sections
relevant_nodes = navigate_index(query, index)
# Retrieve full text from identified pages
context_parts = []
citations = []
for node in relevant_nodes:
pages = node.get("pages", [])
if pages:
page_start, page_end = pages[0], pages[1]
for page_num in range(page_start, page_end + 1):
if page_num in document_pages:
context_parts.append(document_pages[page_num])
citations.append(f"p.{page_num}")
context = "\n\n".join(context_parts)
# Generate answer with full, unchunked context
answer_response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": (
"Answer the question based on the provided document sections. "
"Be precise. If the answer involves numbers or dates, quote them exactly."
)
},
{
"role": "user",
"content": f"Document sections:\n{context}\n\nQuestion: {query}"
}
],
temperature=0
)
answer = answer_response.choices[0].message.content
citation_str = ", ".join(set(citations))
return f"{answer}\n\n**Source:** {citation_str}"
Рэзультат The FinanceBench, які прывёў мяне да уваги
Калі працуеце над стадіяй рэзультата The FinanceBench, спачатку запісайце контракт: неабяжныя даны, сігнал успеху і тое, што выходзіць, калі адбываецца частковая нявыплата. Такі список пераканае ў тым, што пазнейшыя змены коду будуць чыстымі. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшаў, нявыплата должна вказваць на адну адпаведальнасць, а не на заплутаны ланцужок задач. Перад налаштаваннем запитоў пераканайце рэверсію на фіксаваным наборы пытанняў. Частае змена запитоў рэдка калі-небудзь вылечвае слабую систему аднаходжэння інформацыі.
Калі вжываць PageIndex проты традыцыйнага RAG
Калі працюеце над этапам «Калі викорыстоўваць PageIndex», спачатку запісайце кантракт: неабходныя вхідныя даны, сигнал успеху і тое, што выходзіць у разе частковай нявыполненасці. Такі список пераконтроўваець дапамагае залічыць змяны ў кодзе пазней. Спрэцьвачайце гэты этап як кантракт межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыя успеху і не падзволяйце частковым завершэнням без паведамлення. Змяркуйце рівень запам’ятовання на фіксаванай сэтцы пытанняў прычым регулюванні запитоў. Частае змяненне запитоў рэдка калі вылечвае слабкую эфектыўнасць адзысквання інформаціі.
Викорыстоўванне API PageIndex Cloud
Калі працюеце над этапам «Іспытанне PageIndex Cloud», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцвачыць пазнейшыя змены ў кодзе. Запісвайце час выканання і вартасьць токена або запытку празаўсёды разам з рэзультатамі функцыйнасці. Відразлівае відображэння вартасцей запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмовай среды ў спяльнаныя сераўсы. Замерьце кантрольную дыяльнасць на фіксаванай сэтке запытаў прычымо да налаштавання підказак. Частае зменынне підказак рэдка калі-небудзь выправляе слабкія аспекты адналёгчэння даступу да інфармацыі. Калі працюеце над этапам «Іспытанне PageIndex Cloud», спачатку запісайце умовы викорыстання: неабяжлівыя даны, сигнал успеху і тое, што выходзіць у разе частковага невыпання. Такі список дапамагае заліцвачыць пазнейшыя змены ў кодзе. Аддзекументавайце як успішны, так і патэнцыйны шляхы рашэння проблем. Перапрыбуткі, людзкія контралі і обработка нераспакаваных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
import requests
PAGEINDEX_API_KEY = "your_api_key"
BASE_URL = "https://api.pageindex.ai/v1"
def upload_document(file_path: str) -> str:
"""Upload a document and get back a document_id."""
with open(file_path, "rb") as f:
response = requests.post(
f"{BASE_URL}/documents",
headers={"Authorization": f"Bearer {PAGEINDEX_API_KEY}"},
files={"file": f}
)
return response.json()["document_id"]
def query_document(document_id: str, question: str) -> dict:
"""Query an indexed document and get a cited answer."""
response = requests.post(
f"{BASE_URL}/query",
headers={
"Authorization": f"Bearer {PAGEINDEX_API_KEY}",
"Content-Type": "application/json"
},
json={
"document_id": document_id,
"question": question
}
)
return response.json()
# Example usage
doc_id = upload_document("q3_earnings_report.pdf")
result = query_document(doc_id, "What was total revenue in Q3?")
print(result["answer"])
print(f"Sources: {result['citations']}")
Глыбэйшыя змены, якія гэта прынесае
Этап глыбэйшых змян працюе найкраща, калі яго розглядаць як вимерную паверхню. Зафіксавце адна ідеальная версія, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес. Раздзеліце правіла часткавання інфармацыі ад правіл яе выявлення. Змена ў одных не должна прымусваць перапісванне іншых, калі змянююцца паказателі якосці.
Што гэта значыць, якщо вы зараз ствараеце системы AI для дакументаў
Этап «Што гэта значыць» працюе наякша, калі яго спрыяваць як мерыемую паверхню. Зафіксавце адны ідеальны прыклад, адну справу з неудачай і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Спрыяйце гэтам этапу як кантракту межа вхіднымі даннымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце критэрыі успеху і не падзейцеся тыхам частковым завершэнням без адзінаго заўважэння. Раздзеліце правілы часткавага апранкавання дадзеных і правілы ўтрымання іх. Змена адных не павінна прымусваць перапісванне іншых, калі змянююцца паказателі якосці.
Давайте продовжым развівацца разам
Этап «Давай продолжаем вучыцца» працюе наяўней, калі яго спрыяваць як мерыемую плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Запісвайце час выканання задач і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі процес пераходзіць з дэмовай среды ў спяльныя сераўы. Раздзеляйце правілы часткавага обробкі дадзеных і правілы ўзяць іх зборам. Змена аднаго з яных не павінна вымагаць перапісвы другога, калі зменяюцца паказнікі якосці. Этап «Давай продолжаем вучыцца» працюе наяўней, калі яго спрыяваць як мерыемую плошчу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Дакументавайце як успішны, так і вярнэнчы выкарыстоўвання процеса. Перапробаванні, людзкія контрольныя пункты і обробка некоректных дадзеных ўжо є частью продукту, а не чымсь, што дадаецца пазней.
Рэсурсы
Для стадіі Рэсурсаў неабходна прадзефінаваць вхідныя даны, адпаведальную особу за крок і крэтыяры завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан.
Чэк-ліст для аперацый
Для стадіі Чэк-ліста для аперацый неабходна прадзефінаваць вхідныя даны, адпаведальную особу за крок і крэтыяры завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан.
Зберагаеце настройкі зовні коду прыемліка. Файлы сераўнавальнага сэрвісу, храненні секретных дадзэнняў і флагі функцыйяй должны знаходзіцца ў аднам месцы, куды аператары можаюць пераглядаць іх без неабяжнай чытанняў усіх дадзэнняў.
Указывайце тыя часткі тексту, якія насправдзе лежаць у падставе адпаведнай адказу. Без ціх цытатаў аператары не можуць разлічыць галюцинацію ад працоўных недагэнак у індексаванні.
Напісце кароткі посібнік: як зменяць кантрольныя клучы, як спрачыслаць чергу, як анулюваць пярэдніе дадзеныя, якія былі прыемлены.
Документавайце як правільны, так і альтернатыўны паходы рашэння. Практыкі перапрыбутку, людзкі контроль і обработка некоректных дадзэнняў є часткай продукту, а не пасляднім дапрацоўкам.
Указывайце тыя часткі тексту, якія насправдзе лежаць у падставе адпаведнай адказу. Без ціх цытатаў аператары не можуць разлічыць галюцинацію ад працоўных недагэнак у індексаванні.
Перш чым запускать даную структуру, заморозьце версіі, зафіксавце «золаты» транскрыпты для критичных етапаў і паказвце способы вярнення да пачатковага стану. У спільных середавішчах неабходны ліміты швайнаў, перакананні ў належнасці тэрыторіі і чысткі власнік для змены секрэтных даных. Валіце надзейнасць працы над красавімі разовымі дэманстраціямі.
Прыметкі для 888b75aac33b: не кладзіце ключы прадаўцаў у репазітарый, задаце верхнюю межу токенаў на сесію і зберагачыце транскрыпты празаўседы ў фіксатыях для ацэнкі, каб пазнейшыя замены моделяў заставаліся пораўнанымі.