TH ▾
รับคีย์ API

แชท OpenAI ใน LangChain ด้วย API ที่ไม่เซ็นเซอร์ API แบบไม่เซ็นเซอร์

คลาส ChatOpenAI ของ LangChain ทำงานกับเอนด์พอยต์ที่เข้ากันได้กับ OpenAI การตั้งค่า Python และ Node สตรีมมิง เอเจนต์ที่เรียกใช้เครื่องมือ เอาต์พุต JSON และขีดจำกัดอัตรา ดังนั้นคุณจึงเปลี่ยนเฉพาะ URL ฐาน คีย์ และชื่อโมเดลเท่านั้น หน้าหน้านี้แสดงการตั้งค่าใน Python และ Node จากนั้นจึงสร้างการสตรีมมิง เครื่องมือ และตัวแทนขนาดเล็ก

อัปเดต

โซ่ไอโซเมตริกของวงแหวนที่เชื่อมโยงกันซึ่งป้อนฟองแชทเข้าสู่กล่องเซิร์ฟเวอร์ ซึ่งแสดงถึงการเชื่อมต่อ LangChain กับ API

ประเด็นสำคัญ

  1. ChatOpenAI ต้องการการตั้งค่าสามอย่าง: base_url, api_key และโมเดลเป็น uncensored
  2. การสตรีมมิง การเรียกใช้ฟังก์ชัน และโหมด JSON ล้วนผ่านอินเทอร์เฟซมาตรฐานของ LangChain
  3. จำกัด concurrency ที่ 8 และจัดการ HTTP 429 ด้วย API ที่ไม่เซ็นเซอร์การลองซ้ำเพื่ออยู่ภายในขีดจำกัด
  4. การรันตัวแทน 10 ขั้นตอนมีต้นทุนต่ำกว่าหนึ่งเซ็นต์ที่ $0.15 และ $0.50 ต่อ 1M โทเคน

คำตอบสั้นๆ: การตั้งค่าสามอย่างบน ChatOpenAI

หากคุณค้นหา chat open ai langchain คุณน่าจะมีโครงการ LangChain ที่ใช้ ChatOpenAI อยู่แล้ว และต้องการให้มันสื่อสารกับแบ็กเอนด์อื่น นั่นเป็นการเปลี่ยนแปลงการกำหนดค่า ไม่ใช่การเขียนใหม่ API บนเว็บไซต์นี้ใช้โปรโตคอลการสนทนาแชทของ OpenAI ดังนั้น LangChain จึงถือว่ามันเหมือนกับเซิร์ฟเวอร์สไตล์ OpenAI อื่นๆ

คุณต้องการ URL ฐาน คีย์ API และรหัสโมเดล uncensored ติดตั้งแพ็กเกจก่อน:

pip install -U langchain-openai langgraph

จากนั้นสร้างออบเจกต์โมเดล:

import os
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    temperature=0.8,
)

reply = llm.invoke("Write a two-sentence villain monologue for a heist novel.")
print(reply.content)

นั่นคือการผสานรวมทั้งหมด ฟีเจอร์ LangChain ทุกอย่างที่ใช้ ChatOpenAI จะทำงานกับโมเดลแบบไม่เซ็นเซอร์: โซ่ ตัวดึงข้อมูลที่เรียกโมเดลแชท ตัวแยกวิเคราะห์ผลลัพธ์ และตัวแทน หากยังไม่มีคีย์ หน้า คีย์ API อธิบายการสมัครและเครดิตทดลองใช้แบบคลิกเดียว

เก็บคีย์ไว้จากโค้ดของคุณ

ใส่คีย์ในตัวแปรสภาพแวดล้อมและอ่านค่าเมื่อเริ่มต้น บน Linux หรือ macOS:

export NOFILTER_API_KEY="paste-your-key-here"

