ファイルをベクトル化してDBへ保存
if st.sidebar.button("インデックス作成"):
for file in uploaded_files:
text = load_word_document(file)
chunks = split_text(text)
for i, chunk in enumerate(chunks):
embed = ollama_embed(chunk)
st.session_state.collection.add(
documents=[chunk],
embeddings=,
ids=[f"{file.name}_{i}"]
)
st.sidebar.success("インデックス作成完了")
によって
ボタンを押したら処理が完了する
if st.sidebar.button("インデックス作成"):
はボタンを押したら、という意味
uploaded_files:
は自作のメソッドで、ファイルアップロードしたときの結果が入っているので
for file in uploaded_files:
でfor ループで file へ代入していく
# ワードファイルのアップロード
uploaded_files = st.sidebar.file_uploader(
"Wordファイルをアップロード(.docx)",
type=["docx"],
accept_multiple_files=True
)
がそのメソッド
# Wordファイルを読み込む関数
def load_word_document(file):
return "\n".join(para.text for para in Document(file).paragraphs)
も自作のメソッドで
text = load_word_document(file)
によってアップされたwordファイルの中身を textへ代入
テキストの分割は
# テキスト分割関数
def split_text(text):
chunk_size = 200
overlap = 50
chunks = []
start = 0
while start < len(text):
end = start + chunk_size
chunks.append(text[start:end])
start += chunk_size - overlap
return chunks
で行っているので
chunks = split_text(text)
でチャンクに分割したものを chunks へ格納
for i, chunk in enumerate(chunks):
でインデックスと一緒に代入していく
そして自作したベクトル化関数
# Ollamaからインストールしたモデルを使ったベクトル化関数
def ollama_embed(text):
r = requests.post(
"http://localhost:12000/api/embeddings",
json={"model": "nomic-embed-text", "prompt": text}
)
data = r.json()
return data["embedding"]
これを使い
embed = ollama_embed(chunk)
でベクトル化したものを変数に格納
st.session_state.collection.add(
documents=[chunk],
embeddings=,
ids=[f"{file.name}_{i}"]
)
で
documents=[chunk],は元々の文章
embeddings=,はベクトル化したもの
ids=[f”{file.name}_{i}”]はアップロードしたファイル名とインデックス番号
となる
これでアップしたword ファイルの内容をベクトル化しDBへ保存する仕組みができた
次はインプットした情報をベクトル変換し
そのベクトルと近い情報をDBから撮ってきて回答を得る仕組みを作る