RAG 聊天機器人流水線
PR Ready問題 → 檢索 → 重新排序 → 產生含引用的答案 → 收集回饋。
7 個節點 · 6 條連接pr ready
difyragchatbotvector-searchllm
視覺化
接收問題api
使用者透過聊天介面或 API 提交問題。
↓sequential→ 向量檢索
向量檢索db
將查詢向量化,從向量資料庫檢索前 k 個最相關片段。
↓sequential→ 重新排序結果
重新排序結果agent
使用 cross-encoder 重新排序,選出最相關的 5 個片段。
↓sequential→ 產生答案
產生答案agent
使用檢索到的上下文產生有依據的答案,並附上行內引用。
↓sequential→ 格式化引用
格式化引用cli
將行內引用標記對應至來源文件的中繼資料。
↓sequential→ 使用者回饋
使用者回饋human
提供讚/倒讚及選填評語,用於追蹤答案品質。
↓conditional→ 記錄至訓練集
記錄至訓練集db
儲存高評分的問答配對,供未來模型微調使用。
ex-dify-rag-chatbot.osop.yaml
# Dify RAG Chatbot — OSOP Portable Workflow
#
# Retrieval-augmented generation pipeline: receive a user question,
# retrieve relevant chunks from a vector store, rerank for relevance,
# generate a cited answer, and collect user feedback for fine-tuning.
#
# Build in Dify or validate: osop validate dify-rag-chatbot.osop.yaml
osop_version: "1.0"
id: "dify-rag-chatbot"
name:"RAG 聊天機器人流水線"
description:"問題 → 檢索 → 重新排序 → 產生含引用的答案 → 收集回饋。"
version: "1.0.0"
tags: [dify, rag, chatbot, vector-search, llm]
nodes:
- id: "receive_question"
type: "api"
subtype: "webhook"
name: "接收問題"
description: "使用者透過聊天介面或 API 提交問題。"
- id: "retrieve_docs"
type: "db"
name: "向量檢索"
description: "將查詢向量化,從向量資料庫檢索前 k 個最相關片段。"
config:
store: "pinecone"
top_k: 20
embedding_model: "text-embedding-3-small"
- id: "rerank"
type: "agent"
subtype: "llm"
name: "重新排序結果"
description: "使用 cross-encoder 重新排序,選出最相關的 5 個片段。"
config:
model: "cohere-rerank-v3"
top_n: 5
- id: "generate_answer"
type: "agent"
subtype: "llm"
name: "產生答案"
description: "使用檢索到的上下文產生有依據的答案,並附上行內引用。"
config:
model: "gpt-4o"
temperature: 0.3
system_prompt: "Answer using ONLY the provided context. Cite sources as [1], [2], etc."
- id: "format_citations"
type: "cli"
subtype: "script"
name: "格式化引用"
description: "將行內引用標記對應至來源文件的中繼資料。"
- id: "collect_feedback"
type: "human"
name: "使用者回饋"
description: "提供讚/倒讚及選填評語,用於追蹤答案品質。"
- id: "log_for_finetuning"
type: "db"
name: "記錄至訓練集"
description: "儲存高評分的問答配對,供未來模型微調使用。"
edges:
- from: "receive_question"
to: "retrieve_docs"
mode: "sequential"
- from: "retrieve_docs"
to: "rerank"
mode: "sequential"
- from: "rerank"
to: "generate_answer"
mode: "sequential"
- from: "generate_answer"
to: "format_citations"
mode: "sequential"
- from: "format_citations"
to: "collect_feedback"
mode: "sequential"
- from: "collect_feedback"
to: "log_for_finetuning"
mode: "conditional"
when: "feedback == 'positive'"
label: "Good answer — save for training"