åã°ã£ããçãããã£ãããããããããããã¯ãã«æ€çŽ¢ã䜿ã£ãŠå®è£ ãã #圹ã«ç«ããªãLLM
æ°ããLLMãåºã床ã«è©±é¡ã«ãªãã®ããæ£ç¢ºãªç¥èãæã£ãŠããããšããããšã§ããLLMãåããŸãã§æ¬åœãã®ããã«è©±ãããšã¯ãã«ã·ããŒã·ã§ã³ïŒå¹»èŠïŒãšåŒã°ãã課é¡ãšãªã£ãŠããŸãã
ãã®ãã«ã·ããŒã·ã§ã³ã«å¯ŸåŠããæè¡ãšããŠããã¯ãã«æ€çŽ¢ãåãããRAGïŒRetrieval-Augmented GenerationïŒããããŸãããã£ããèšããšãæ£ç¢ºãªå 容ãä¿æããããŒã¿ããŒã¹ãçšæãããŠãŒã¶ãŒããå¯ãããã質åã«é¢é£ããå 容ãããŒã¿ããŒã¹ããåŒã£åŒµã£ãŠããŠããã®å 容ãããã³ããã«å ¥ããããšã§ãLLMãæã£ãŠããªãç¥èã«ã€ããŠãæ£ç¢ºãªåçããããããšãããã®ã§ããäŸãã°ãLLMãç¥ã£ãŠããã¯ãããªãã瀟å ããã¥ã¡ã³ããæ€çŽ¢ããææ³ãšããŠäœ¿ããå§ããŠããŸãã
ããã§ããµãšãæã£ããã§ããããŒã¿ããŒã¹ã«åãçšæããŠãããŠãããã䜿ã£ãŠRAGããã°ãåãçããBotãäœããããããªããã£ãŠã
ãšããããã§ãã£ãŠã¿ãŸããã
RAGã§åãã€ãã«ã¯ãåã®ããŒã¿ããŒã¹ãå¿ èŠã§ããä»åã¯ãã¢ã³ãµã€ã¯ãããã£ã¢ã®ããŒã¿ã䜿ããŸãããåãç®èã°ããã®ãWikipediaã®ãããã£ãŒãµã€ãã§ãã
https://ja.uncyclopedia.info/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
ããŒã¿ã®ã©ã€ã»ã³ã¹ã¯CC BY-NC-SA 3.0 DEEDïŒè¡šç€º - éå¶å© - ç¶æ¿ 3.0 éç§»æ€ïŒãã€ãŸãéåçšçšéãã€ãåãã©ã€ã»ã³ã¹ãç¶æ¿ãããã®ãªãã°åé åžãå«ããŠå©çšå¯èœã§ããå 容ãXML圢åŒã§ããŠã³ããŒãããããšãåºæ¥ãŸããããŠã³ããŒãåºæ¥ããµã€ãã¯ããã€ããããŸãããäŸãã°ä»¥äžã
ja-wiki.xml.bz2 ãæ¥æ¬èªã®ããŒã¿ã§ããç§ãããŠã³ããŒããããšãã¯bz2å§çž®ãå£ããŠããã®ã§ããã埩å å¯èœãªéšåã ããå©çšããŸããã
å£ããXMLãããŒã¹ããã®ã¯é¢åã§ããããæ ¹æ§ã§ããŒã¹ããŸããããŒã¹éçšã¯èšäºã«ããŠããããããªãã®ã§ã以äžã«çµæç©ã眮ããŠãããŸããã©ã€ã»ã³ã¹ã¯åããCC BY NC SA 3.0ãšããŸãã
ã¢ã³ãµã€ã¯ãããã£ã¢ã®èšäºå 容ããèšäºæ¯ã«ãOpenAIã®text-embedding-ada-002ã§ãã¯ãã«åããŸããtext-embedding-ada-002ãåãå ¥ããããããŒã¯ã³æ°ã¯8000ããããªã®ã§ããã¯ãã«åããæã¯ãæåæ°ã¯4096æå以äžã«ã«ããããŸããã
ã¡ãªã¿ã«ãtext-embedding-ada-002ã¯ææã§ããOpenAIã®ãµãŒãã¹ã®äžã§ã¯å®äŸ¡ãªéšé¡ã§ããã䜿ããããªãããã«ã¯æ³šæããŠãã ããã
以äžãããã¯ãã«åãããšãã®ã³ãŒãã§ããïŒäžèšã®ZIPããŒã¿ã¯ããã§ã«text-embedding-ada-002ã«ãããã¯ãã«ã®å€ãå ¥ã£ãŠããŸãïŒ
å¿ èŠãªããã±ãŒãžã®ã€ã³ã¹ããŒã«
pip install openaiPythonã®ã³ãŒã
import json
import openai
# ç°å¢å€æ°ããAPIããŒãååŸ
openai.api_key = "OpenAIã®APIããŒãå
¥ããŠãã ãã"
def vectorize_text(input_json, output_json):
with open(input_json, 'r', encoding='utf-8') as f:
data = json.load(f)
total_files = len(data)
print(f"Total files to process: {total_files}")
for index, item in enumerate(data, start=1):
text = item['text']
# 4096æåãè¶
ããŠãããã«ãã
if len(text) > 4096:
text = text[:4096]
# é²æç¶æ³ã衚瀺
print(f"Processing file {index} of {total_files}...")
response = openai.Embedding.create(input=text, engine="text-embedding-ada-002")
item['vector'] = response['data'][0]['embedding']
# é²æç¶æ³ãæŽæ°
progress = (index / total_files) * 100
print(f"Completed: {progress:.2f}%")
# ãã¯ãã«ã远å ãããJSONããŒã¿ããã¡ã€ã«ã«ä¿å
with open(output_json, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# å
¥åJSONãã¡ã€ã«ãšåºåJSONãã¡ã€ã«ã®ãã¹
input_json_path = 'Uncyclopedia-ja.json' # å
¥åJSONãã¡ã€ã«ã®ãã¹
output_json_path = 'Uncyclopedia-ja-with-vectors-CCBYNCSA30.json' # åºåJSONãã¡ã€ã«ã®ãã¹
# ãã¯ãã«å颿°ã®å®è¡
vectorize_text(input_json_path, output_json_path)
ãã®ããŒã¿ãããã¯ãã«æ€çŽ¢ã§ããããã«ãpineconeã«ã¢ããããŒãããŸããpineconeã¯ãã¯ãã«æ€çŽ¢ã«ç¹åããããŒã¿ããŒã¹ãµãŒãã¹ã§ãåæ©çãªæ©èœã¯ç¡æã§äœ¿ããã®ã§ãããããå®éšã«ããã¿ãªã§ãã
pineconeã«ã¢ããããŒãããã³ãŒãã¯ä»¥äžã§ãã
å¿ èŠãªããã±ãŒãžã®ã€ã³ã¹ããŒã«
pip install pinecone-clientPythonã®ã³ãŒã
import json
import openai
import pinecone
pinecone_api_key = "pineconeã®APIããŒ"
pinecone_environment = "pineconeã®enviromentïŒå°åïŒ"
# indexãäœæãã
pinecone.create_index(
name="uncyclopedia", # uncyclopediaãšããååã®ãããžã§ã¯ããäœã
dimension=1536, # text-embedding-ada-002ã§ãã¯ãã«åãããšãã®æ¬¡å
æ°
metric="cosine",
metadata_config={
"indexed": [
"id",
"title",
"text",
]
}
)
index_name = 'uncyclopedia' # uncyclopediaãšããååã®ãããžã§ã¯ããäœã£ãå Žå
pinecone.init(api_key=pinecone_api_key, environment=pinecone_environment)
index = pinecone.Index(index_name)
# Jsonãèªã¿èŸŒã
with open('Uncyclopedia-ja-with-vectors-CCBYNCSA30.json', 'r', encoding='utf-8') as f:
data = json.load(f)
for item in data:
index.upsert(
vectors=[
{
"id": str(item['id']),
"values": item['vector'],
"metadata": {
"title": item['title'],
"text": item['text'][:10000] # 10000æå以äžã¯åãæšãŠ
}
}
]
)pineconeã¯ã¢ããããŒãåºæ¥ãmetadataã®ããã¹ãããŒã¿ã®éã«äžéãããã®ã§ã10000æå以äžã¯åãæšãŠãŠããŸãã
ããã§æºåã¯å®äºã§ããæ©éãåãåçãããŠã¿ãŸããããä»åã¯é·æã®ããã³ããã䜿ããããšã§è©±é¡ã®ãCyberAgentã®CALM2-7b-chatã䜿ã£ãŠã¿ãŸããã
å¿ èŠãªããã±ãŒãžã®ã€ã³ã¹ããŒã«
pip install transformers accelerateWindowsç°å¢ã§åããã«ã¯ãpytorchãbitsandbytesãã€ã³ã¹ããŒã«ããéã以äžã®æ§ã«ã€ã³ã¹ããŒã«ããããã«ããŠãã ããã
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install bitsandbytes --prefer-binary --extra-index-url=https://jllllll.github.io/bitsandbytes-windows-webuiLinuxç°å¢ãGoogle Colabã§ã¯ãæ®éã«ä»¥äžã§å€§äžå€«ã®ã¯ãã§ãã
pip install torch bitsandbytesPythonã®ã³ãŒã
import openai
import pinecone
import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
assert transformers.__version__ >= "4.34.1"
openai.api_key = "OpenAIã®APIããŒ"
pinecone_api_key = "pineconeã®APIããŒ"
pinecone_environment = "pineconeã®enviroment"
index_name = 'uncyclopedia'
pinecone.init(api_key=pinecone_api_key, environment=pinecone_environment)
index = pinecone.Index(index_name)
search_query = "éªç¥ãåªåããçç±ãæããŠãã ãã" # ããã質åã«å€æŽããŸã
response = openai.Embedding.create(input=search_query, engine="text-embedding-ada-002")
query_vector = response['data'][0]['embedding']
answer = index.query(vector=query_vector, top_k=1, include_distance=True)
answer_id = answer['matches'][0]['id']
res = index.fetch([str(answer_id)])
model = AutoModelForCausalLM.from_pretrained("cyberagent/calm2-7b-chat", device_map="auto", torch_dtype="auto", load_in_4bit=True)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/calm2-7b-chat")
streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
prompt = f"""USER: 貎æ¹ã¯åžžã«åãçãããžã§ãŒã¯Botã§ãã
ãŠãŒã¶ãŒã®è³ªåã«å¯ŸããŠåãçããŸãã
åã®æ
å ±ãšããŠã以äžã®å
容ãåèã«ããŠãã ããã
========
{res['vectors'][str(answer_id)]['metadata']['text']}
========
ããŠãã{search_query}ããšãã質åã«å¯ŸããŠãäžèšã®æ
å ±ãå
ã«ãåã®çããèããŠã¿ãŸãããã
ASSISTANT: """
token_ids = tokenizer.encode(prompt, return_tensors="pt")
output_ids = model.generate(
input_ids=token_ids.to(model.device),
max_new_tokens=300,
do_sample=True,
temperature=0.8,
streamer=streamer,
)
ãããšã以äžã®æ§ãªçããè¿ã£ãŠããŸããã
éªç¥ãåªåããçç±ã§ããïŒããã¯ããå ç²é¢ªããšåŒã°ãããããŒã ã«ã©ãŒã®ãå ç²ããããã®é¢šãããéžæãã¡ã®äœåã倧ãã«éŒèããããã§ãããŸããå€ãã®éªç¥ãã¡ã³ãã¡ããå°å ã§ããéªç¥ãšãªã¢ã®å·ãæµ·ãžãšé£ã³èŸŒãããšã§ãããŒã ã«å¯Ÿããææ ãäœå šäœã§è¡šçŸããããšã§ãããŒã èªäœã®å£«æ°ã倧ãã«é«ããããšããåªåãžã®å€§ããªäžæ©ãšãªããŸããã
ãã¯ã¯ïŒ æãã£ããåã€ããŠãïŒ æ¥œããïŒ æåãäžéšåããŠããã®ã¯ãææ¬ã ãšæã£ãŠããŸãïŒãããçŽãããïŒ
ã¡ãªã¿ã«ãåºæ¬çãªRAGã®å®è£ ãµã³ãã«ãšããŠãæå€ãšïŒïŒïŒæ¥œãããšæããŸãã®ã§ãããªããªãã§ã¯ã®åBotãäœã£ãŠã¿ãã®ãè¯ãããã§ãã