[ad_1]
Tôi rất vui được chia sẻ hành trình xây dựng một ứng dụng Thế hệ tăng cường truy xuất (RAG) độc đáo của mình để tương tác với các văn bản Do Thái trong bài đăng này. MishnahBot nhằm mục đích cung cấp cho các học giả và người dùng hàng ngày một cách trực quan để truy vấn và khám phá Mishnah¹ một cách tương tác. Nó có thể giúp giải quyết các vấn đề như nhanh chóng định vị các văn bản nguồn có liên quan hoặc tóm tắt một cuộc tranh luận phức tạp về luật tôn giáo, rút ra điểm mấu chốt.
Tôi đã có ý tưởng cho một dự án như vậy từ vài năm trước nhưng tôi cảm thấy công nghệ vẫn chưa chín muồi. Giờ đây, với những tiến bộ của các mô hình ngôn ngữ lớn và khả năng RAG, việc này khá đơn giản.
Đây là sản phẩm cuối cùng của chúng tôi trông như thế nào, bạn có thể dùng thử đây:
Các ứng dụng RAG đang thu hút được sự chú ý đáng kể nhằm cải thiện độ chính xác và khai thác sức mạnh lý luận có sẵn trong các mô hình ngôn ngữ lớn (LLM). Hãy tưởng tượng bạn có thể trò chuyện với thư viện của mình, bộ sưu tập sách hướng dẫn sử dụng ô tô của cùng một nhà sản xuất hoặc tài liệu thuế của bạn. Bạn có thể đặt câu hỏi và nhận được câu trả lời dựa trên kiến thức chuyên môn phong phú.
Có hai xu hướng mới nổi trong việc cải thiện tương tác mô hình ngôn ngữ: Tạo tăng cường truy xuất (RAG) và tăng độ dài ngữ cảnh, có thể bằng cách cho phép các tài liệu rất dài dưới dạng tệp đính kèm.
Một ưu điểm chính của hệ thống RAG là hiệu quả về chi phí. Với RAG, bạn có thể xử lý các ngữ cảnh lớn mà không làm tăng đáng kể chi phí truy vấn, điều này có thể trở nên tốn kém. Ngoài ra, RAG có nhiều mô-đun hơn, cho phép bạn cắm và chạy với các cơ sở kiến thức và nhà cung cấp LLM khác nhau. Mặt khác, việc tăng độ dài ngữ cảnh trực tiếp trong các mô hình ngôn ngữ là một sự phát triển thú vị có thể cho phép xử lý các văn bản dài hơn nhiều chỉ trong một tương tác.
Đối với dự án này, tôi đã sử dụng AWS SageMaker cho môi trường phát triển của mình, AWS Bedrock để truy cập nhiều LLM khác nhau và khung LangChain để quản lý quy trình. Cả hai dịch vụ AWS đều thân thiện với người dùng và chỉ tính phí theo tài nguyên được sử dụng, vì vậy tôi thực sự khuyến khích bạn tự mình dùng thử. Đối với Bedrock, bạn cần yêu cầu quyền truy cập vào Llama 3 70b Instruct và Claude Sonnet.
Hãy mở một sổ ghi chép Jupyter mới và cài đặt các gói mà chúng tôi sẽ sử dụng:
!pip set up chromadb tqdm langchain chromadb sentence-transformers
Tập dữ liệu cho dự án này là Mishnah, một văn bản cổ của Rabbinic là trung tâm của truyền thống Do Thái. Tôi chọn văn bản này vì nó gần gũi với tôi và cũng là một thách thức đối với các mô hình ngôn ngữ vì đây là một chủ đề thích hợp. Bộ dữ liệu được lấy từ Xuất khẩu Sefaria kho lưu trữ², một kho tàng văn bản của giáo sĩ Do Thái với các bản dịch tiếng Anh phù hợp với nguyên bản tiếng Do Thái. Sự liên kết này tạo điều kiện thuận lợi cho việc chuyển đổi giữa các ngôn ngữ trong các bước khác nhau của ứng dụng RAG của chúng tôi.
Lưu ý: Quy trình tương tự được áp dụng ở đây có thể được áp dụng cho bất kỳ bộ sưu tập văn bản nào khác mà bạn chọn. Ví dụ này cũng minh họa cách công nghệ RAG có thể được sử dụng trên các ngôn ngữ khác nhau, như được minh họa bằng tiếng Do Thái trong trường hợp này.
Đầu tiên chúng ta sẽ cần tải xuống dữ liệu liên quan. Chúng tôi sẽ sử dụng gitspars-checkout vì kho lưu trữ đầy đủ khá lớn. Mở cửa sổ terminal và chạy như sau.
git init sefaria-json
cd sefaria-json
git sparse-checkout init --cone
git sparse-checkout set json
git distant add origin https://github.com/Sefaria/Sefaria-Export.git
git pull origin grasp
tree Mishna/ | much less
Và Voila! bây giờ chúng tôi có các tệp dữ liệu mà chúng tôi cần:
Mishnah
├── Seder Kodashim
│ ├── Mishnah Arakhin
│ │ ├── English
│ │ │ └── merged.json
│ │ └── Hebrew
│ │ └── merged.json
│ ├── Mishnah Bekhorot
│ │ ├── English
│ │ │ └── merged.json
│ │ └── Hebrew
│ │ └── merged.json
│ ├── Mishnah Chullin
│ │ ├── English
│ │ │ └── merged.json
│ │ └── Hebrew
│ │ └── merged.json
Bây giờ hãy tải tài liệu trong môi trường sổ ghi chép Jupyter của chúng tôi:
import os
import json
import pandas as pd
from tqdm import tqdm# Operate to load all paperwork right into a DataFrame with progress bar
def load_documents(base_path):
information = ()
for seder in tqdm(os.listdir(base_path), desc="Loading Seders"):
seder_path = os.path.be a part of(base_path, seder)
if os.path.isdir(seder_path):
for tractate in tqdm(os.listdir(seder_path), desc=f"Loading Tractates in {seder}", go away=False):
tractate_path = os.path.be a part of(seder_path, tractate)
if os.path.isdir(tractate_path):
english_file = os.path.be a part of(tractate_path, "English", "merged.json")
hebrew_file = os.path.be a part of(tractate_path, "Hebrew", "merged.json")
if os.path.exists(english_file) and os.path.exists(hebrew_file):
with open(english_file, 'r', encoding='utf-8') as ef, open(hebrew_file, 'r', encoding='utf-8') as hf:
english_data = json.load(ef)
hebrew_data = json.load(hf)
for chapter_index, (english_chapter, hebrew_chapter) in enumerate(zip(english_data('textual content'), hebrew_data('textual content'))):
for mishnah_index, (english_paragraph, hebrew_paragraph) in enumerate(zip(english_chapter, hebrew_chapter)):
information.append({
"seder": seder,
"tractate": tractate,
"chapter": chapter_index + 1,
"mishnah": mishnah_index + 1,
"english": english_paragraph,
"hebrew": hebrew_paragraph
})
return pd.DataFrame(information)
# Load all paperwork
base_path = "Mishnah"
df = load_documents(base_path)
# Save the DataFrame to a file for future reference
df.to_csv(os.path.be a part of(base_path, "mishnah_metadata.csv"), index=False)
print("Dataset efficiently loaded into DataFrame and saved to file.")
Và hãy xem dữ liệu:
df.form
(4192, 7)print(df.head()(("tractate", "mishnah", "english")))
tractate mishnah english
0 Mishnah Arakhin 1 Everybody takes vows of valuation...
1 Mishnah Arakhin 2 With regard to a gentile, Rabbi Meir says:<...
2 Mishnah Arakhin 3 One who's moribund and one who's taken to...
3 Mishnah Arakhin 4 Within the case of a pregnant girl who's take...
4 Mishnah Arakhin 1 One can't be charged for a valuation much less ...
Có vẻ ổn, chúng ta có thể chuyển sang giai đoạn cơ sở dữ liệu vector.
Tiếp theo, chúng tôi vector hóa văn bản và lưu trữ nó trong ChromaDB cục bộ. Trong một câu, ý tưởng là biểu diễn văn bản dưới dạng vectơ dày đặc – mảng số – sao cho các văn bản giống nhau về mặt ngữ nghĩa sẽ “gần” với nhau trong không gian vectơ. Đây là công nghệ cho phép chúng tôi truy xuất các đoạn văn có liên quan cho một truy vấn.
Chúng tôi đã chọn mô hình vector hóa nhẹ, all-MiniLM-L6-v2
, có thể chạy hiệu quả trên CPU. Mô hình này cung cấp sự cân bằng tốt giữa hiệu suất và hiệu quả sử dụng tài nguyên, khiến nó phù hợp với ứng dụng của chúng tôi. Trong khi các mô hình tiên tiến như OpenAI text-embedding-3-large
có thể mang lại hiệu suất vượt trội nhưng chúng yêu cầu tài nguyên tính toán đáng kể, thường chạy trên GPU.
Để biết thêm thông tin về các mô hình nhúng và hiệu suất của chúng, bạn có thể tham khảo Bảng xếp hạng MTEB so sánh các mô hình nhúng văn bản khác nhau trên nhiều tác vụ.
Đây là mã chúng tôi sẽ sử dụng để vector hóa (chỉ mất vài phút để chạy tập dữ liệu này trên máy CPU):
import numpy as np
from sentence_transformers import SentenceTransformer
import chromadb
from chromadb.config import Settings
from tqdm import tqdm# Initialize the embedding mannequin
mannequin = SentenceTransformer('all-MiniLM-L6-v2', gadget='cpu')
# Initialize ChromaDB
chroma_client = chromadb.Shopper(Settings(persist_directory="chroma_db"))
assortment = chroma_client.create_collection("mishnah")
# Load the dataset from the saved file
df = pd.read_csv(os.path.be a part of("Mishnah", "mishnah_metadata.csv"))
# Operate to generate embeddings with progress bar
def generate_embeddings(paragraphs, mannequin):
embeddings = ()
for paragraph in tqdm(paragraphs, desc="Producing Embeddings"):
embedding = mannequin.encode(paragraph, show_progress_bar=False)
embeddings.append(embedding)
return np.array(embeddings)
# Generate embeddings for English paragraphs
embeddings = generate_embeddings(df('english').tolist(), mannequin)
df('embedding') = embeddings.tolist()
# Retailer embeddings in ChromaDB with progress bar
for index, row in tqdm(df.iterrows(), desc="Storing in ChromaDB", whole=len(df)):
assortment.add(embeddings=(row('embedding')), paperwork=(row('english')), metadatas=({
"seder": row('seder'),
"tractate": row('tractate'),
"chapter": row('chapter'),
"mishnah": row('mishnah'),
"hebrew": row('hebrew')
}))
print("Embeddings and metadata efficiently saved in ChromaDB.")
Với tập dữ liệu đã sẵn sàng, giờ đây chúng tôi có thể tạo ứng dụng Thế hệ truy xuất tăng cường (RAG) bằng tiếng Anh. Để làm được điều này, chúng tôi sẽ sử dụng LangChain, một khung mạnh mẽ cung cấp giao diện thống nhất cho các hoạt động và tích hợp mô hình ngôn ngữ khác nhau, giúp dễ dàng xây dựng các ứng dụng phức tạp.
LangChain đơn giản hóa quá trình tích hợp các thành phần khác nhau như mô hình ngôn ngữ (LLM), trình truy xuất và lưu trữ vectơ. Bằng cách sử dụng LangChain, chúng tôi có thể tập trung vào logic cấp cao của ứng dụng mà không phải lo lắng về độ phức tạp cơ bản của từng thành phần.
Đây là mã để thiết lập hệ thống RAG của chúng tôi:
from langchain.chains import LLMChain, RetrievalQA
from langchain.llms import Bedrock
from langchain.prompts import PromptTemplate
from sentence_transformers import SentenceTransformer
import chromadb
from chromadb.config import Settings
from typing import Checklist# Initialize AWS Bedrock for Llama 3 70B Instruct
llm = Bedrock(
model_id="meta.llama3-70b-instruct-v1:0"
)
# Outline the immediate template
prompt_template = PromptTemplate(
input_variables=("context", "query"),
template="""
Reply the next query primarily based on the offered context alone:
Context: {context}
Query: {query}
Reply (quick and concise):
""",
)
# Initialize ChromaDB
chroma_client = chromadb.Shopper(Settings(persist_directory="chroma_db"))
assortment = chroma_client.get_collection("mishnah")
# Outline the embedding mannequin
embedding_model = SentenceTransformer('all-MiniLM-L6-v2', gadget='cpu')
# Outline a easy retriever perform
def simple_retriever(question: str, okay: int = 3) -> Checklist(str):
query_embedding = embedding_model.encode(question).tolist()
outcomes = assortment.question(query_embeddings=(query_embedding), n_results=okay)
paperwork = outcomes('paperwork')(0) # Entry the primary checklist inside 'paperwork'
sources = outcomes('metadatas')(0) # Entry the metadata for sources
return paperwork, sources
# Initialize the LLM chain
llm_chain = LLMChain(
llm=llm,
immediate=prompt_template
)
# Outline SimpleQA chain
class SimpleQAChain:
def __init__(self, retriever, llm_chain):
self.retriever = retriever
self.llm_chain = llm_chain
def __call__(self, inputs, do_print_context=True):
query = inputs("question")
retrieved_docs, sources = self.retriever(query)
context = "nn".be a part of(retrieved_docs)
response = self.llm_chain.run({"context": context, "query": query})
response_with_sources = f"{response}n" + "#"*50 + "nSources:n" + "n".be a part of(
(f"{supply('seder')} {supply('tractate')} Chapter {supply('chapter')}, Mishnah {supply('mishnah')}" for supply in sources)
)
if do_print_context:
print("#"*50)
print("Retrieved paragraphs:")
for doc in retrieved_docs:
print(doc(:100) + "...")
return response_with_sources
# Initialize and take a look at SimpleQAChain
qa_chain = SimpleQAChain(retriever=simple_retriever, llm_chain=llm_chain)
- Khởi tạo AWS Bedrock: Chúng tôi khởi tạo AWS Bedrock bằng Hướng dẫn Llama 3 70B. Mô hình này sẽ được sử dụng để tạo phản hồi dựa trên bối cảnh được truy xuất.
- Mẫu nhắc nhở: Mẫu lời nhắc được xác định để định dạng ngữ cảnh và câu hỏi thành cấu trúc mà LLM có thể hiểu được. Điều này giúp tạo ra câu trả lời ngắn gọn và có liên quan. Hãy thoải mái thử nghiệm và điều chỉnh mẫu khi cần thiết.
- Mô hình nhúng: Chúng tôi cũng sử dụng mô hình ‘all-MiniLM-L6-v2’ để tạo các phần nhúng cho truy vấn. Chúng tôi hy vọng truy vấn sẽ có cách trình bày tương tự với các đoạn trả lời có liên quan. Lưu ý: Để tăng hiệu suất truy xuất, chúng tôi có thể sử dụng LLM để sửa đổi và tối ưu hóa truy vấn của người dùng sao cho giống với kiểu của cơ sở dữ liệu RAG hơn.
- Chuỗi LLM: Các
LLMChain
lớp từ LangChain được sử dụng để quản lý sự tương tác giữa LLM và bối cảnh được truy xuất. - SimpleQAChain: Lớp tùy chỉnh này tích hợp trình truy xuất và chuỗi LLM. Nó truy xuất các đoạn văn có liên quan, định dạng chúng theo ngữ cảnh và tạo ra câu trả lời.
Được rồi! Hãy thử nó! Chúng tôi sẽ sử dụng một truy vấn liên quan đến đoạn đầu tiên trong Mishnah.
response = qa_chain({"question": "What's the acceptable time to recite Shema?"})print("#"*50)
print("Response:")
print(response)
##################################################
Retrieved paragraphs:
The start of tractate Berakhot, the primary tractate within the first of the six orders of Mish...
From when does one recite Shema within the morning? From when an individual can disti...
Beit Shammai and Beit Hillel disputed the right technique to recite Shema. Beit Shammai say:##################################################
Response:
Within the night, from when the monks enter to partake of their teruma till the tip of the primary watch, or in line with Rabban Gamliel, till daybreak. Within the morning, from when an individual can distinguish between sky-blue and white, till dawn.
##################################################
Sources:
Seder Zeraim Mishnah Berakhot Chapter 1, Mishnah 1
Seder Zeraim Mishnah Berakhot Chapter 1, Mishnah 2
Seder Zeraim Mishnah Berakhot Chapter 1, Mishnah 3
Điều đó có vẻ khá chính xác.
Hãy thử một câu hỏi phức tạp hơn:
response = qa_chain({"question": "What's the third prohibited form of work on the sabbbath?"})print("#"*50)
print("Response:")
print(response)
##################################################
Retrieved paragraphs:
They mentioned an essential common precept with regard to the sabbatical yr: something that's meals f...
This elementary mishna enumerates those that carry out the major classes of labor prohibit...
Rabbi Akiva mentioned: I requested Rabbi Eliezer with regard to one who performs a number of prohi...
##################################################
Response:
One who reaps.
##################################################
Sources:
Seder Zeraim Mishnah Sheviit Chapter 7, Mishnah 1
Seder Moed Mishnah Shabbat Chapter 7, Mishnah 2
Seder Kodashim Mishnah Keritot Chapter 3, Mishnah 10
Rất đẹp.
Tôi đã thử nó, đây là những gì tôi nhận được:
Câu trả lời dài và không đi vào vấn đề và câu trả lời được đưa ra là không chính xác (Chiêu quân là loại công việc thứ ba trong danh sách, trong khi lựa chọn là thứ bảy). Đây là cái mà chúng tôi gọi là ảo giác.
Mặc dù Claude là một mô hình ngôn ngữ mạnh mẽ, nhưng việc chỉ dựa vào LLM để tạo phản hồi từ dữ liệu đào tạo đã ghi nhớ hoặc thậm chí sử dụng tìm kiếm trên web sẽ thiếu độ chính xác và khả năng kiểm soát do cơ sở dữ liệu tùy chỉnh trong ứng dụng Thế hệ tăng cường truy xuất (RAG) cung cấp. Đây là lý do tại sao:
- Độ chính xác và bối cảnh: Ứng dụng RAG của chúng tôi truy xuất các đoạn chính xác từ cơ sở dữ liệu tùy chỉnh, đảm bảo mức độ liên quan và độ chính xác cao. Claude, nếu không có cơ chế truy xuất cụ thể, có thể không cung cấp cùng mức độ phản hồi chi tiết và theo ngữ cảnh cụ thể.
- Hiệu quả: Phương pháp RAG xử lý hiệu quả các tập dữ liệu lớn, kết hợp truy xuất và tạo để duy trì các câu trả lời chính xác và phù hợp với ngữ cảnh.
- Hiệu quả chi phí: Bằng cách sử dụng LLM tương đối nhỏ như Llama 3 70B Instruct, chúng tôi đạt được kết quả chính xác mà không cần gửi một lượng lớn dữ liệu với mỗi truy vấn. Điều này giúp giảm chi phí liên quan đến việc sử dụng các mô hình lớn hơn, sử dụng nhiều tài nguyên hơn.
Quá trình truy xuất có cấu trúc này đảm bảo người dùng nhận được câu trả lời chính xác và phù hợp nhất, tận dụng cả khả năng tạo ngôn ngữ của LLM và độ chính xác của việc truy xuất dữ liệu tùy chỉnh.
Cuối cùng, chúng tôi sẽ giải quyết thách thức trong việc tương tác bằng tiếng Do Thái với văn bản gốc tiếng Do Thái. Cách tiếp cận tương tự có thể được áp dụng cho bất kỳ ngôn ngữ nào khác, miễn là bạn có thể dịch văn bản sang tiếng Anh cho giai đoạn truy xuất.
Việc hỗ trợ các tương tác bằng tiếng Do Thái sẽ tạo thêm một lớp phức tạp vì các mô hình nhúng và mô hình ngôn ngữ lớn (LLM) có xu hướng mạnh hơn bằng tiếng Anh. Mặc dù một số mô hình nhúng và LLM hỗ trợ tiếng Do Thái, nhưng chúng thường kém mạnh mẽ hơn so với các mô hình nhúng bằng tiếng Anh, đặc biệt là các mô hình nhúng nhỏ hơn có thể tập trung nhiều hơn vào tiếng Anh trong quá trình đào tạo.
Để giải quyết vấn đề này, chúng ta có thể đào tạo mô hình nhúng tiếng Do Thái của riêng mình. Tuy nhiên, một cách tiếp cận thực tế khác là tận dụng bản dịch một lần của văn bản sang tiếng Anh và sử dụng phần nhúng tiếng Anh cho quá trình truy xuất. Bằng cách này, chúng tôi được hưởng lợi từ hiệu suất mạnh mẽ của các mô hình tiếng Anh trong khi vẫn hỗ trợ các tương tác bằng tiếng Do Thái.
Trong trường hợp của chúng tôi, chúng tôi đã có bản dịch chuyên nghiệp của văn bản Mishnah sang tiếng Anh. Chúng tôi sẽ sử dụng điều này để đảm bảo truy xuất chính xác trong khi vẫn duy trì tính toàn vẹn của các phản hồi bằng tiếng Do Thái. Đây là cách chúng ta có thể thiết lập hệ thống RAG đa ngôn ngữ này:
- Truy vấn đầu vào bằng tiếng Do Thái: Người dùng có thể nhập truy vấn của họ bằng tiếng Do Thái.
- Dịch câu hỏi sang tiếng Anh: Chúng tôi sử dụng LLM để dịch truy vấn tiếng Do Thái sang tiếng Anh.
- Nhúng truy vấn: Truy vấn tiếng Anh đã dịch sau đó sẽ được nhúng.
- Tìm tài liệu liên quan bằng cách sử dụng phần nhúng tiếng Anh: Chúng tôi sử dụng phần nhúng tiếng Anh để tìm các tài liệu liên quan.
- Truy xuất các văn bản tiếng Do Thái tương ứng: Các văn bản tiếng Do Thái tương ứng được lấy ra dưới dạng ngữ cảnh. Về cơ bản chúng tôi đang sử dụng các văn bản tiếng Anh như phím và các văn bản tiếng Do Thái tương ứng giá trị trong thao tác truy xuất.
- Trả lời bằng tiếng Do Thái bằng LLM: LLM tạo ra phản hồi bằng tiếng Do Thái bằng cách sử dụng ngữ cảnh tiếng Do Thái.
Đối với thế hệ, chúng tôi sử dụng Claude Sonnet vì nó hoạt động tốt hơn đáng kể trên văn bản tiếng Do Thái so với Llama 3.
Đây là cách thực hiện mã:
from langchain.chains import LLMChain, RetrievalQA
from langchain.llms import Bedrock
from langchain_community.chat_models import BedrockChat
from langchain.prompts import PromptTemplate
from sentence_transformers import SentenceTransformer
import chromadb
from chromadb.config import Settings
from typing import Checklist
import re# Initialize AWS Bedrock for Llama 3 70B Instruct with particular configurations for translation
translation_llm = Bedrock(
model_id="meta.llama3-70b-instruct-v1:0",
model_kwargs={
"temperature": 0.0, # Set decrease temperature for translation
"max_gen_len": 50 # Restrict variety of tokens for translation
}
)
# Initialize AWS Bedrock for Claude Sonnet with particular configurations for technology
generation_llm = BedrockChat(
model_id="anthropic.claude-3-sonnet-20240229-v1:0"
)
# Outline the interpretation immediate template
translation_prompt_template = PromptTemplate(
input_variables=("textual content"),
template="""Translate the next Hebrew textual content to English:
Enter textual content: {textual content}
Translation:
"""
)
# Outline the immediate template for Hebrew solutions
hebrew_prompt_template = PromptTemplate(
input_variables=("context", "query"),
template="""ענה על השאלה הבאה בהתבסס על ההקשר המסופק בלבד:
הקשר: {context}
שאלה: {query}
תשובה (קצרה ותמציתית):
"""
)
# Initialize ChromaDB
chroma_client = chromadb.Shopper(Settings(persist_directory="chroma_db"))
assortment = chroma_client.get_collection("mishnah")
# Outline the embedding mannequin
embedding_model = SentenceTransformer('all-MiniLM-L6-v2', gadget='cpu')
# Translation chain for translating queries from Hebrew to English
translation_chain = LLMChain(
llm=translation_llm,
immediate=translation_prompt_template
)
# Initialize the LLM chain for Hebrew solutions
hebrew_llm_chain = LLMChain(
llm=generation_llm,
immediate=hebrew_prompt_template
)
# Outline a easy retriever perform for Hebrew texts
def simple_retriever(question: str, okay: int = 3) -> Checklist(str):
query_embedding = embedding_model.encode(question).tolist()
outcomes = assortment.question(query_embeddings=(query_embedding), n_results=okay)
paperwork = (meta('hebrew') for meta in outcomes('metadatas')(0)) # Entry Hebrew texts
sources = outcomes('metadatas')(0) # Entry the metadata for sources
return paperwork, sources
# Operate to take away vowels from Hebrew textual content
def remove_vowels_hebrew(hebrew_text):
sample = re.compile(r'(u0591-u05C7)')
hebrew_text_without_vowels = re.sub(sample, '', hebrew_text)
return hebrew_text_without_vowels
# Outline SimpleQA chain with translation
class SimpleQAChainWithTranslation:
def __init__(self, translation_chain, retriever, llm_chain):
self.translation_chain = translation_chain
self.retriever = retriever
self.llm_chain = llm_chain
def __call__(self, inputs):
hebrew_query = inputs("question")
print("#" * 50)
print(f"Hebrew question: {hebrew_query}")
# Print the interpretation immediate
translation_prompt = translation_prompt_template.format(textual content=hebrew_query)
print("#" * 50)
print(f"Translation Immediate: {translation_prompt}")
# Carry out the interpretation utilizing the interpretation chain with particular configurations
translated_query = self.translation_chain.run({"textual content": hebrew_query})
print("#" * 50)
print(f"Translated Question: {translated_query}") # Print the translated question for debugging
retrieved_docs, sources = self.retriever(translated_query)
retrieved_docs = (remove_vowels_hebrew(doc) for doc in retrieved_docs)
context = "n".be a part of(retrieved_docs)
# Print the ultimate immediate for technology
final_prompt = hebrew_prompt_template.format(context=context, query=hebrew_query)
print("#" * 50)
print(f"Remaining Immediate for Era:n {final_prompt}")
response = self.llm_chain.run({"context": context, "query": hebrew_query})
response_with_sources = f"{response}n" + "#" * 50 + "מקורות:n" + "n".be a part of(
(f"{supply('seder')} {supply('tractate')} פרק {supply('chapter')}, משנה {supply('mishnah')}" for supply in sources)
)
return response_with_sources
# Initialize and take a look at SimpleQAChainWithTranslation
qa_chain = SimpleQAChainWithTranslation(translation_chain, simple_retriever, hebrew_llm_chain)
Hãy thử nó! Chúng ta sẽ sử dụng câu hỏi tương tự như trước, nhưng lần này bằng tiếng Do Thái:
response = qa_chain({"question": "מהו סוג העבודה השלישי האסור בשבת?"})
print("#" * 50)
print(response)
##################################################
Hebrew question: מהו סוג העבודה השלישי האסור בשבת?
##################################################
Translation Immediate: Translate the next Hebrew textual content to English:
Enter textual content: מהו סוג העבודה השלישי האסור בשבת?
Translation: ##################################################
Translated Question: What's the third kind of labor that's forbidden on Shabbat?
Enter textual content: כל העולם כולו גשר צר מאוד
Translation:
##################################################
Remaining Immediate for Era:
ענה על השאלה הבאה בהתבסס על ההקשר המסופק בלבד:
הקשר: אבות מלאכות ארבעים חסר אחת. הזורע. והחורש. והקוצר. והמעמר. הדש. והזורה. הבורר. הטוחן. והמרקד. והלש. והאופה. הגוזז את הצמר. המלבנו. והמנפצו. והצובעו. והטווה. והמסך. והעושה שני בתי נירין. והאורג שני חוטין. והפוצע שני חוטין. הקושר. והמתיר. והתופר שתי תפירות. הקורע על מנת לתפר שתי תפירות. הצד צבי. השוחטו. והמפשיטו. המולחו, והמעבד את עורו. והמוחקו. והמחתכו. הכותב שתי אותיות. והמוחק על מנת לכתב שתי אותיות. הבונה. והסותר. המכבה. והמבעיר. המכה בפטיש. המוציא מרשות לרשות. הרי אלו אבות מלאכות ארבעים חסר אחת:
חבתי כהן גדול, לישתן ועריכתן ואפיתן בפנים, ודוחות את השבת. טחונן והרקדן אינן דוחות את השבת. כלל אמר רבי עקיבא, כל מלאכה שאפשר לה לעשות מערב שבת, אינה דוחה את השבת. ושאי אפשר לה לעשות מערב שבת, דוחה את השבת:
הקורע בחמתו ועל מתו, וכל המקלקלין, פטורין. והמקלקל על מנת לתקן, שעורו כמתקן:
שאלה: מהו סוג העבודה השלישי האסור בשבת?
תשובה (קצרה ותמציתית):
##################################################
הקוצר.
##################################################מקורות:
Seder Moed Mishnah Shabbat פרק 7, משנה 2
Seder Kodashim Mishnah Menachot פרק 11, משנה 3
Seder Moed Mishnah Shabbat פרק 13, משנה 3
Chúng tôi đã có được câu trả lời chính xác, chỉ bằng một từ cho câu hỏi của mình. Khá gọn gàng phải không?
Việc dịch bằng Llama 3 Instruct đặt ra một số thách thức. Ban đầu, mô hình này tạo ra những kết quả vô nghĩa dù tôi có cố gắng thế nào đi chăng nữa. (Rõ ràng, hướng dẫn của Llama 3 rất nhạy cảm với các lời nhắc bắt đầu bằng một ký tự dòng mới!)
Sau khi giải quyết vấn đề đó, mô hình có xu hướng đưa ra phản hồi chính xác, nhưng sau đó tiếp tục với văn bản bổ sung không liên quan, do đó, việc dừng đầu ra ở ký tự dòng mới tỏ ra có hiệu quả.
Việc kiểm soát định dạng đầu ra có thể khó khăn. Một số chiến lược bao gồm yêu cầu định dạng JSON hoặc cung cấp ví dụ kèm theo lời nhắc về một vài lần chụp.
Trong dự án này, chúng tôi cũng xóa các nguyên âm khỏi văn bản tiếng Do Thái vì hầu hết văn bản tiếng Do Thái trực tuyến không bao gồm nguyên âm và chúng tôi muốn ngữ cảnh cho LLM của chúng tôi giống với văn bản được thấy trong quá trình đào tạo trước.
Xây dựng ứng dụng RAG này là một hành trình hấp dẫn, kết hợp các sắc thái của văn bản cổ với công nghệ AI hiện đại. Niềm đam mê của tôi trong việc làm cho thư viện các văn bản cổ của giáo sĩ Do Thái trở nên dễ tiếp cận hơn với mọi người (bao gồm cả tôi) đã thúc đẩy dự án này. Công nghệ này cho phép trò chuyện với thư viện của bạn, tìm kiếm nguồn dựa trên ý tưởng và hơn thế nữa. Cách tiếp cận được sử dụng ở đây có thể được áp dụng cho các bộ sưu tập văn bản quý giá khác, mở ra những khả năng mới để tiếp cận và khám phá kiến thức lịch sử và văn hóa.
Thật ngạc nhiên khi thấy tất cả những điều này có thể được thực hiện chỉ trong vài giờ nhờ vào các công cụ và khuôn khổ mạnh mẽ hiện có. Vui lòng kiểm tra mã đầy đủ trên GitHubvà chơi với MishnahBot trang mạng.
Vui lòng chia sẻ nhận xét và câu hỏi của bạn, đặc biệt nếu bạn đang thử điều gì đó tương tự. Nếu bạn muốn xem thêm nội dung như thế này trong tương lai, hãy cho tôi biết!
[ad_2]
Source link