โครงการขนาดเล็กนี้มีจุดมุ่งหมายเพื่อรวมรายการบล็อก WordPress ไว้ในฐานความรู้ที่ใช้เทคนิคการดึงข้อมูล-Augmented Generation (RAG)
สถานที่ตั้งของโปรเจ็กต์นี้เรียบง่าย - ชุดสคริปต์จะดำเนินการเฉพาะผ่านทางบรรทัดคำสั่ง แต่ละสคริปต์มีความสมบูรณ์ในตัวเอง ซึ่งช่วยให้แสดงแต่ละการกระทำภายในบริบทของตัวเองได้ค่อนข้างเรียบง่าย
ตามค่าเริ่มต้น สคริปต์ที่รวมไว้จะใช้ไลบรารีและโมเดลโอเพ่นซอร์สฟรี แม้ว่าจะมีตัวเลือกในการใช้ LLM ของ OpenAI หากคุณมีสิทธิ์เข้าถึง ตัวอย่างนี้ควรจะสามารถทำงานบน CPU ได้หากคุณไม่มี GPU ที่รองรับ แต่เป็น YMMV
RAG ใช้สององค์ประกอบ: ระบบการดึงข้อมูลและแบบจำลองภาษาเชิงกำเนิด เอกสารการสืบค้นของระบบการสืบค้นที่เกี่ยวข้องกับการสืบค้นจากที่เก็บข้อมูล / ฐานความรู้ (เช่น คอลเลกชันของโพสต์ในบล็อก) เอกสารที่ดึงมาจะถูกป้อนเข้าสู่โมเดลภาษา ซึ่งสร้างการตอบกลับที่มีข้อมูลสำหรับผู้ใช้ ประโยชน์หลักประการหนึ่งของการใช้ RAG คือช่วยให้ระบบ AI ขยายไปไกลกว่าข้อมูลการฝึกอบรมโดยไม่จำเป็นต้องปรับแต่งหรือฝึกอบรมใหม่ - สามารถเพิ่มและอัปเดตข้อมูลในที่เก็บข้อมูลแบบไดนามิกได้ ผลลัพธ์การสืบค้นสามารถไม่เพียงแต่รวมถึงข้อความที่มาจากโมเดลภาษาเท่านั้น แต่ยังรวมไปถึงคอลเลกชันของเอกสารหรือแหล่งข้อมูลที่เกี่ยวข้องด้วย คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ RAG ได้ที่ IBM Research Blog
นี่เป็นโครงการที่ค่อนข้างง่ายในการเริ่มต้นและดำเนินการ...
ขั้นแรกให้ตั้งค่าสภาพแวดล้อมเสมือนของโปรเจ็กต์และเปิดใช้งาน
python3 -m venv virtualenv
source ./virtualenv/bin/activate
คุณสามารถติดตั้งการขึ้นต่อกันทั้งหมดสำหรับโปรเจ็กต์นี้ได้โดยใช้ไฟล์ requirements.txt
หากคุณทำเช่นนั้น ไม่จำเป็นต้องติดตั้งแพ็คเกจอื่นด้วยตนเองผ่าน pip
ในเอกสารนี้
pip install -r requirements.txt
สร้างไฟล์ .env
โดยใช้ env.example
เป็นแนวทาง
cp env.example .env
นี่จะเป็นสิ่งสำคัญสำหรับการดาวน์โหลดข้อมูล WordPress ของคุณ อย่าลืมคัดลอกชื่อผู้ใช้ Wordpress รหัสผ่านแอปพลิเคชัน และโดเมนบล็อกของคุณลงใน . .env
หมายเหตุ: การดำเนินการนี้จะถือว่าบล็อกอยู่ที่เส้นทางราก
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
ดาวน์โหลดเนื้อหา WordPress ไปยังไดเร็กทอรี ./data
(ซึ่งถือว่าบล็อกของคุณอยู่ที่รูทโดเมนในตอนนี้):
python3 wordpress-dl.py
PGVector ใช้สำหรับจัดเก็บและค้นหาข้อความที่ฝัง (เวกเตอร์) ในฐานข้อมูล Postgresql ข้อดีประการหนึ่งของ PGVector คือสามารถเพิ่มลงในระบบฐานข้อมูลที่มีอยู่ได้ และไม่ต้องใช้ผลิตภัณฑ์ของบริษัทอื่นที่เป็นกรรมสิทธิ์
สำหรับการสนับสนุนการฝัง pgvector:
pip install pgvector psycopg2-binary
ตรวจสอบให้แน่ใจว่าคุณมีค่า .env
ที่เหมาะสม แม้ว่าค่าเริ่มต้นจะดีสำหรับการพัฒนาในท้องถิ่น แต่ก็มีโอกาสที่คุณอาจมีสิ่งที่แตกต่างออกไปหากใช้ฐานข้อมูล Postgres ที่มีอยู่ (เช่น ไม่ได้เรียกใช้อิมเมจนักเทียบท่า) ที่นี่ เราใช้อิมเมจ Docker เพื่อให้การตั้งค่าง่ายขึ้น แต่คุณสามารถใช้อินสแตนซ์ PostgreSQL อื่นได้อย่างง่ายดายหากคุณสามารถเพิ่มและโหลดส่วนขยาย pgvector ได้ด้วยตัวเอง
หากต้องการเรียกใช้อิมเมจนักเทียบท่าใน ./postgres
:
docker compose up
เรียกใช้สคริปต์การฝังเพื่อดาวน์โหลด WordPress และบันทึกการฝังลงในฐานข้อมูล postgres การดำเนินการนี้อาจใช้เวลาสักครู่ _หากคุณต้องการแทรกข้อมูลลงในฐานข้อมูล กล่าวคือ ล้างข้อมูลและเริ่มต้นด้วยข้อมูลที่สะอาด ให้ส่งผ่านอาร์กิวเมนต์ --embed
CLI:
python3 embed.py --embed
ตามค่าเริ่มต้นจะมีการแทรกเพียง 1 เรคคอร์ดสำหรับการทดสอบ (เช่น โดยไม่ระบุ --limit
แล้วตามด้วยจำนวนเต็ม > 1 มันจะสร้างเฉพาะเวกเตอร์ที่ฝังสำหรับเรคคอร์ดแรก) - ดังนั้นคุณจึงสามารถทดสอบได้ง่ายขึ้นโดยไม่ต้องใช้เวลาคำนวณเพิ่มเติมมากเกินไป
หากคุณอยากรู้ข้อมูลเพิ่มเติม ให้ส่ง --verbose
ตัวอย่างการร้องขออาจมีลักษณะดังนี้:
python3 embed.py --verbose --embed --limit 100
...แต่เพิ่มขีดจำกัดของคุณให้เหมาะสมกับบล็อก WordPress ของคุณ ไม่มีปัญหาหากตัวเลขมากกว่าจำนวนรายการ - ก็ฉลาดพอที่จะนำเข้าได้ถึงจำนวนบันทึกสูงสุด
Repo นี้สาธิตกรณีการใช้งานทั้งแบบโลคัลและแบบ API ข้อดีประการหนึ่งของโมเดลที่ดำเนินการในพื้นที่คือข้อมูลของคุณยังคงเป็นส่วนตัวและจะไม่ถูกนำมาใช้ในการฝึกโมเดลของผู้อื่น นอกจากนี้ ประสิทธิภาพบางอย่างอาจเพิ่มขึ้นด้วยการเก็บคำค้นหาไว้ภายในเซิร์ฟเวอร์หรือเครือข่าย แต่ก็ไม่ทำให้ต้นทุนการใช้งาน API บนระบบที่โฮสต์เอง ในทางกลับกัน อาจต้องการการใช้ API เนื่องจาก OpenAI มีหน้าต่างบริบทที่ใหญ่กว่าโมเดลที่ใช้ในโปรเจ็กต์นี้มาก และโมเดล OpenAI ก็ค่อนข้างดี
การใช้โมเดลภาษาท้องถิ่นจะต้องมีแพ็คเกจ trsnformers
python และ pytorch ( torch
)
pip install transformers torch llama-cpp-python
ถัดไป ดาวน์โหลดโมเดลที่ใช้ในแนวทางออฟไลน์นี้ เนื่องจากโมเดลภาษาอาจมีขนาดใหญ่ (หลาย GB) ฉันจึงเลือกโมเดลลามะที่เล็กกว่าที่สาธิต แม้แต่โมเดลขนาดเล็กก็สามารถใช้ได้ แต่บ่อยครั้งอาจถึงขีดจำกัดของหน้าต่างบริบท ซึ่งสามารถบรรเทาได้ แต่อยู่นอกขอบเขตของโปรเจ็กต์นี้ โครงการนี้ใช้ TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(หากคุณไม่ได้ติดตั้ง huggingface-cli
คุณสามารถดูรายละเอียดได้ที่นี่)
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
คำสั่งนี้จะดาวน์โหลดโมเดลไปยังไดเร็กทอรีแคชของบัญชีผู้ใช้ และจะเชื่อมโยงจากไดเร็กทอรีโมเดล
เมื่อดาวน์โหลดโมเดลแล้ว คุณสามารถเรียกใช้การอนุมานเฉพาะที่ ซึ่งเป็นตัวเลือกเริ่มต้นได้ ดูส่วนถัดไป ค้นหา คำแนะนำ
จำเป็นต้องติดตั้งสำหรับการใช้งาน OpenAI API
pip install langchain_openai
ตรวจสอบให้แน่ใจว่าคุณได้บันทึกคีย์ OpenAI API ลงในไฟล์ .env
แล้ว คุณสามารถกำหนดค่าได้ในแท็บคีย์ API แพลตฟอร์ม OpenAI: OPENAI_API_KEY="...
เอกสาร (ที่ฝังและดึงข้อมูล อย่างไรก็ตาม) มีโครงสร้างทั่วไปดังต่อไปนี้ในโปรเจ็กต์นี้
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
ผลลัพธ์มักจะส่งคืนเป็น List
สิ่งอันดับ (idx, เอกสาร) ดังนั้นจึงเหมาะสมที่จะระบุในรายการ:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
ข้อมูลที่เป็นประโยชน์มากที่สุดสำหรับการเพิ่มการตอบสนองของ LLM จะรวมอยู่ในคุณสมบัติ metadata
ซึ่งเป็นพจนานุกรมของข้อมูลที่ป้อนเข้ามาระหว่างการฝัง
การเรียกใช้คำสั่งจาก CLI นั้นง่ายมาก ..
...โมเดลท้องถิ่น:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...ใช้ OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
สักพักก็คาดว่าจะเห็นการตอบรับเช่นนี้
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
มีข้อโต้แย้งเพิ่มเติมที่อาจเป็นประโยชน์เมื่อทดสอบข้อมูลและแบบจำลองของคุณ เรียกใช้ python3 query.py --help
เพื่อดูตัวเลือกเพิ่มเติม