Posted on 2025/07/19, 6:07 PM By admin22
LLMのアプリケーションを開発するライブラリLangChainを使って、与えたテキストをもとに質問に回答をするアプリを実装してみました。
まずは簡単なチャットで、動作確認。
1 2 3 4 5 |
from langchain_openai import ChatOpenAI llm = ChatOpenAI(base_url="http://192.168.0.xxx:1234/v1", api_key="not-needed", temperature=0.7) text = "hello" print(llm.invoke(text).content) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import requests from langchain_community.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain.chains import RetrievalQA from langchain.schema.embeddings import Embeddings from langchain_openai import ChatOpenAI # LM Studio の埋め込み API を使うクラスを定義 class LMStudioEmbeddings(Embeddings): def __init__(self, api_url="http://192.168.0.xxx:1234/v1/embeddings", model_name="nomic-embed-text-v1.5.Q4_K_M.gguf"): self.api_url = api_url self.model_name = model_name def embed_documents(self, texts): return [self.embed_query(text) for text in texts] def embed_query(self, text): response = requests.post( self.api_url, headers={"Content-Type": "application/json"}, json={ "input": text, "model": self.model_name } ) return response.json()["data"][0]["embedding"] with open('text.txt', 'r') as file: raw_text = file.read() # テキスト分割 text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_text(raw_text) # ベクトルストア embeddings = LMStudioEmbeddings() docsearch = Chroma.from_texts( texts, embeddings, metadatas=[{"source": str(i)} for i in range(len(texts))], persist_directory="./chroma_db" ) # LLM 本体は LM Studio 経由の ChatOpenAI llm = ChatOpenAI(base_url="http://192.168.0.xxx:1234/v1", api_key="not-needed", temperature=0.7) # 質問応答チェーンの作成 qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=docsearch.as_retriever()) query = "ルミナールの奏法について、400文字くらいで日本語で教えて" #print(qa.run(query)) print(qa.invoke(query)['result']) |
エンベディングモデルと、言語モデルと二つLM Studioから得ています。
入力テキストはChatGPTで生成した、架空の楽器にまつわる架空の話にしました。
LM Studioのログ画面
さまざまな要素を使った実装で、LangChainの利便性が理解できた気がします。
Categories: 未分類