สร้างโมดูล client ร่วมสำหรับโปรเจกต์ เช่น llm.py ที่สร้างโมเดลครั้งเดียวแล้ว export ออกมา ทุก chain จะ import object เดียวกัน และการเปลี่ยนคีย์ timeout หรือ temperature ในภายหลังจะเกิดขึ้นในจุดเดียว นอกจากนี้ยังง่ายต่อการรักษา instance อื่นที่เย็นกว่าสำหรับขั้นตอน tool และ instance ที่ร้อนกว่าสำหรับการเขียนเชิงสร้างสรรค์ ทั้งสองชี้ไปที่ endpoint เดียวกันแต่ตั้งค่าต่างกัน

กับดักอย่างหนึ่งที่ทำให้หลายคนสับสน: ChatOpenAI ยังอ่าน OPENAI_API_KEY และ OPENAI_API_BASE จากตัวแปรสภาพแวดล้อม หากตัวแปรเหล่านั้นถูกตั้งค่าสำหรับโครงการอื่น วัตถุที่กึ่งกำหนดค่าอาจส่งคำขอของคุณไปยังเซิร์ฟเวอร์ที่ผิด การส่ง base_url และ api_key อย่างชัดเจนตามที่แสดงไว้ข้างต้นจะขจัดความกำกวม

คุณสามารถยืนยันการเชื่อมต่อโดยไม่ต้องใช้ LangChain เลย เอนด์พอยต์ models ควรส่งคืนรายการเดียว:

curl https://api.nofilteraichat.com/v1/models \
  -H "Authorization: Bearer $NOFILTER_API_KEY"

หากสิ่งนั้นทำงานได้แต่ LangChain ล้มเหลว ปัญหาคืออยู่ในสภาพแวดล้อม Python ของคุณ ไม่ใช่คีย์ หากทั้งสองล้มเหลวด้วย API ที่ไม่เซ็นเซอร์ 401 ให้ตรวจสอบช่องว่างหรือบรรทัดใหม่ที่ไม่พึงประสงค์ในคีย์ หน้า เริ่มต้นอย่างรวดเร็ว แสดงรูปแบบคำขอที่แน่นอนสำหรับการเปรียบเทียบ

สตรีมมิงและการใช้งานโทเคน

UI แชทจะใช้งานได้ดีขึ้นเมื่อโทเคนปรากฏขึ้นขณะกำลังสร้าง LangChain เปิดใช้งานฟีเจอร์นี้ผ่าน .stream() และเซิร์ฟเวอร์จะส่งข้อมูลแบบ SSE มาตรฐานเมื่อตั้งค่า stream: true ไว้เบื้องหลัง

from langchain_openai import ChatOpenAI
import os

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    stream_usage=True,
)

final = None
for chunk in llm.stream("Describe a rainy harbour town in four sentences."):
    print(chunk.content, end="", flush=True)
    final = chunk if final is None else final + chunk

print()
print(final.usage_metadata)

ด้วย API ที่ไม่เซ็นเซอร์ stream_usage=True ข้อมูลส่วนสุดท้ายจะรวมจำนวนโทเคนอินพุตและเอาต์พุต ซึ่ง API จะส่งที่ท้ายสตรีม เก็บตัวเลขเหล่านี้ไว้ เป็นวิธีที่ประหยัดที่สุดในการดูว่าตัวแทนมีต้นทุนจริงเท่าไร และเราใช้ตัวเลขเหล่านี้ในส่วนต้นทุนด้านล่าง

สิ่งหนึ่งที่ต้องจำไว้: คำขอแบบสตรีมมิงจะยึดช่องความพร้อมใช้งานไว้จนกว่าสตรีมจะเสร็จสิ้น หากคุณทิ้งสตรีมโดยไม่ปิดมัน ช่องนั้นจะไม่ว่างนานกว่าที่คุณคาดไว้

Node และ TypeScript

แพ็กเกจ JavaScript ใช้ชื่อตัวเลือกที่แตกต่างเล็กน้อย URL ฐานจะอยู่ภายใน configuration:

