# Octocode 0.20.0: Markdown เข้าสู่กราฟความรู้แล้ว

> Octocode 0.20.0 นำ Markdown เข้าสู่กราฟความรู้ของ GraphRAG โดยให้เอกสารเป็นโหนดและลิงก์ข้ามเอกสารเป็นความสัมพันธ์แบบ references ที่ระบุชนิด พร้อมแก้บั๊กที่ทำให้ความสัมพันธ์หายไปโดยไม่มีการแจ้งเตือนในโปรเจกต์ขนาดใหญ่ และลดการใช้หน่วยความจำขณะโหลดความสัมพันธ์ลงครึ่งหนึ่ง โอเพนซอร์สภายใต้ Apache-2.0

README อธิบายสถาปัตยกรรมของคุณ ส่วนโฟลเดอร์ docs อธิบายเหตุผลเบื้องหลังการตัดสินใจต่าง ๆ แต่จนถึงวันนี้ ไม่มีข้อมูลเหล่านั้นอยู่ในกราฟความรู้ของ Octocode เลย

**0.20.0 ปิดช่องว่างนี้: ตอนนี้ไฟล์ Markdown เป็นโหนดในกราฟความรู้ของ GraphRAG และลิงก์ระหว่างเอกสารกลายเป็นความสัมพันธ์ `references` ที่ระบุชนิด ซึ่งผู้ช่วย AI สามารถไล่ตามได้จริง**

เรื่องนี้กวนใจผมมานานแล้ว Octocode _ค้นหา_ เอกสารของคุณได้เสมอ — semantic search ทำดัชนี Markdown มาตั้งแต่แรก แต่การหาเอกสารด้วยคีย์เวิร์ดกับการ _ค้นพบ_ เอกสารนั้นด้วยการไล่ตามโครงสร้างของโปรเจกต์เป็นคนละเรื่องกัน ผู้ช่วยที่ถามว่า «มีอะไรขึ้นอยู่กับโมดูล payment บ้าง?» อาจเดินกราฟของโค้ดได้อย่างคล่องแคล่ว แต่กลับมองไม่เห็นบันทึกด้านสถาปัตยกรรมที่อยู่ห่างออกไปสามไดเรกทอรีและอธิบายว่า _ทำไม_ โมดูลจึงถูกออกแบบมาเช่นนั้น

โค้ดเล่าเรื่องได้เพียงครึ่งเดียว ตอนนี้กราฟรู้อีกครึ่งหนึ่งแล้ว

---

## สิ่งที่เปลี่ยนจริงๆ

สรุปสั้น ๆ: ระหว่างการทำดัชนี เอกสาร Markdown จะผ่านไปป์ไลน์ GraphRAG ชุดเดียวกับซอร์สโค้ด การคิวรีกราฟ การขยายความสัมพันธ์ และเครื่องมือ MCP `graphrag` จึงสามารถแสดงเอกสารควบคู่กับโค้ดได้ — ไม่ใช่ในฐานะการค้นหาแยก แต่เป็นส่วนหนึ่งของการสำรวจกราฟครั้งเดียวกัน

กลไกต่อไปนี้ทำให้ข้อมูลนั้นมีประโยชน์โดยไม่สร้างสัญญาณรบกวน:

**ลิงก์ข้ามเอกสารกลายเป็นความสัมพันธ์ `references`** เมื่อไฟล์ Markdown ลิงก์ไปยังอีกไฟล์หนึ่ง — `[see the guide](guide.md)` — Octocode จะบันทึก edge ที่ระบุชนิดไว้ระหว่างไฟล์ทั้งสอง ลิงก์แบบ relative จะ resolve จากตำแหน่งของไฟล์ที่มีลิงก์ ส่วน anchor fragment (`#section`) จะถูกตัดออก และ URL ภายนอกที่ขึ้นต้นด้วย `http://` หรือ `https://` จะถูกละเว้น โครงสร้างลิงก์ในเอกสารของคุณเป็นแผนที่มาโดยตลอด ตอนนี้กราฟอ่านแผนที่นั้นได้แล้ว

**ค่าน้ำหนักถูกกำหนดอย่างตั้งใจ** ในการสำรวจกราฟ `references` มีน้ำหนักความสำคัญ **0.6** — ต่ำกว่าความสัมพันธ์เชิงโครงสร้างของโค้ดอย่าง imports และ calls (0.7) แต่สูงกว่าความสัมพันธ์เชิงจัดระเบียบอย่างการอยู่ในไดเรกทอรีเดียวกัน (0.3) ลิงก์ระหว่างเอกสารจึงมีผลต่อทิศทางการขยายกราฟโดยไม่กลบโครงสร้างของโค้ด ลิงก์ระหว่างเอกสารสองฉบับคือการที่มนุษย์บอกว่า «สองสิ่งนี้เกี่ยวข้องกัน» นั่นเป็นสัญญาณที่มีความหมาย แต่ไม่เหมือนกับ call edge จริง ๆ และค่าน้ำหนักก็สะท้อนความแตกต่างนี้

