VI ▾
Lấy khóa API

Chat OpenAI trong LangChain với API không kiểm duyệt

Lớp ChatOpenAI của LangChain hoạt động với bất kỳ endpoint nào tương thích OpenAI, vì vậy bạn chỉ cần thay đổi base URL, khóa và tên mô hình. Trang này hiển thị thiết lập trong Python và Node, sau đó xây dựng dần lên truyền phát, công cụ và một tác nhân nhỏ.

Cập nhật

Chuỗi đẳng hướng các vòng nối với nhau truyền bong bóng chat vào khối máy chủ, đại diện cho kết nối LangChain với API

Điểm chính

  1. ChatOpenAI cần ba cài đặt: base_url, api_key và model được đặt thành uncensored.
  2. Truyền phát, gọi công cụ và chế độ JSON đều đi qua các giao diện LangChain tiêu chuẩn.
  3. Giới hạn độ đồng thời ở mức 8 và xử lý HTTP 429 bằng cách thử lại để duy trì trong giới hạn.
  4. Một lần chạy agent gồm 10 bước tốn kém hơn một xu ở mức $0,15 và $0,50 cho mỗi 1 triệu token.

Câu trả lời ngắn gọn: ba cài đặt trên ChatOpenAI

Nếu bạn đã tìm kiếm chat open ai langchain, bạn có lẽ có một dự án LangChain đã sử dụng ChatOpenAI và bạn muốn nó giao tiếp với một backend khác. Đó là một thay đổi cấu hình, không phải viết lại. API trên trang web này sử dụng giao thức hoàn thành chat OpenAI, vì vậy LangChain coi nó như bất kỳ máy chủ kiểu OpenAI nào khác.

Bạn cần base URL, khóa API của bạn và ID mô hình uncensored. Trước tiên hãy cài đặt các gói:

pip install -U langchain-openai langgraph

Sau đó tạo đối tượng mô hình:

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)

Đó là toàn bộ tích hợp. Mọi tính năng LangChain được xây dựng trên ChatOpenAI bây giờ chạy trên mô hình không kiểm duyệt: chuỗi, bộ truy xuất gọi mô hình chat, trình phân tích đầu ra và tác nhân. Nếu bạn chưa có khóa, trang khóa API giải thích cách đăng ký và tín dụng dùng thử một lần nhấp.

Giữ khóa ra khỏi mã nguồn của bạn

Đặt khóa trong biến môi trường và đọc nó khi khởi động. Trên Linux hoặc macOS:

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

Tạo một mô-đun khách hàng dùng chung cho dự án, ví dụ llm.py tạo mô hình một lần và xuất nó. Mọi chuỗi sau đó nhập cùng một đối tượng, và việc thay đổi khóa, thời gian chờ hoặc nhiệt độ sau này xảy ra ở một nơi duy nhất. Điều này cũng giúp dễ dàng giữ một phiên bản lạnh hơn thứ hai cho các bước công cụ và một phiên bản ấm hơn để viết sáng tạo, cả hai đều trỏ đến cùng một endpoint với các cài đặt khác nhau.

Một lỗi phổ biến khiến nhiều người mắc phải: ChatOpenAI cũng đọc OPENAI_API_KEY và OPENAI_API_BASE từ môi trường. Nếu các biến đó được đặt cho một dự án khác, một đối tượng được cấu hình chưa đầy đủ có thể gửi yêu cầu của bạn đến máy chủ sai. Việc đưa rõ base_url và api_key, như ở trên, giúp loại bỏ sự mơ hồ.

Bạn có thể xác minh kết nối mà không cần LangChain. Endpoint models nên trả về một mục duy nhất:

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

Nếu điều đó hoạt động nhưng LangChain thất bại, vấn đề nằm trong môi trường Python của bạn, không phải khóa. Nếu cả hai đều thất bại với 401, hãy kiểm tra xem có khoảng trắng hoặc ký tự xuống dòng thừa trong khóa hay không. Trang bắt đầu nhanh liệt kê định dạng yêu cầu chính xác để so sánh.

Truyền phát và sử dụng token

