Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ローカルLLM環境を構築できるOllamaをためす その6:業務知識を喰わせる

shuzo-kino.hateblo.jp
の続き
私が今回【読書メモ】実践 生成AIの教科書 - Bye Bye Mooreから学んだ概念にRAG(Retrieval-Augmented Generation:情報検索補強生成)というのがあります。
要するに業務知識を喰わせるという事……らしい。

実際のところ

与えたデータをベクトル化して、類似ケースを検索する仕組み……の様子。

モデルデータ

ollama pull mxbai-embed-large

pythonで使用する準備

promptのところが喰わせるデータ

ollama.embeddings(
  model='mxbai-embed-large',
  prompt='Llamas are members of the camelid family',
)

先程の説明通り、与えたデータをベクトル化して格納しますが、それ用のDBを用意しないといけません。

import ollama
import chromadb

documents = [
  "Llamas are members of the camelid family meaning they're pretty closely related to vicuñas and camels",
  "Llamas were first domesticated and used as pack animals 4,000 to 5,000 years ago in the Peruvian highlands",
  "Llamas can grow as much as 6 feet tall though the average llama between 5 feet 6 inches and 5 feet 9 inches tall",
  "Llamas weigh between 280 and 450 pounds and can carry 25 to 30 percent of their body weight",
  "Llamas are vegetarians and have very efficient digestive systems",
  "Llamas live to be about 20 years old, though some only live for 15 years and others live to be 30 years old",
]

client = chromadb.Client()
collection = client.create_collection(name="docs")

# store each document in a vector embedding database
for i, d in enumerate(documents):
  response = ollama.embeddings(model="mxbai-embed-large", prompt=d)
  embedding = response["embedding"]
  collection.add(
    ids=[str(i)],
    embeddings=[embedding],
    documents=[d]
  )

質問クエリの作成

# an example prompt
prompt = "What animals are llamas related to?"

# generate an embedding for the prompt and retrieve the most relevant doc
response = ollama.embeddings(
  prompt=prompt,
  model="mxbai-embed-large"
)
results = collection.query(
  query_embeddings=[response["embedding"]],
  n_results=1
)
data = results['documents'][0][0]

生成

# generate a response combining the prompt and data we retrieved in step 2
output = ollama.generate(
  model="llama2",
  prompt=f"Using this data: {data}. Respond to this prompt: {prompt}"
)

print(output['response'])