LangChain と Upstash Redis を使用したチャット履歴の永続化
LangChain は、人間と AI の間で会話を行うためのシンプルなインターフェイスを提供します。 BufferMemory を使用するように簡単に設定できます。 、会話履歴をメモリに保存できるようになります。一部のユースケースではこれで十分かもしれませんが、アプリではチャット履歴の長期保持が必要な場合もあります。幸いなことに、これを Upstash Redis インスタンスに交換することも同様に簡単です。
LangChain は、ioredis などの Redis 用の複数の統合を提供します 、node-redis そしてUpstash Redis。 Upstash Redis クライアントは REST 経由で動作するため、これを使用して、Vercel、Cloudflare Workers、またはその他のサーバーレス環境にデプロイできるエッジ対応アプリケーションを作成できます。これを使用して、セッション間で保持されるメモリを備えたシンプルなチャット アプリを作成します。
このデモの完全なソース コードはここで見つけることができます。
前提条件
- Upstash Redis データベース
- OpenAI API キー
はじめに
プロジェクトの作成
Vercel AI SDK を使用して基本的な Next.js アプリを構築し、Upstash Redis で LangChain を使用する方法を示します。まず、新しい Next.js アプリを作成します。
npx create-next-app@latest
これにより、いくつかのプロジェクト オプションを選択するように求められます。ほとんどのアプリでは、デフォルトのままで問題なく動作します。このデモでは、TypeScript と app を必ず有効にしてください。 ディレクトリ。
依存関係のインストール
アプリを作成したら、いくつかの依存関係をインストールする必要があります。
npm install ai langchain openai @upstash/redis
厳密には必須ではありませんが、Vercel AI SDK を使用すると、OpenAI から Next.js フロントエンドへの応答のストリーミングが容易になります。 @upstash/redis のみを使用する必要があります。 Redis クライアントを作成します。残りは LangChain が処理します。
環境変数の設定
最後に、前に前提条件として示した次の環境変数が必要になります。ここで説明されているとおりに正確に名前を付けるようにしてください。そうしないと、自動的に読み取られないからです。これらを .env に追加できます。 新しいプロジェクトのルートにあるファイル:
UPSTASH_REDIS_REST_URL="https://********.upstash.io"
UPSTASH_REDIS_REST_TOKEN="********"
OPENAI_API_KEY="sk-********" 基本的なチャット クライアントの作成
Next.js が多数のファイルを作成したことがわかります。 app 内のいくつかのファイルのみを操作します。 ディレクトリにあるので、現在 public にあるものをすべて削除してください。 と app .
まず、基本的な app/layout.tsx を作成します。 アプリを収容するには:
import type { PropsWithChildren } from "react";
export default function RootLayout({ children }: PropsWithChildren) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
次に、ユーザーからのメッセージを受け入れるための入力を含む基本的なフォームが必要になります。これは app/page.tsx に追加できます。 :
export default function Home() {
return (
<main>
<form>
<input placeholder="Enter a message..." />
<button type="submit">Send</button>
</form>
</main>
);
}