**ไฟล์ `.markdown` ใช้ได้ทุกที่ที่ `.md` ใช้ได้** ทั้งใน semantic search และการเชื่อมต่อกับกราฟแบบใหม่ เป็นรายละเอียดเล็ก ๆ แต่ความไม่สอดคล้องนี้เคยสร้างปัญหาให้ repository เก่า

และส่วนที่ผมชอบที่สุดของการอัปเกรดคือ **คุณไม่ต้องทำดัชนีใหม่ตั้งแต่ต้น** เนื้อหา Markdown ถูกเก็บไว้ในบล็อกเอกสารของดัชนีอยู่แล้ว การสร้างกราฟใหม่จึงดึงข้อมูลนั้นจากฐานข้อมูลเดิมได้ทันที เพียงรัน `octocode index` หรือสร้างกราฟใหม่ เอกสารของคุณก็จะปรากฏในกราฟ

---

## บั๊กที่ซ่อนความสัมพันธ์โดยไม่ส่งสัญญาณเตือน

สำหรับบางคน การแก้บั๊กนี้สำคัญกว่าฟีเจอร์ใหม่เสียอีก

ตอนอ่านความสัมพันธ์กลับจาก LanceDB ระบบคืนค่าเพียงบางส่วนของ result set ที่บันทึกไว้ — batch ถัด ๆ มาถูกทิ้งแทนที่จะนำมาต่อกัน ในโปรเจกต์ขนาดเล็กคุณแทบไม่มีทางสังเกตเห็น แต่ในโปรเจกต์ขนาดใหญ่ การคิวรีกราฟอาจ **พลาดความสัมพันธ์ที่ควรมีอยู่โดยไม่มีการแจ้งเตือนใด ๆ**

«ไม่มีการแจ้งเตือน» คือประเด็นสำคัญ ไม่มี error ไม่มี warning มีเพียงกราฟที่ไม่ครบแต่ดูเหมือนครบ หากคุณเคยคิวรีกราฟของ repository ขนาดใหญ่แล้วคิดว่า «ตรงนี้น่าจะมี edge มากกว่านี้» บั๊กนี้น่าจะเป็นสาเหตุ ตอนนี้การสร้างหรือโหลดกราฟใหม่จะคืนชุดความสัมพันธ์ทั้งหมด

นอกจากนี้ยังมีการแก้ไขที่เกี่ยวข้องอีกสองรายการ:

- **หัวข้อ Markdown ไม่ปะปนอยู่ในดัชนี symbol ของโค้ดอีกต่อไป** ก่อนหน้านี้หัวข้อเอกสารถูกทำดัชนีเป็น «symbols» และกระบวนการ resolve import ไปจับคู่กับหัวข้อเหล่านั้น ทำให้เกิดตัวเลือกความสัมพันธ์ที่ไม่ควรมี ตอนนี้โหนด Markdown ถูกนำออกจากดัชนี symbol แล้ว แต่ยังคงเป็นส่วนหนึ่งของกราฟผ่านลิงก์ที่อิง path
- **โหนด Markdown resolve ด้วย path ไม่ใช่ symbol** ในขั้นตอนค้นหาความสัมพันธ์ที่ปรับประสิทธิภาพแล้ว เอกสารจะเข้าสู่กระบวนการ resolve ตาม path — ซึ่งตรงกับวิธีทำงานจริงของลิงก์เอกสาร — แทนการจับคู่ symbol ที่ออกแบบมาสำหรับโค้ด edge ระหว่างเอกสารจึงแม่นยำ ไม่ได้เกิดจากความบังเอิญอีกต่อไป

---

## ใช้หน่วยความจำเพียงครึ่งเดียวเมื่อโหลดความสัมพันธ์

ระหว่างการ flush ของ incremental indexing ความสัมพันธ์เดียวกันอาจถูกเขียนซ้ำในหลาย batch สำหรับโปรเจกต์ขนาดใหญ่ที่ใช้งานจริง loader จึงต้องอ่าน **575K แถวเพื่อแทนความสัมพันธ์ที่ไม่ซ้ำ 288K รายการ** — เกือบครึ่งหนึ่งของข้อมูลทั้งหมดเป็นรายการซ้ำ

