RAGFlow的API封装 客户端脚本

该文章已生成可运行项目,

使用python的requests包构建RAG模型问答程序,代码参考如下:

HTTP API | RAGFlow

markdown:

1. 找到Ragflow的知识库 ID
2. 获取或创建一个聊天助手(ChatBot)
3. 启动一次聊天 session(第一次默认问个问题)
4. 循环等待用户提问,并打印助手的回答

import requests, json, sys

API_URL       = "http://userIP:8000"
AUTHORIZATION = "ragflow-API" # 你的RagflowAPI
DATASET_NAME  = "aa"          # 你的知识库
ASSIST_NAME   = "aa-bot"      # 给聊天助手起个名(随意)

HEADERS_JSON = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {AUTHORIZATION}",
}

# ---------- 工具函数 ----------
def rq(method, url, allow_code_102=False, **kw):
    kw.setdefault("headers", HEADERS_JSON)
    r = requests.request(method, f"{API_URL}{url}", timeout=None, **kw)
    r.raise_for_status()
    j = r.json()
    code = j.get("code")
    if code == 102 and allow_code_102:
        return None
    if code != 0:
        raise RuntimeError(f"[API {code}] {j.get('message')}")
    return j.get("data")


def get_dataset_id(name):
    data = rq("GET", "/api/v1/datasets", params={"name": name})
    return data[0]["id"] if data else None

def get_or_create_chat(
    dataset_id: str,
    name: str,
    *,
    avatar: str | None = None,
    dataset_ids: list[str] | None = None,
    llm: dict | None = None,
    prompt: dict | None = None,
) -> str:
    dataset_ids = dataset_ids or [dataset_id]

    # --- Step 1. 查找是否存在 ---
    chat_data = rq("GET", "/api/v1/chats", params={"name": name}, allow_code_102=True)
    if chat_data:
        chat_id = chat_data[0]["id"]

        # --- Step 2. 比较配置差异 ---
        patch_payload = {}
        def _set(k, new, old):
            if new is not None and new != old:
                patch_payload[k] = new

        _set("avatar", avatar, chat_data[0].get("avatar"))
        _set("dataset_ids", dataset_ids, chat_data[0].get("dataset_ids", []))
        _set("llm", llm, chat_data[0].get("llm"))
        _set("prompt", prompt, chat_data[0].get("prompt"))

        if patch_payload:
            try:
                rq("PATCH", f"/api/v1/chats/{chat_id}", json=patch_payload)
            except RuntimeError as e:
                if "Method Not Allowed" in str(e) or "code 100" in str(e):
                    rq("PUT", f"/api/v1/chats/{chat_id}", json=patch_payload)
                else:
                    raise
        return chat_id

    # --- Step 3. 不存在则创建 ---
    payload = {
        "name": name,
        "avatar": avatar or "",
        "dataset_ids": dataset_ids,
        "llm": llm,
        "prompt": prompt,
    }
    return rq("POST", "/api/v1/chats", json=payload)["id"]




def stream_chat(chat_id, question, session_id=None):
    payload = {"question": question, "stream": True}
    if session_id:
        payload["session_id"] = session_id

    with requests.post(
        f"{API_URL}/api/v1/chats/{chat_id}/completions",
        headers=HEADERS_JSON,
        json=payload,
        stream=True,
    ) as r:
        r.raise_for_status()

        printed_len = 0          # ← 新增:已打印的字符数
        new_session = session_id

        for raw in r.iter_lines(decode_unicode=True):
            if not raw or raw.startswith(":"):
                continue
            json_part = raw[raw.find("{"):]
            try:
                chunk = json.loads(json_part)
            except json.JSONDecodeError:
                continue

            if chunk.get("code") != 0:
                raise RuntimeError(chunk)

            data = chunk["data"]
            if data is True:          # 结束标志
                print()
                return new_session

            if isinstance(data, dict):
                ans = data.get("answer", "")
                # ---------- 只打印新增部分 ----------
                delta = ans[printed_len:]
                if delta:
                    print(delta, end="", flush=True)
                    printed_len = len(ans)
                # -----------------------------------
                new_session = data.get("session_id", new_session)

# ---------- 主程序 ----------
def main():
    ds_id = get_dataset_id(DATASET_NAME)
    if not ds_id:
        print(f"❌ 找不到知识库『{DATASET_NAME}』"); return
    chat_id = get_or_create_chat(ds_id, ASSIST_NAME)

    session = None
    q = "start ragflow!"
    session = stream_chat(chat_id, q, session)
    while True:
        q = input("请输入您的问题(exit 退出):").strip()
        if q.lower() == "exit":
            break
        try:
            session = stream_chat(chat_id, q, session)
        except Exception as e:
            print("\n[错误]", e)

if __name__ == "__main__":
    main()

注:假设已经在Ragflow构建有数据库,名字例如代码第五行“aa”

本文章已经生成可运行项目
### RAGFlow 知识库 API 使用教程或技术文档 RAGFlow 是一种结合了检索增强生成(Retrieval-Augmented Generation, RAG)的架构,用于提升模型在特定领域内的知识检索和生成能力。对于 RAGFlow 知识库 API 的使用,可以从以下几个方面进行探讨: #### 1. 配置外部知识库 API 在 Dify 中接入 RAGFlow 知识库时,需要通过外部知识库 API 进行配置。具体步骤包括: - 在 Dify 的知识库界面中选择“外部知识库 API”选项。 - 点击“添加外部知识库 API”,进入配置界面。 - 在 API Endpoint 字段中填写 RAGFlow 的地址,格式为 `http://<your-ragflow-address>/api/v1/dift`[^1]。 - 在 API Key 字段中填入上一步创建的密钥,确保访问权限的安全性。 #### 2. 数据接口与功能扩展 如果需要从 RAGFlow 知识库中获取结构化数据,可以参考金融领域的 API 接口设计思路。例如,通过调用相应的函数并传入参数,可以实现对知识库内容的查询和提取。这种方式不仅提高了数据的准确性,还能够满足实时更新的需求[^2]。 #### 3. 应用更新与维护 当 RAGFlow 知识库的功能或接口发生变更时,可以通过 Docker 命令完成应用的更新。具体的命令如下: ```bash docker compose down git pull origin main docker compose pull docker compose up -d ``` 这些命令可以帮助用户在本地环境中快速同步最新的功能和修复[^3]。 #### 4. 大模型配置与策略优化 如果 RAGFlow 知识库采用了 RAPTOR 策略,则需要额外配置大模型以支持复杂的推理任务。在此过程中,Dify 已经默认配置好了 rerank 模型和 embedding 模型,因此只需关注 chat 模型的配置即可[^4]。 #### 示例代码:调用 RAGFlow API 以下是一个简单的 Python 示例,展示如何通过 API 获取 RAGFlow 知识库中的数据: ```python import requests def fetch_ragflow_data(api_url, api_key, query): headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } payload = { "query": query } response = requests.post(api_url, headers=headers, json=payload) if response.status_code == 200: return response.json() else: return {"error": "Failed to fetch data"} # 示例调用 api_url = "http://<your-ragflow-address>/api/v1/dift" api_key = "<your-api-key>" query = "机器学习的基本概念" result = fetch_ragflow_data(api_url, api_key, query) print(result) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值