npm install @langchain/openai @langchain/core
import { ChatOpenAI } from "@langchain/openai";

const llm = new ChatOpenAI({
  model: "uncensored",
  apiKey: process.env.NOFILTER_API_KEY,
  configuration: { baseURL: "https://api.nofilteraichat.com/v1" },
  temperature: 0.8,
});

const res = await llm.invoke("Give me three names for a smuggler's ship.");
console.log(res.content);

ประเภท TypeScript สำหรับการตอบกลับคือคลาสข้อความ LangChain มาตรฐาน ดังนั้นโค้ดที่มีอยู่ซึ่งอ่าน res.content หรือ res.usage_metadata จึงยังคงทำงานได้ เมื่อคุณเรียกใช้สิ่งนี้ภายในเส้นทางเซิร์ฟเวอร์ ให้สร้างโมเดลหนึ่งครั้งในระดับโมดูลแทนที่จะต่อคำขอ นั่นจะหลีกเลี่ยงการสร้าง HTTP client ใหม่สำหรับทุกการเรียกใช้ และทำให้การคิดเกี่ยวกับการทำงานพร้อมกันของคุณง่ายขึ้น

สิ่งอื่นๆ ทั้งหมด รวมถึง .stream(), .bindTools() และ .withStructuredOutput() ทำงานในลักษณะเดียวกันกับ Python อุณหภูมิ top_p ลำดับหยุด ตัวเลขสุ่ม และตัวเลือกค่าปรับจะถูกส่งผ่านไปยังโมเดล ดังนั้นคุณสามารถตั้งค่าบนคอนสตรัคเตอร์ได้เหมือนที่คุณทำกับแบ็กเอนด์สไตล์ OpenAI อื่นๆ

การเรียกใช้เครื่องมือและเอเจนต์ขนาดเล็ก

API รองรับ function calling: ฟิลด์ tools และ tool_choice, สตรีมมิง tool_calls และผลลัพธ์เครื่องมือที่ส่งกลับเป็นข้อความ role: "tool" ตัวแทนที่สร้างไว้ล่วงหน้าของ LangGraph ใช้ลูปนั้นพอดี นี่คือตัวแทนที่มีเครื่องมือหนึ่งตัว:

import os
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

@tool
def roll_dice(sides: int) -> int:
    """Roll a die with the given number of sides."""
    import random
    return random.randint(1, sides)

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)

agent = create_react_agent(llm, [roll_dice])
out = agent.invoke(
    {"messages": [("user", "Roll a twenty-sided die twice and tell me the total.")]}
)
print(out["messages"][-1].content)

การใช้เครื่องมือกับโมเดลแบบเปิดน้ำหนักมีความคาดเดาได้น้อยกว่าโมเดลระดับแนวหน้าแบบโฮสต์ ดังนั้นจึงควรพิจารณาว่าเป็นสิ่งที่ต้องทดสอบ เขียนคำอธิบายเครื่องมือด้วย API ที่ไม่เซ็นเซอร์คำพูดธรรมดา รักษาโครงสร้างอาร์กิวเมนต์ให้เล็ก และตั้งค่า temperature ต่ำ (0.2 ถึง 0.4) สำหรับขั้นตอนตัวแทนที่ต้องสร้างอาร์กิวเมนต์ที่ถูกต้อง หากการเรียกใช้กลับมามีรูปแบบผิดปกติ LangChain จะแสดงเป็นการเรียกใช้เครื่องมือที่ไม่ถูกต้อง และการลองใหม่พร้อมคำอธิบายที่ชัดเจนกว่ามักจะแก้ไขได้