ตอนโหลดกราฟ ระบบจะ deduplicate ความสัมพันธ์ด้วยชุดค่า `(source, target, type)` ซึ่งลดการใช้หน่วยความจำลงเกือบครึ่งและทำให้ทุก operation ที่ต้องวนผ่านกราฟทั้งชุดเร็วขึ้น เมื่อเอารายการซ้ำออก loader จะรายงานจำนวนที่ตัดทิ้ง คุณจึงตรวจสอบผลได้

ไม่ต้องเปลี่ยน config กราฟเพียงโหลดโดยใช้หน่วยความจำน้อยลง

---

## ทุกอย่างที่เหลือ

**MCP server อัปเกรดเป็น rmcp 3.0.0** SDK หลักของ Model Context Protocol เปลี่ยนเป็น major version ใหม่ ทำให้ Octocode ตามทันระบบนิเวศ MCP และการส่งข้อมูลแบบ streamable HTTP ทั้งโหมด server ผ่าน stdin และ HTTP ยังทำงานเหมือนเดิม — ไม่ต้องเปลี่ยน configuration

**การจัดการ config ย้ายไปอยู่ใน octolib** ตรรกะทั่วไปสำหรับจัดการไฟล์ config และย้ายข้อมูลระหว่างเวอร์ชัน — version walk, guards และ table merging — ตอนนี้อยู่ในไลบรารี `octolib` ที่ใช้ร่วมกัน ส่วน Octocode เก็บไว้เฉพาะขั้นตอนการย้าย v1→v2 ของตัวเอง สำหรับผู้ใช้ การเปลี่ยนแปลงนี้ไม่มีผลให้เห็น: config เดิมยังถูกย้ายเหมือนก่อนทุกประการ ข้อดีคือการแก้ไขระบบจัดการ config ทำเพียงครั้งเดียวใน octolib แล้วส่งผลถึงทุกเครื่องมือที่สร้างอยู่บนไลบรารีนี้ ไม่ต้องย้ายการแก้ไขทีละ repository

**เอกสารก็ได้รับการปรับปรุงเช่นกัน** ตอนนี้ README อธิบายเครื่องมือ MCP ทั้งหมด รวมถึงเครื่องมือที่ทำงานผ่าน LSP (`lsp_goto_definition`, `lsp_find_references`, `lsp_hover`, `lsp_document_symbols`, `lsp_workspace_symbols`, `lsp_completion`) และวิธีเปิดใช้ด้วย `--with-lsp` นอกจากนี้ยังมีคู่มือใหม่ที่ไม่ผูกกับผู้ให้บริการรายใด สำหรับเชื่อมต่อ Octocode กับ LLM หรือ embedding endpoint ที่รองรับ API แบบ OpenAI ไม่ว่าจะเป็น model server ในเครื่องหรือผู้ให้บริการ cloud รายอื่น

---

## อัปเกรด

```bash
# Homebrew
brew upgrade muvon/tap/octocode

# Universal installer
curl -fsSL https://raw.githubusercontent.com/Muvon/octocode/master/install.sh | sh

# Cargo
cargo install octocode --version 0.20.0
```

นี่คือการอัปเกรดแบบ drop-in — ไม่ต้องเปลี่ยน config และไฟล์ configuration เดิมจะถูกย้ายให้อัตโนมัติ หลังอัปเกรดมีเพียงอย่างเดียวที่ต้องทำ:

**สร้างกราฟใหม่** (หรือเพียงรัน `octocode index`) ในโปรเจกต์ที่มีเอกสารใช้งานจริง จากนั้นถามผู้ช่วยด้วยคำถามที่แต่ก่อนต้องอาศัยมนุษย์เชื่อมโยงโค้ดกับเอกสาร — «ระบบจัดการ authentication อยู่ที่ไหน และคู่มือความปลอดภัยอธิบายเรื่องนี้ไว้อย่างไร?» — แล้วดูว่าผู้ช่วยไล่ตามข้อมูลทั้งสองฝั่งได้อย่างไร

---

Octocode เป็นโครงการโอเพนซอร์สภายใต้ Apache 2.0 ที่ [github.com/Muvon/octocode](https://github.com/Muvon/octocode) และเป็นเอนจินค้นหาโค้ดเบื้องหลัง [Octomind](https://octomind.run) กราฟรู้อยู่แล้วว่าโค้ดของคุณเชื่อมโยงกันอย่างไร ตอนนี้มันยังรู้ด้วยว่าคุณเขียนอะไรเกี่ยวกับโค้ดเหล่านั้น
