GoodAI-LTM จัดเตรียมตัวแทนด้วยหน่วยความจำระยะยาวแบบข้อความโดยการรวมองค์ประกอบที่สำคัญ เช่น โมเดลการฝังข้อความ การจัดอันดับใหม่ ฐานข้อมูลเวกเตอร์ การเขียนหน่วยความจำและแบบสอบถามใหม่ การแบ่งส่วนอัตโนมัติ เมตาดาต้าของก้อน และการขยายก้อน แพ็คเกจนี้ได้รับการออกแบบมาเป็นพิเศษเพื่อเสนอสตรีมหน่วยความจำแบบโต้ตอบเป็นศูนย์กลางสำหรับตัวแทนโซเชียล
นอกจากนี้ GoodAI-LTM ยังมีส่วนประกอบตัวแทนการสนทนา (LTMAgent) สำหรับการผสานรวมเข้ากับแอปที่ใช้ Python ได้อย่างราบรื่น
pip install goodai-ltm
เรียกวิธี reply
ของอินสแตนซ์ LTMAgent
เพื่อรับการตอบกลับจากเอเจนต์
from goodai.ltm.agent import LTMAgent
agent = LTMAgent(model="gpt-3.5-turbo")
response = agent.reply("What can you tell me about yourself?")
print(response)
พารามิเตอร์ model
สามารถเป็นชื่อของโมเดลใดๆ ที่ไลบรารี litellm สนับสนุน
ประวัติเซสชันจะได้รับการดูแลโดยอัตโนมัติโดยตัวแทน หากคุณต้องการเริ่มเซสชันใหม่ ให้เรียกใช้เมธอด new_session
agent.new_session()
print(f"Number of messages in session: {len(agent.session.message_history)}")
เจ้าหน้าที่มีหน่วยความจำการสนทนาและฐานความรู้ด้วย คุณสามารถบอกให้ตัวแทนเก็บความรู้ได้โดยการเรียกใช้เมธอด add_knowledge
agent.clear_knowledge()
agent.add_knowledge("The user's birthday is February 10.")
agent.add_knowledge("Refer to the user as 'boss'.")
response = agent.reply("Today is February 10. I think this is an important date. Can you remind me?")
print(response)
LTMAgent
คือระบบ RAG ที่ไร้รอยต่อ ตัวอย่าง ltm_agent_with_wiki แสดงวิธีเพิ่มบทความ Wikipedia ให้กับฐานความรู้ของตัวแทน
คุณสามารถคงการกำหนดค่าของเอเจนต์และความทรงจำ/ความรู้ของเอเจนต์ได้โดยการรับสถานะเป็นสตริงผ่านเมธอด state_as_text
state_text = agent.state_as_text()
# Persist state_text to secondary storage
หากต้องการสร้างตัวแทนจากข้อความสถานะ ให้เรียกใช้เมธอด from_state_text
agent2 = LTMAgent.from_state_text(state_text)
โปรดทราบว่าการดำเนินการนี้จะไม่คืนค่าเซสชันการสนทนา หากต้องการคงเซสชันการสนทนาให้เรียกเมธอด state_as_text
ของเซสชัน
from goodai.ltm.agent import LTMAgentSession
session_state_text = agent.session.state_as_text()
# session_state_text can be persisted in secondary storage
# The session.session_id field can serve as an identifier of the persisted session
# Now let's restore the session in agent2
p_session = LTMAgentSession.from_state_text(session_state_text)
agent2.use_session(p_session)
ข้อมูลโค้ดต่อไปนี้จะสร้างอินสแตนซ์ของ LTM โหลดข้อความบางส่วน จากนั้นดึงข้อความที่เกี่ยวข้องมากที่สุด (ส่วนที่ขยาย) จากการสืบค้น:
from goodai.ltm.mem.auto import AutoTextMemory
mem = AutoTextMemory.create()
mem.add_text("Lorem ipsum dolor sit amet, consectetur adipiscing elitn")
mem.add_text("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloren",
metadata={'title': 'My document', 'tags': ['latin']})
r_memories = mem.retrieve(query='dolorem eum fugiat quo voluptas nulla pariatur?', k=3)
สามารถสร้างอินสแตนซ์หน่วยความจำเริ่มต้นได้ดังนี้:
from goodai.ltm.mem.auto import AutoTextMemory
mem = AutoTextMemory.create()
คุณยังสามารถกำหนดค่าหน่วยความจำโดยส่งพารามิเตอร์ไปยังวิธี create
ในตัวอย่างต่อไปนี้ หน่วยความจำใช้โทเค็น "gpt2" สำหรับการแยกส่วน โมเดล T5 สำหรับการฝัง ดัชนี FAISS สำหรับการฝังพื้นที่เก็บข้อมูลแทนฐานข้อมูลเวกเตอร์แบบธรรมดา และการกำหนดค่าการแยกส่วนแบบกำหนดเอง
import torch
from transformers import AutoTokenizer
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
from goodai.ltm.mem.auto import AutoTextMemory
from goodai.ltm.mem.config import TextMemoryConfig
from goodai.ltm.mem.mem_foundation import VectorDbType
embedding_model = AutoTextEmbeddingModel.from_pretrained('st:sentence-transformers/sentence-t5-base')
tokenizer = AutoTokenizer.from_pretrained('gpt2')
config = TextMemoryConfig()
config.chunk_capacity = 30 # tokens
config.queue_capacity = 10000 # chunks
mem = AutoTextMemory.create(emb_model=embedding_model,
matching_model=None,
tokenizer=tokenizer,
vector_db_type=VectorDbType.FAISS_FLAT_L2,
config=config,
device=torch.device('cuda:0'))
เรียกใช้เมธอด add_text
เพื่อเพิ่มข้อความลงในหน่วยความจำ ข้อความอาจประกอบด้วยวลี ประโยค หรือเอกสาร
mem.add_text("Lorem ipsum dolor sit amet, consectetur adipiscing elitn")
ภายในหน่วยความจำจะแบ่งเป็นก้อนและจัดทำดัชนีข้อความโดยอัตโนมัติ
ข้อความสามารถเชื่อมโยงกับพจนานุกรมข้อมูลเมตาที่กำหนดเองได้ เช่น:
mem.add_text("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum doloren",
metadata={'title': 'My document', 'tags': ['latin']})
หน่วยความจำจะเชื่อมข้อความที่จัดเก็บโดยใช้ add_text
กับข้อความใดๆ ที่ส่งไปยังหน่วยความจำก่อนหน้านี้ แต่คุณสามารถเรียก add_separator
เพื่อให้แน่ใจว่าข้อความใหม่จะไม่ถูกเพิ่มลงในส่วนที่สร้างไว้ก่อนหน้านี้
หากต้องการดึงรายการข้อความที่เกี่ยวข้องกับข้อความค้นหา ให้เรียกวิธี retrieve
:
r_memories = mem.retrieve("What does Jake propose?", k=2)
เมธอด retrieve
ส่งคืนรายการอ็อบเจ็กต์ประเภท RetrievedMemory
ตามลำดับความเกี่ยวข้องจากมากไปหาน้อย แต่ละหน่วยความจำที่ดึงมามีคุณสมบัติดังต่อไปนี้:
passage
: ข้อความแห่งความทรงจำ ซึ่งสอดคล้องกับข้อความที่พบในส่วนที่ตรงกัน แต่อาจขยายได้โดยใช้ข้อความจากส่วนที่อยู่ติดกันtimestamp
: เวลา (วินาทีนับตั้งแต่ยุคโดยค่าเริ่มต้น) ที่สร้างส่วนที่ดึงข้อมูลมาdistance
: ระยะทางที่คำนวณระหว่างข้อความค้นหาและข้อความย่อยrelevance
: ตัวเลขระหว่าง 0 ถึง 1 แสดงถึงความเกี่ยวข้องของหน่วยความจำที่ดึงข้อมูลconfidence
: หากมีโมเดลการจับคู่ข้อความค้นหาและข้อความ นี่คือความน่าจะเป็นที่กำหนดโดยโมเดลmetadata
: ข้อมูลเมตาที่เกี่ยวข้องกับข้อความที่ดึงข้อมูล ถ้ามี โมเดลการฝังถูกโหลดดังนี้:
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
em = AutoTextEmbeddingModel.from_pretrained(model_name)
model_name
สามารถเป็นหนึ่งในรายการต่อไปนี้:
"st:"
เช่น "st:sentence-transformers/multi-qa-mpnet-base-cos-v1"
"flag:"
เช่น "flag:BAAI/bge-base-en-v1.5"
"openai:"
เช่น "openai:text-embedding-ada-002"
ชื่อ | รุ่นพื้นฐาน | #พารามิเตอร์ | #ที่เก็บข้อมูล |
---|---|---|---|
em-MiniLM-p1-01 | หลาย-qa-MiniLM-L6-cos-v1 | 22.7ม | 1 |
em-MiniLM-p3-01 | หลาย-qa-MiniLM-L6-cos-v1 | 22.7ม | 3 |
em-distilroberta-p1-01 | ประโยคหม้อแปลง/ทั้งหมด-distrilroberta-v1 | 82.1ม | 1 |
em-distilroberta-p3-01 | ประโยคหม้อแปลง/ทั้งหมด-distrilroberta-v1 | 82.1ม | 3 |
em-distilroberta-p5-01 | ประโยคหม้อแปลง/ทั้งหมด-distrilroberta-v1 | 82.1ม | 5 |
หากต้องการรับการฝังสำหรับรายการแบบสอบถาม ให้เรียกเมธอด encode_queries
ดังต่อไปนี้:
r_emb = em.encode_queries(['hello?'])
สิ่งนี้จะส่งคืนอาร์เรย์ที่เป็นตัวเลข หากต้องการรับ Pytorch tensor ให้เพิ่มพารามิเตอร์ convert_to_tensor
:
r_emb = em.encode_queries(['hello?'], convert_to_tensor=True)
หากต้องการรับการฝังสำหรับรายการข้อความ ให้เรียกใช้เมธอด encode_corpus
ดังนี้
s_emb = em.encode_corpus(['it was...', 'the best of...'])
ข้อความค้นหาและข้อความสามารถมีการฝังได้มากกว่าหนึ่งรายการ เทนเซอร์แบบฝังมี 3 แกน: ขนาดแบทช์ จำนวนการฝัง และจำนวนขนาดการฝัง โดยทั่วไป จำนวนการฝังต่อการสืบค้น/ข้อความจะเป็น 1 โดยมีข้อยกเว้นบางประการ
สามารถโหลดโมเดลการจับคู่/การเรียงลำดับแบบสอบถาม-ข้อความได้ดังต่อไปนี้:
from goodai.ltm.reranking.auto import AutoTextMatchingModel
model = AutoTextMatchingModel.from_pretrained(model_name)
model_name
สามารถเป็นหนึ่งในรายการต่อไปนี้:
ตามค่าเริ่มต้น อินสแตนซ์หน่วยความจำ ไม่ใช้แบบจำลองการจับคู่ข้อความค้นหา หากต้องการเปิดใช้งาน ควรกำหนดค่าดังนี้:
from goodai.ltm.embeddings.auto import AutoTextEmbeddingModel
from goodai.ltm.mem.auto import AutoTextMemory
from goodai.ltm.mem.config import TextMemoryConfig
from goodai.ltm.reranking.auto import AutoTextMatchingModel
# Low-resource embedding model
emb_model = AutoTextEmbeddingModel.from_pretrained('em-MiniLM-p1-01')
# QPM model that boosts retrieval accuracy
qpm_model = AutoTextMatchingModel.from_pretrained('em:em-distilroberta-p5-01')
config = TextMemoryConfig()
config.reranking_k_factor = 8
mem = AutoTextMemory.create(matching_model=qpm_model, emb_model=emb_model, config=config)
การตั้ง reranking_k_factor
จะบอกหน่วยความจำว่าควรพิจารณาผู้สมัครกี่คนเพื่อจัดอันดับใหม่ ผู้ใช้ร้องขอความทรงจำ k
อัลกอริธึมการจัดอันดับใหม่พิจารณา k * reranking_k_factor
chunks
วิธี predict
ของโมเดลจะใช้รายการสิ่งอันดับแบบสอบถามและส่งคืนรายการลอยที่แสดงถึงความน่าจะเป็นในการจับคู่โดยประมาณ ตัวอย่าง:
model = AutoTextMatchingModel.from_pretrained('em:em-distilroberta-p5-01')
sentences = [
('Mike: What is your favorite color?', 'Steve: My favorite color is purple.'),
('Name the inner planets.', 'It was the best of times, it was the worst of times.'),
]
prob = model.predict(sentences)
print(prob)
ดูการประเมินผล README
อ้างถึงหน้าโครงการ goodai-ltm-benchmark
โค้ดตัวอย่างเพิ่มเติมสามารถพบได้ในโฟลเดอร์ examples