Giao diện người dùng trò chuyện hoạt động tốt hơn khi các token xuất hiện ngay khi được tạo. LangChain cung cấp điều này qua .stream(), và máy chủ gửi các phần SSE chuẩn khi stream: true được đặt bên trong.

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)

Với stream_usage=True chunk cuối cùng mang số lượng token đầu vào và đầu ra, mà API gửi ở cuối luồng. Hãy giữ những con số đó. Đó là cách rẻ nhất để xem một tác nhân thực sự tốn kém bao nhiêu, và chúng tôi sử dụng chúng trong phần chi phí bên dưới.

Một điều cần nhớ: một yêu cầu truyền phát giữ slot độ đồng thời của nó cho đến khi luồng kết thúc. Nếu bạn bỏ một luồng mà không đóng nó, slot đó vẫn bận lâu hơn bạn mong đợi.

Node và TypeScript

Gói JavaScript sử dụng một tên tùy chọn hơi khác. Base URL nằm bên trong 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);

Các loại TypeScript cho phản hồi là các lớp thông báo LangChain thông thường, vì vậy mã hiện có đọc res.content hoặc res.usage_metadata vẫn hoạt động. Khi bạn chạy điều này bên trong một tuyến đường máy chủ, hãy xây dựng mô hình một lần ở phạm vi mô-đun thay vì cho mỗi yêu cầu. Điều đó tránh tạo một máy khách HTTP mới cho mọi cuộc gọi và giữ cho độ đồng thời của bạn dễ suy luận.

Mọi thứ khác, bao gồm .stream(), .bindTools() và .withStructuredOutput(), hoạt động giống nhau như trong Python. Nhiệt độ, top_p, trình tự dừng, hạt giống và các tùy chọn hình phạt được chuyển qua mô hình, vì vậy bạn có thể đặt chúng trên hàm tạo như bạn sẽ làm cho bất kỳ backend kiểu OpenAI nào khác.

Gọi công cụ và một tác nhân nhỏ

API hỗ trợ gọi công cụ: các trường tools và tool_choice, tool_calls được truyền phát, và kết quả công cụ được trả lại dưới dạng thông báo role: "tool". Tác nhân được xây dựng sẵn của LangGraph sử dụng chính xác vòng lặp đó. Đây là một tác nhân với một công cụ:

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)

Việc sử dụng công cụ với các mô hình trọng số mở ít dự đoán hơn so với mô hình hàng đầu được lưu trữ, vì vậy hãy coi đó là thứ cần kiểm tra. Viết mô tả công cụ bằng từ ngữ đơn giản, giữ các lược đồ đối số nhỏ và đặt temperature thấp (0,2 đến 0,4) cho các bước tác nhân phải tạo ra các đối số hợp lệ. Nếu một lệnh gọi trả về bị lỗi cú pháp, LangChain hiển thị nó dưới dạng gọi công cụ không hợp lệ và việc thử lại với mô tả rõ ràng hơn thường sẽ khắc phục nó.

Giữ vòng lặp tác nhân có giới hạn. LangGraph có giới hạn đệ quy, và bạn nên đặt nó thành một số bạn có thể chi trả. Nếu một tác nhân có thể gọi công cụ mãi mãi, một prompt xấu có thể đốt cháy tín dụng trong khi bạn rời khỏi bàn phím. Giới hạn từ 10 đến 15 bước là mặc định hợp lý cho hầu hết các nhiệm vụ, và bạn có thể truyền nó trong cấu hình khi bạn gọi tác nhân.

Đầu ra có cấu trúc

Chế độ JSON có sẵn thông qua response_format. Trong LangChain, hãy yêu cầu nó bằng phương thức chế độ JSON và đặt tên các khóa trong prompt của bạn:

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."
))

Giới hạn tốc độ, thử lại và chi phí

Một khóa đầy đủ cho phép 8 yêu cầu đồng thời và 300 yêu cầu mỗi phút. Một khóa dùng thử cho phép 2 và 60. Khi bạn vượt quá bất kỳ giới hạn nào, API trả về HTTP 429 và một mã lỗi: rate_limited cho yêu cầu mỗi phút, concurrency cho quá nhiều cùng một lúc. Quá tải tạm thời cũng trả về 429, với tiêu đề Retry-After: 5.

LangChain cung cấp cho bạn hai nút điều chỉnh. max_retries trên mô hình thử lại các cuộc gọi thất bại với độ trễ, và max_concurrency trong cấu hình chạy giới hạn công việc lô song song:

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},
)

Đặt max_concurrency thành 6 trên một khóa đầy đủ để lại khoảng trống cho một quy trình thứ hai. Hãy nhớ rằng mỗi bước tác nhân là một yêu cầu riêng biệt, và một bước truyền phát chiếm slot của nó cho đến khi luồng kết thúc.

Chi phí một lần chạy tác nhân

Giá là $0,15 cho mỗi 1M token đầu vào và $0,50 cho mỗi 1M token đầu ra. Giả sử một bước tác nhân gửi 3.000 token lịch sử, công cụ và hướng dẫn, và mô hình viết 500 token. Chi phí đầu vào là 3.000 × $0,15 / 1.000.000 = $0,00045. Chi phí đầu ra là 500 × $0,50 / 1.000.000 = $0,00025. Một bước là $0,0007. Một lần chạy mười bước là $0,007 và 1.000 lần chạy như vậy tốn $7,00.

Các tác nhân gửi lại lịch sử đang phát triển của chúng ở mỗi bước, vì vậy token đầu vào chiếm ưu thế. Cắt giảm đầu ra công cụ cũ là tối ưu hóa rẻ nhất mà bạn có. Các yêu cầu thất bại hoặc bị từ chối không bị tính phí. Chi tiết về việc nạp tiền và tiền thưởng có trên trang giá cả.

Các vấn đề thường gặp

  • 404 trên mọi cuộc gọi. Base URL phải kết thúc bằng /v1 và không được bao gồm /chat/completions. LangChain tự thêm đường dẫn.
  • Không tìm thấy mô hình. ID mô hình duy nhất là uncensored. Các tên như gpt-4o sẽ không hoạt động.
  • Lỗi ngữ cảnh. Cửa sổ là 100.000 token cho prompt cộng với phần hoàn thành. Các chuỗi truy xuất dài có thể vượt quá nó. Tóm tắt hoặc cắt giảm trước khi gửi.
  • Yêu cầu quá lớn. Giới hạn thân là 8 MB, điều này quan trọng nếu bạn nhồi toàn bộ tài liệu vào một prompt.
  • Embeddings thất bại. API này chỉ dành cho chat văn bản. Giữ mô hình embedding của bạn trên nhà cung cấp khác và sử dụng endpoint này để tạo.

Mẫu tương tự hoạt động cho các khung khác và giao diện người dùng chat; hướng dẫn tích hợp bao gồm nhiều khách hàng hơn. Đối với bất kỳ điều gì bất thường, trang hỗ trợ là nơi để bắt đầu.

Hỏi đáp

Tôi có thể dùng ChatOpenAI với base URL tùy chỉnh không?

Có. Truyền base_url (baseURL bên trong cấu hình trên Node), khóa của bạn và mô hình uncensored. LangChain không quan tâm máy chủ nào trả lời miễn là nó tuân thủ giao thức chat OpenAI.

Truyền phát LangChain có hoạt động với API này không?

Có. API truyền phát qua SSE và gửi thông tin sử dụng ở cuối, vì vậy .stream() và astream() hoạt động, và stream_usage=True cung cấp cho bạn số lượng token.

Tôi có thể dùng embeddings hoặc kho lưu trữ vector LangChain với nó không?

Không dành cho embeddings, vì API không có endpoint embeddings. Hãy dùng nguồn embedding khác cho truy xuất và gửi văn bản đã truy xuất đến endpoint này để tạo.

Điều gì xảy ra khi bạn vượt quá giới hạn tốc độ?

Bạn nhận được HTTP 429 với mã rate_limited hoặc concurrency. Đặt max_retries trên ChatOpenAI và giới hạn max_concurrency ở mức 8 hoặc thấp hơn trên một khóa đầy đủ.

Khóa của bạn chỉ cách một biểu mẫu

Tạo tài khoản, sao chép khóa, thay đổi base URL. Đó là toàn bộ thiết lập.

Lấy khóa API