LangChainと Cloudflare Vectoriseを使ってみた

1.6K Views

October 26, 23

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

LangChainと Cloudflare Vectoriseを使ってみた Cloudflare Meet-up Osaka Vol.3

2.

今日伝えたいこと • Vectoriseを使うと、「ベクトルデータ」を管理できる • データはベクトル化(Embedding)して保存・検索しよう • 類似検索だけなら、LLM無しでもできそう

3.

HELLO! ✋ 岡本 秀高 (Hide) • Stripe Developer Advocate • WordCamp Kyoto 2017 • @hidetaka_dev • https://hidetaka.dev

4.

作ったもの • LangChain / OpenAI / Cloud are • VectoriseとWorkersを利用 fl • WordPressの記事情報を100件インポート

5.

Retrieval Augmented Generation (RAG) • 検索・取得した情報を基に、新しいテキストを生成する仕組み • 検索結果をLLMに渡して、回答文を生成するイメージ • 「自然言語による検索」の実装方法として、 ベクトルデータを利用した検索が採用されやすい

6.

この2ルートは、どれくらい似ているか?

7.

OpenAI / Cloudflare Workers AIでの RAGの流れ(大枠) • ユーザーが質問を自然文で入力する • LLMが文章をベクトルデータに変換する • ベクトルDBで、「類似性の高いベクトル」を検索する • 検索結果と質問文をLLMに渡して、回答文を生成する

8.

Cloudflareの ベクトルDBサービス

9.

wrangler vectorize create \ openai-rag-demo \ —dimensions=1536 \ —metric=cosine Wranglerで DBを生成

10.

モデルによって次元( dimensions )が違う fl https://developers.cloud are.com/vectorize/learning/create-indexes/

11.

const app = new Hono<{ Bindings: { WORKER_AI_API_KEY: string VECTORIZE_INDEX: VectorizeIndex; } }>() Honoで VectoriseをBind

12.
[beta]
記事データをドキュメントに変換
const fetchResult = await fetch(‘WP_API_URL’)
const posts = await fetchResult.json()
const documents= []
const documentIndex = []
posts.forEach((post) => {
documents.push({
pageContent: `Content:\n${post.excerpt.rendered}`,
metadata: {
post_id: post.id.toString(),
post_title: post.title.rendered,
post_url: post.link.replace(/wp-api./, '')
}
})
documentIndex.push(post.id.toString())
})

fl

https://developers.cloud are.com/pages/framework-guides/deploy-an-astro-site/

13.
[beta]
ベクトル変換後、Vectoriseに保存

const embeddings = new OpenAIEmbeddings({
openAIApiKey: c.env.OPENAI_API_KEY
})
const store = new CloudflareVectorizeStore(embeddings, {
index: c.env.VECTORIZE_INDEX,
});
await store.addDocuments(documents, { ids: documentIndex})

fl

https://developers.cloud are.com/pages/framework-guides/deploy-an-astro-site/

14.
[beta]
LLMとVectoriseで検索
const model = new ChatOpenAI({ temperature: 0, openAIApiKey: c.env.OPENAI_API_KEY });
const embeddings = new OpenAIEmbeddings({ openAIApiKey: c.env.OPENAI_API_KEY })
const store = new CloudflareVectorizeStore(embeddings, { index: c.env.VECTORIZE_INDEX, });
const serializeDocs = (docs: Array<Document>): string => docs.map((doc) => doc.pageContent).join(“\n");
const SYSTEM_TEMPLATE = `Use the following pieces of context to answer the question at the end.
If you don't know the answer, just say that you don't know, don't try to make up an answer.
---------------{context}`;
const messages = [
SystemMessagePromptTemplate.fromTemplate(SYSTEM_TEMPLATE),
HumanMessagePromptTemplate.fromTemplate("{question}"),
];
const prompt = ChatPromptTemplate.fromMessages(messages);
const vectorStoreRetriever = store.asRetriever();
const chain = RunnableSequence.from([{
context: vectorStoreRetriever.pipe(serializeDocs),
question: new RunnablePassthrough(),
}, prompt, model, new StringOutputParser(),
]);
const answer = await chain.invoke({question});

fl

https://developers.cloud are.com/pages/framework-guides/deploy-an-astro-site/

15.
[beta]
レスポンスをStreamで返す方法

return c.streamText(async stream => {
const answerStream = await chain.invoke({question}, {
callbacks: [
{
handleLLMNewToken(token: string) {
stream.write(token))
},
},
],
});

fl

https://developers.cloud are.com/pages/framework-guides/deploy-an-astro-site/

16.
[beta]
[応用] Vectoriseだけで類似記事検索
app.get('/:post_id/similar', async c => {
const postId = c.req.param('post_id')
const [postVector] = await c.env.VECTORIZE_INDEX.getByIds([postId])
const similarPostsData = await c.env.VECTORIZE_INDEX.query(postVector.values, {})
const targetPostIds = similarPostsData.matches.map(match => {
if (match.vectorId === postId) return null
return match.vectorId
}).filter((id): id is string => !!id)
const postData = await c.env.VECTORIZE_INDEX.getByIds(targetPostIds)
const similarPosts = postData.map(post => {
return post.metadata
})
return c.json({post: postVector.metadata?.post_title,similarPosts})
})

fl

https://developers.cloud are.com/pages/framework-guides/deploy-an-astro-site/

17.

今日伝えたいこと • Vectoriseを使うと、「ベクトルデータ」を管理できる • データはベクトル化(Embedding)して保存・検索しよう • 類似検索だけなら、LLM無しでもできそう