使用python的requests包构建RAG模型问答程序,代码参考如下:
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”
2130

被折叠的 条评论
为什么被折叠?