Vercel AI SDK は、useChat という便利なフックをエクスポートします。 これにより、チャット アプリの従来のユーザー インターフェイスを非常に簡単に作成できます。チャット メッセージのストリーミングを処理し、チャット入力の状態を管理します。フックを使用するには、"use client" を追加して、これがクライアント コンポーネントであることを React に伝える必要があります。 ファイルの先頭にディレクティブを追加します。次に、useChat からいくつかのプロパティを分解できます。 フック:
messages送受信されたメッセージの配列です。input入力フィールドの現在の値です。handleInputChangeは入力値を更新する関数です。handleSubmitメッセージをエンドポイントに送信する関数です。
"use client";
import { useChat } from "ai/react";
export default function Home() {
const { messages, input, handleInputChange, handleSubmit } = useChat();
return (
<main>
<form onSubmit={handleSubmit}>
<input
value={input}
onChange={handleInputChange}
placeholder="Enter a message..."
/>
<button type="submit">Send</button>
</form>
</main>
);
}
内部的には、useChat フックは自動的に input を追加します messages へ handleSubmit のとき が呼び出され、再レンダリングがトリガーされるため、UI を自分で更新することを心配する必要はありません。また、入力フィールドもクリアされ、指定されたエンドポイントへの API 呼び出しがトリガーされます。デフォルトでは、これは /api/chat です。 .
最後に、messages をレンダリングしましょう。 フォームの上:
<main>
<section>
{messages.map((message) => (
<p key={message.id}>{message.content}</p>
))}
</section>
{/* snip */}
</main> API エンドポイントの作成
app/api/chat/route.ts を作成することから始めます。 エンドポイントを格納するファイル。 Next.js は、ページだけでなく API エンドポイントにもファイルベースのルーティングを使用します。これが、この新しいファイルのフォルダー構造がデフォルトのエンドポイント /api/chat と一致する理由です。 、前から。
Upstash Redis を使用しているため、エンドポイントはエッジ互換です。 const runtime = "edge" をエクスポートすることでこれを指定できます。 エンドポイントから。エンドポイント自体で、messages を取得できます。 useChat のフィールド フックが自動的に設定されます。これにより、最新のメッセージを LangChain に渡すことができます。
import { type NextRequest } from "next/server";
import { LangChainStream, StreamingTextResponse } from "ai";
export const runtime = "edge";
export async function POST(req: NextRequest) {
const { messages } = await req.json();
const { stream, handlers } = LangChainStream();
const latestMessage = messages[messages.length - 1];
return new StreamingTextResponse(stream);
}
useChat のように 前から、LangChainStream また、分解できるいくつかのプロパティも返します。
streamReadableStreamです 最終的には、LangChain プロセスの結果が含まれます。handlersは、LangChain に渡すことができる LLM コールバック関数を含むオブジェクトです。
チェーン自体を実装する前に、いくつかの追加クラスをインポートする必要があります。
import { Redis } from "@upstash/redis";
import { ConversationChain } from "langchain/chains";
import { ChatOpenAI } from "langchain/chat_models/openai";
import { BufferMemory } from "langchain/memory";
import { UpstashRedisChatMessageHistory } from "langchain/stores/message/upstash_redis";
これで、Redis クライアントを作成し、チェーンのメモリをセットアップできるようになりました。ここでは、ConversationChain を作成します。 モデル自体の代わりに呼び出すことができます。これは、人間と AI の間の会話を容易にするカスタム チェーンです。カスタムの BaseMemory を渡すことができます。 チェーンへの実装。メッセージの保存と取得に使用されます。この場合、BufferMemory を使用しています。 UpstashRedisChatMessageHistory を使用 メッセージを Upstash Redis に保存するには:
// snip
const latestMessage = messages[messages.length - 1];
const memory = new BufferMemory({
chatHistory: new UpstashRedisChatMessageHistory({
sessionId: new Date().toLocaleDateString(),
client: Redis.fromEnv(),
}),
});
const model = new ChatOpenAI({
modelName: "gpt-3.5-turbo",
streaming: true,
});
const chain = new ConversationChain({ llm: model, memory });
// snip
Redis を使用して新しい Redis クライアントを構築します。 @upstash/redis から探索されたクラス 。 ChatOpenAI の動作を反映する、環境変数を自動的にロードするメソッドを便利に提供します。 。環境変数に正しく名前を付けていれば、これらのクラスのいずれにも追加の引数を渡す必要はありません。
アプリでは、ユーザーの ID またはその他の一意の識別子を sessionId に使用することができます。 メッセージがユーザー間で共有されないようにするためですが、このデモでは現在の日付を使用します。 UpstashRedisChatMessageHistory sessionTTL などのその他の構成オプションを提供します キャッシュの有効期間を設定します。
streaming を有効にすることが重要です これにより、構造化された handlers を使用できるようになります。 チェーンの結果を stream にパイプするための以前のオブジェクト 。最後に、チェーンを呼び出して、最新のメッセージと handlers を渡します。 オブジェクト:
// snip
const chain = new ConversationChain({ llm: model, memory });
chain.call({
input: latestMessage.content,
callbacks: [handlers],
});
return new StreamingTextResponse(stream);
// snip
私たちの latestMessage 前のオブジェクトは LLM のプロンプトとして使用されます。 handlers も渡します。 オブジェクトをチェーンに渡します。これは結果を stream にパイプするために使用されます。 .
結論
それです! npm run dev を使用してアプリを実行できるようになりました。 AI とのチャットを開始します。応答は、前に作成したクライアントに自動的にストリーミングされ、会話履歴は Upstash Redis に保存されます。


-
RediSearch2.0が最初のマイルストーンに到達
RediSearch2.0の開発における最初のマイルストーンのリリースを発表できることを嬉しく思います。 RediSearchは、Redisデータをクエリして、さまざまな複雑な質問に答えることができるリアルタイム検索エンジンです。 2.0-M01と呼ばれるこのマイルストーンは、インデックスがデータと同期し続ける方法の再構築を示しています。インデックスを介してデータを書き込む代わりに( FT.ADD を使用) コマンド)、RediSearchはハッシュで書き込まれたデータを追跡し、自動的にインデックスを作成します。 ここでの大きな利点は、アプリケーションコードを更新しなくても、既存のRe
-
Redis で MCP 開発を加速:高速でコスト効率の高いソリューション
モデル コンテキスト プロトコル (MCP) は、AI モデルを外部ツールやデータ ソースに接続するための標準的な方法として急速に普及しつつあります。 MCP の採用が進むにつれて、開発者は、堅牢で本番環境に対応した MCP 実装を構築するには、単に仕様に従うだけではなく、適切なインフラストラクチャが必要であることに気づき始めています。この投稿では、Vercel の SSE 実装での分散サーバーレス機能の調整、長時間実行ストリームのイベント再開の有効化、Clerk による安全な OAuth フローの管理という 3 つの異なる MCP ユースケースを Redis がどのように強化するかを説明しま