จำกัดลูป agent ไว้ LangGraph มีขีดจำกัด recursion และคุณควรตั้งค่าเป็นจำนวนที่คุณรับได้ หาก agent สามารถเรียก tool ได้ตลอด คำสั่งที่แย่อาจเผาผลาญเครดิตขณะที่คุณไม่อยู่หน้าคีย์บอร์ด ขีดจำกัด 10 ถึง 15 ขั้นตอนเป็นค่าเริ่มต้นที่เหมาะสมสำหรับงานส่วนใหญ่ และคุณสามารถส่งค่านี้ใน config เมื่อเรียกใช้ agent

ผลลัพธ์ที่มีโครงสร้าง

โหมด JSON มีให้ผ่าน response_format ใน LangChain ให้ขอใช้ด้วย API ที่ไม่เซ็นเซอร์วิธีการโหมด JSON และตั้งชื่อคีย์ในพรอมต์ของคุณ:

from pydantic import BaseModel
from langchain_openai import ChatOpenAI
import os

class Character(BaseModel):
    name: str
    role: str
    secret: str

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
)
structured = llm.with_structured_output(Character, method="json_mode")
print(structured.invoke(
    "Return JSON with keys name, role and secret for a noir detective."
))

ขีดจำกัดอัตรา การทำซ้ำใหม่ และต้นทุน

คีย์แบบเต็มอนุญาตคำขอพร้อมกัน 8 รายการและคำขอ 300 รายการต่อนาที คีย์แบบทดลองอนุญาต 2 และ 60 เมื่อคุณเกินขีดจำกัดใด ๆ API จะตอบกลับด้วย API ที่ไม่เซ็นเซอร์ HTTP 429 และรหัสข้อผิดพลาด: rate_limited สำหรับคำขอต่อนาที และ concurrency สำหรับคำขอพร้อมกันมากเกินไป การโอเวอร์โหลดชั่วคราวยังส่งกลับ 429 พร้อมส่วนหัว Retry-After: 5

LangChain ให้คุณปรับแต่งสองค่าสำหรับเรื่องนี้ max_retries ในโมเดลจะลองเรียกใช้ซ้ำคำขอที่ล้มเหลวด้วย API ที่ไม่เซ็นเซอร์การหน่วงเวลา และ max_concurrency ในค่ากำหนดการรันจะจำกัดงานแบบแบทช์แบบขนาน:

llm = ChatOpenAI(
    model="uncensored",
    base_url="https://api.nofilteraichat.com/v1",
    api_key=os.environ["NOFILTER_API_KEY"],
    max_retries=4,
    timeout=120,
)

answers = llm.batch(
    ["Prompt one", "Prompt two", "Prompt three", "Prompt four"],
    config={"max_concurrency": 6},
)

การตั้งค่า max_concurrency เป็น 6 บนคีย์แบบเต็มจะเหลือช่องว่างสำหรับกระบวนการที่สอง จำไว้ว่าขั้นตอนของเอเยนต์แต่ละขั้นตอนเป็นคำขอแยกต่างหาก และขั้นตอนที่สตรีมมิงจะครอบครองช่องว่างนั้นจนกว่าสตรีมมิงจะสิ้นสุด

ต้นทุนการรันเอเจนต์

ราคาอยู่ที่ $0.15 ต่อ 1M โทเคนอินพุต และ $0.50 ต่อ 1M โทเคนเอาต์พุต สมมติว่าขั้นตอนเอเยนต์ส่งประวัติเครื่องมือและคำแนะนำ 3,000 โทเคน และโมเดลสร้างเอาต์พุต 500 โทเคน อินพุตมีต้นทุน 3,000 × $0.15 / 1,000,000 = $0.00045 เอาต์พุตมีต้นทุน 500 × $0.50 / 1,000,000 = $0.00025 ขั้นตอนหนึ่งขั้นตอนมีต้นทุน $0.0007 การรัน 10 ขั้นตอนมีต้นทุน $0.007 และการรัน 1,000 แบบนั้นมีต้นทุน $7.00

เอเยนต์ส่งประวัติที่เพิ่มขึ้นอีกครั้งในทุกขั้นตอน ดังนั้นโทเคนอินพุตจึงมีปริมาณมาก การตัดเอาต์พุตเครื่องมือเก่าออกเป็นการปรับแต่งที่ประหยัดที่สุดของคุณ คำขอที่ล้มเหลวหรือถูกปฏิเสธจะไม่ถูกเรียกเก็บเงิน รายละเอียดการเติมเงินและโบนัสมีอยู่ที่ หน้าราคา

ปัญหาทั่วไป

  • เกิด 404 ทุกครั้งที่เรียก Base URL ต้องลงท้ายด้วย API ที่ไม่เซ็นเซอร์ /v1 และต้องไม่รวม /chat/completions LangChain จะเพิ่มเส้นทางเอง
  • ไม่พบโมเดล โมเดล ID เดียวคือ uncensored ชื่ออย่าง gpt-4o จะใช้ไม่ได้
  • ข้อผิดพลาดของหน้าต่างบริบท หน้าต่างบริบทรองรับ 100,000 โทเคนสำหรับพรอมต์รวมกับการสร้างข้อความ สายโซ่การดึงข้อมูลที่ยาวอาจเกินขีดจำกัดนี้ ควรสรุปหรือตัดทอนก่อนส่ง
  • คำขอมีขนาดใหญ่เกินไป ขีดจำกัดขนาดบอดีคือ 8 MB ซึ่งสำคัญหากคุณใส่เอกสารทั้งฉบับลงในพรอมต์
  • Embeddings ล้มเหลว API นี้รองรับเฉพาะแชทข้อความเท่านั้น ให้ใช้โมเดล embedding กับผู้ให้บริการอื่น และใช้เอนด์พอยต์นี้สำหรับการสร้างข้อความ

รูปแบบเดียวกันนี้ใช้ได้กับเฟรมเวิร์กอื่นและส่วนติดต่อแชท; คู่มือการผสานรวม ครอบคลุมไคลเอนต์เพิ่มเติม สำหรับกรณีพิเศษอื่น ๆ ให้เริ่มที่ หน้าสนับสนุน

ถาม-ตอบ

ฉันสามารถใช้ ChatOpenAI กับ base URL แบบกำหนดเองได้หรือไม่?

ใช่ ส่ง base_url (baseURL ภายใน configuration ใน Node), คีย์ API และโมเดล uncensored ไปเลย LangChain ไม่สนใจว่าเซิร์ฟเวอร์ใดจะตอบ ตราบใดที่มันปฏิบัติตามโปรโตคอลแชทของ OpenAI

LangChain streaming ทำงานกับ API นี้ได้หรือไม่?

ได้ API สตรีมผ่าน SSE และส่งข้อมูลการใช้งานที่ท้ายสุด ดังนั้น .stream() และ astream() จึงใช้งานได้ และ stream_usage=True จะให้จำนวนโทเคน

ฉันสามารถใช้ LangChain embeddings หรือ vector stores กับมันได้หรือไม่?

ไม่ใช่สำหรับการสร้าง embeddings เพราะ API ไม่มีเอนด์พอยต์ embeddings ใช้แหล่งข้อมูล embeddings อื่นสำหรับการดึงข้อมูล และส่งข้อความที่ดึงได้ไปยังเอนด์พอยต์นี้สำหรับการสร้างข้อความ

เกิดอะไรขึ้นเมื่อฉันถึงขีดจำกัดอัตรา?

คุณจะได้รับ HTTP 429 พร้อมรหัส rate_limited หรือ concurrency ตั้งค่า max_retries บน ChatOpenAI และจำกัด max_concurrency ที่ 8 หรือน้อยกว่าบนคีย์เต็ม

คีย์ของคุณอยู่ห่างแค่แบบฟอร์มเดียว

สร้างบัญชี คัดลอกคีย์ และเปลี่ยน base URL นั่นคือการตั้งค่าทั้งหมด

รับคีย์ API