- RAG は、最初に関連情報を見つけてプロンプトに追加し、モデルにその情報から回答するよう求めます。
- これは、言語モデルをプライベート データまたは頻繁に変更されるデータに接続する通常の方法です。
- ほとんどの品質問題は、モデルではなく、取得とデータの準備から始まります。
- RAG はでっち上げの回答を減らしますが、なくすことはできないため、テストする必要があります。
一般的な AI アシスタントに会社の返金ポリシーについて尋ねても、推測することしかできません。あなたの文書を見たことがありません。 RAG (検索拡張生成の略) は、適切な情報を検索し、それを質問とともにモデルに渡すことで、この問題を解決します。
このガイドでは、各段階を平易な言葉で説明し、Python の標準ライブラリのみを使用して小さなバージョンを構築します。そのコードを Python 3.13 で実行し、表示されたスコアはその実行から得られたものです。言語モデルを使用していないため、検索とプロンプト構築を示しており、最終的な回答ステップはテストしませんでした。
RAGとは何ですか?
検索拡張生成は、検索ステップと言語モデルを組み合わせた手法です。質問が到着すると、システムは知識ソースを検索し、最適な結果をプロンプトに追加し、モデルにその資料に基づいて回答するよう求めます。
オープンブック試験を考えてみましょう。本を閉じた生徒は記憶に頼っており、自信を持って間違って覚えている可能性があります。本を開いた生徒は、まず適切なページを調べることができます。 RAG はモデルにその本を与え、またモデルがどのページを使用したかをポイントさせます。
RAG が解決する問題
言語モデル自体には、ビジネスで使用する場合に次の 3 つの制限があります。
- それはあなたの個人データを知りません。あなたのポリシー、チケット、契約はそのトレーニングの一部ではありませんでした。
- その知識には限界があります。今朝変更された価格については知ることができません。
- 答えを発明する可能性があります。確信が持てない場合、もっともらしいが間違っているものを生み出す可能性があります。
RAG は 3 つすべてに対応しているため、何も再トレーニングする必要はありません。ドキュメントを更新し、インデックスを再作成すると、次の回答でそのドキュメントを使用できるようになります。
RAG の仕組み (ステップバイステップ)
RAG システムには 2 つのパイプラインがあります。 1 つは事前にデータを準備し、もう 1 つは質問ごとに実行します。
インデックス作成: データの準備
- ロード: PDF、Wiki、データベース、またはチケットからコンテンツを収集します。
- クリーンとチャンク: ジャンクを削除し、ドキュメントを小さな部分に分割します。
- 埋め込み: 各パッセージを、その意味を捉える数値のリスト (埋め込みと呼ばれる) に変換します。
- ストア: エンベディングを検索可能なインデックス (通常は ベクター データベース) に保存します。
クエリ:質問に答えること
- 取得: 質問を埋め込み、意味が最も近い文章を見つけます。
- 拡張: これらの文章をプロンプトに挿入します。
- 生成: モデルはそのコンテキストを使用して回答を書き込みます。
検索にはベクトルを使用する必要はありません。キーワード検索でも SQL クエリでも、データに適した情報を見つけることができます。
小さな実際の例
可動部分をはっきりと見るために、ライブラリを持たない小さなレトリバーをここに示します。これはテキストを単語数として表し、実際の埋め込みのより単純な代用であり、コサイン測定を使用して類似性をスコア付けします。
import math, re
from collections import Counter
DOCS = {
"refunds": "Refunds are paid within 7 days to the original payment method.",
"shipping": "Standard shipping takes 3 to 5 working days across India.",
"warranty": "All keyboards include a 2 year warranty against defects.",
}
def vectorize(text):
return Counter(re.findall(r"[a-z0-9]+", text.lower()))
def similarity(a, b):
dot = sum(a[word] * b[word] for word in a)
size = math.sqrt(sum(v * v for v in a.values()))
size *= math.sqrt(sum(v * v for v in b.values()))
return dot / size if size else 0
def retrieve(question, k=1):
q = vectorize(question)
scored = [(similarity(q, vectorize(t)), name) for name, t in DOCS.items()]
return sorted(scored, reverse=True)[:k]
def build_prompt(question):
(score, name), = retrieve(question)
return (
"Answer using only the context. If it is not there, say you do not know.\n"
f"Context: {DOCS[name]}\n"
f"Question: {question}"
)
払い戻しについて尋ねると、適切な一節が見つかり、次のプロンプトが作成されます。
print(retrieve("How many days until refunds are paid?"))
# [(0.4558..., 'refunds')]
print(build_prompt("How many days until refunds are paid?"))
# Answer using only the context. If it is not there, say you do not know.
# Context: Refunds are paid within 7 days to the original payment method.
# Question: How many days until refunds are paid?
完全なシステムでは、そのプロンプトを言語モデルに送信します。重要な詳細は、答えが見つからない場合にそれを認める指示です。これについては、プロンプト エンジニアリングのガイドで詳しく学ぶことができます。
この例に欠けているもの
次に、同じことを意味しますが、異なる単語を使用する質問を試してください。
print(retrieve("When can I get my money back?", k=3))
# [(0.0, 'warranty'), (0.0, 'shipping'), (0.0, 'refunds')]
質問はどの文書とも単語を共有しないため、すべてのスコアはゼロです。 「返金」とは人間への返金を意味しますが、文字数だけではわかりません。この 1 つの出力は、実際のシステムが エンベディング を使用する理由を説明しています。エンベディングは、共通する単語がなくても、同様の意味を持つテキストが同様の番号になるように設計されています。
ただし、埋め込みによってすべてが解決されるとは考えないでください。製品コードやエラー番号などの正確な用語に苦戦することがありますが、キーワード検索は非常にうまく処理されます。このため、多くの実稼働システムでは 2 つのアプローチを組み合わせた ハイブリッド検索 が使用されます。
チャンキング: 人々が過小評価しているステップ
ファイル全体が長すぎて取得するには不正確であるため、ドキュメントはいくつかのチャンクに分割されます。選択するサイズには実際のトレードオフが関係します。
| チャンクサイズ | 利点 | リスク |
|---|---|---|
| 小さすぎる | 正確な一致 | ルールがどの製品に適用されるかなどのコンテキストが失われる |
| 大きすぎる | コンテキストを維持する | 意味を薄め、プロンプトをより多く使用する |
| 構造ごとに分割 | 見出しとセクションを尊重する | よりクリーンなソースドキュメントが必要 |
チャンク間に重複がある数百の単語が一般的な開始点ですが、それをテストするための最初の推測として扱います。可能な場合は、見出しなどの自然な境界線に沿って分割します。また、ドキュメントのタイトル、日付、部門などのメタデータを添付すると、結果をフィルタリングしたり、出典を引用したりできます。
検索の改善
答えが芳しくない場合、最も試す価値のあるアップグレードは、おおよそ次の順序です。
- データをクリーンアップします。 まず、古いドキュメントや重複したドキュメントを削除します。矛盾したソースを修正するアルゴリズムはありません。
- ハイブリッド検索を使用します。 意味ベースの結果とキーワードの結果を組み合わせます。
- 再ランカーを追加します。 さらに多くの候補を取得し、特殊なモデルを使用して関連性によって候補を並べ替えます。
- メタデータでフィルタリングします。 検索前に製品、地域、または日付ごとに結果を制限します。
- クエリを書き直します。 「2 つ目はどうですか?」のようなあいまいなフォローアップにします。完全な質問になります。
ヒント: モデルを非難する前に、検索で実際に何が返されたかを見てください。適切な文章が文脈に含まれていない場合、モデルはそこから正しく答えることはできません。
RAG と微調整
| 質問 | ラグ | 微調整 |
|---|---|---|
| 何が追加されるのでしょうか? | 質問タイムの知識 | 訓練された行動やスタイル |
| 情報の更新 | ドキュメントのインデックスを再作成する | もう一度トレーニングします |
| 出典を引用することはできますか? | はい | 確実ではありません |
| こんな方に最適 | 変化する事実 | 一貫した形式またはトーン |
これらは相互に排他的ではありません。 RAG、ファインチューニング、プロンプト エンジニアリングの比較では、選択方法をさらに詳しく説明しています。
RAG システムをテストする方法
RAG はソフトウェアであるため、他のソフトウェアと同様にテストが必要です。期待する文章と答えとともに実際の質問のセットを作成し、2 つの段階を個別に測定します。
| ステージ | 尋ねる質問 | 通称 |
|---|---|---|
| 検索 | 正しい一節を見つけられましたか? | コンテキストの想起 |
| 検索 | 私たちが取得したもののうちどれだけが役に立ちましたか? | コンテキストの精度 |
| 世代 | 答えは文脈によって裏付けられていますか? | 忠実さ |
| 世代 | それは本当に質問に答えていますか? | 回答の関連性 |
データに回答がない質問、異なる表現を使用している質問、ソースが矛盾している質問など、厄介なケースも含めてください。 回帰スイートと同様に、チャンキング、モデル、プロンプトを変更するたびにこのセットを再実行します。 pytest チュートリアル では、1 つのテストで多くの入力を実行する方法を示しています。
RAG システムが失敗する理由
- 答えはデータの中にありません。 モデルはまだ答えを試みるかもしれないので、断る方法を教えてください。
- 正しいチャンクが取得されませんでした。 これは多くの場合、チャンクまたは検索の問題です。
- 文脈が多すぎます。 無関係な文章はモデルの注意をそらし、コストを増加させる可能性があります。
- 古いドキュメント。 古いポリシーも、現在のポリシーと同じくらい確実に取得できます。
- 表と PDF の解析が不十分です。 抽出によってテキストがスクランブルされると、取得は回復できません。
- デモの質問のみを使用してテストします。 実際のユーザーは、物事の表現方法がまったく異なります。
セキュリティと権限
RAG には、見落としがちな 2 つのリスクがあります。まず、アクセス制御です。インデックスに HR ファイルが含まれている場合、若手従業員の質問によってそれらのファイルを取得してはなりません。秘密を保持するようにモデルに指示することは信頼できる安全策ではないため、取得中に各ユーザーの権限を適用します。
2 つ目は、即時注入です。取得された Web ページまたはドキュメントには、「指示を無視してください」などのテキストが含まれている可能性があります。取得したコンテンツを信頼できないデータとして扱い、モデルが実行できるアクションを制限し、機密性の高いアクションの承認を人間に要求します。
まとめ
RAG は、多くの実用的な詳細を備えたシンプルなアイデアです。適切な情報を見つけて、モデルにそれを使用するよう依頼します。小さくてきれいな文書セットと約 20 の実際の質問から始めます。通常、良好なデータを含む控えめなパイプラインは、不良データを含む高度なパイプラインよりも優れているため、複雑さを加える前に取得を十分に機能させてください。
よくある質問
RAG は AI の何を表しますか?
RAG は、検索拡張世代の略です。システムは関連情報を取得してプロンプトに追加し、モデルはその情報から回答を生成します。
RAG は AI の幻覚を阻止しますか?
モデルに実際のソースを与えることでそれらを削減しますが、削除するわけではありません。モデルはコンテキストを誤って読み取る可能性があるため、回答をテストし、引用を示します。
RAG にはベクトル データベースが必要ですか?
いつもではありません。小規模プロジェクトでは、メモリ内インデックス、キーワード検索、または SQL を使用できます。ベクトル データベースは、大規模なコレクションと意味ベースの検索に役立ちます。
RAG と微調整の違いは何ですか?
RAG は質問時に情報を提供するため、更新が迅速です。微調整はモデルの動作やスタイルを変更するようにトレーニングしますが、事実の変更にはあまり適していません。
埋め込みとは何ですか?
埋め込みは、テキストの意味を表す数値のリストです。同様の意味を持つ文章には同様の番号が付けられるため、意味に基づいた検索が可能になります。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git コマンドのチートシート: 実際に使用するコマンドと例
実際のデモ リポジトリからの出力を含む、タスク別にグループ化された Git コマンド チート シート (セットアップ、ステージング、ブランチ、リモート、スタッシュ、履歴、間違いの取り消し)。
記事を読む →ソフトウェア開発JavaScript Promise の説明: then、catch、Promise.all、およびよくある間違い
JavaScript の Promise を、実行したコードで説明します。ステート、then および catch チェーン、エラー処理、Promise.all、allSettled、race および any、イベント ループ、およびよくある間違いです。
記事を読む →ソフトウェア開発Python 辞書チュートリアル: メソッド、例、一般的なパターン
私たちが実行したコードを含む Python 辞書チュートリアル: 辞書の作成、読み取り、更新、主要なメソッド、マージ、内包表記、パターンのカウントとグループ化、およびよくある間違い。
記事を読む →人工知能RAGとは何ですか?検索拡張生成を実際の例で説明する
RAGとは何ですか?検索拡張生成について、インデックス作成、チャンク化、埋め込み、検索、実際に動作する小さな Python の例、評価、一般的な失敗など、ステップごとに説明します。
記事を読む →DevOps初心者向け Terraform チュートリアル: 最初のファイルからモジュールまでのコードとしてのインフラストラクチャ
初心者向けの Terraform チュートリアル: クラウド アカウントなしで開始し、初期化、計画、適用を学び、次に変数、出力、状態、モジュール、安全なチーム ワークフローを学びます。
記事を読む →DevOpsDocker と Kubernetes: 主な違い、連携方法、どちらが必要か
Docker と Kubernetes について説明しました。それぞれの機能、同じアプリを両方で実行すること、Docker Compose と Swarm の比較、dockershim の変更、必要なものを決定する方法などです。
記事を読む →テスト自動化初心者向けの Pytest チュートリアル: フィクスチャ、パラメータ化、実際の例
pytest 9.2 で実行したテストを含む初心者向けの pytest チュートリアル: アサーション、フィクスチャ、parametrize、conftest、マーカー、tmp_path、monkeypatch、便利なフラグ、CI。
記事を読む →ソフトウェアテストソフトウェア テスト ライフ サイクル (STLC): 6 つのフェーズ、開始基準と終了基準、例
ソフトウェア テストのライフ サイクルについては、開始基準と終了基準を含む 6 つの STLC フェーズ、成果物、実際に動作するログイン機能の例、STLC と SDLC、およびアジャイルにおける STLC について説明しました。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →