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 langgraphSau đó 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/coreimport { 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
/v1và 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.
