Trong bài đăng trên blog này, tôi sẽ chia sẻ cách sử dụng LangChain, một khung linh hoạt để xây dựng các ứng dụng dựa trên AI, để trích xuất và tạo dữ liệu JSON có cấu trúc bằng GPT và Node.js. Tôi sẽ cung cấp các đoạn mã và hướng dẫn ngắn gọn để giúp bạn thiết lập và chạy dự án.
LangChain là một khuôn khổ sáng tạo và linh hoạt được thiết kế để hợp lý hóa việc phát triển các ứng dụng dựa trên AI.
Với kiến trúc mô-đun, nó cung cấp một bộ thành phần toàn diện để tạo các mẫu lời nhắc, kết nối với các nguồn dữ liệu đa dạng và tương tác liền mạch với nhiều công cụ khác nhau.
Bằng cách đơn giản hóa kỹ thuật nhanh chóng, tích hợp nguồn dữ liệu và tương tác công cụ, LangChain cho phép các nhà phát triển tập trung vào logic ứng dụng cốt lõi, đẩy nhanh quá trình phát triển.
Có sẵn trong cả API Python và JavaScript, LangChain có khả năng thích ứng cao, trao quyền cho các nhà phát triển khai thác sức mạnh của xử lý ngôn ngữ tự nhiên và AI trên nhiều nền tảng và trường hợp sử dụng.
LangChain chứa các công cụ giúp tạo đầu ra có cấu trúc (như ở định dạng JSON) từ LLM. Hãy sử dụng chúng để lợi thế của chúng tôi.
Tôi giả định rằng bạn có một trong những phiên bản mới nhất của NodeJS. Tôi đã sử dụng nút 18. Hãy truy cập trang web LangChain nếu bạn cần thêm chi tiết.
Đầu tiên, tạo một dự án nút mới, nghĩa là:
Tạo một thư mục mới cho dự án của bạn và điều hướng đến nó trong thiết bị đầu cuối của bạn.
Chạy npm init để khởi tạo dự án Node.js mới.
Tạo một tệp index.js
.
Sau đó, hãy cài đặt LangChain và định cấu hình các khóa API. Các phụ thuộc khác được bao gồm.
npm i langchain # configure credentials (easiest) export OPENAI_API_KEY=XXX export SERPAPI_API_KEY=XXX
Đây chỉ là để sử dụng trình diễn. Tôi không muốn xuất các biến; Thay vào đó, tôi đang sử dụng thư viện dotenv
npm phổ biến.
Hãy nhập các phụ thuộc cần thiết vào đầu tệp JS của chúng tôi.
import { z } from "zod"; import { OpenAI } from "langchain/llms/openai"; import { PromptTemplate } from "langchain/prompts"; import { StructuredOutputParser, OutputFixingParser, } from "langchain/output_parsers";
Hãy bắt đầu với việc tạo một số dữ liệu giả để xem khả năng phân tích cú pháp.
Đầu tiên, chúng ta cần nói với thư viện những gì chúng ta muốn lấy. LangChain hỗ trợ xác định lược đồ dự kiến bằng thư viện phổ biến có tên là Zod:
const parser = StructuredOutputParser.fromZodSchema( z.object({ name: z.string().describe("Human name"), surname: z.string().describe("Human surname"), age: z.number().describe("Human age"), appearance: z.string().describe("Human appearance description"), shortBio: z.string().describe("Short bio secription"), university: z.string().optional().describe("University name if attended"), gender: z.string().describe("Gender of the human"), interests: z .array(z.string()) .describe("json array of strings human interests"), }) );
Để sử dụng mẫu này, chúng ta cần tạo cấu trúc LangChain có tên là PromptTemplate. Nó sẽ chứa các hướng dẫn định dạng từ trình phân tích cú pháp:
const formatInstructions = parser.getFormatInstructions(); const prompt = new PromptTemplate({ template: `Generate details of a hypothetical person.\n{format_instructions} Person description: {description}`, inputVariables: ["description"], partialVariables: { format_instructions: formatInstructions }, });
Để thực thi đầu ra có cấu trúc, hãy gọi mô hình OpenAI với đầu vào:
const model = new OpenAI({ temperature: 0.5, model: "gpt-3.5-turbo" }); const input = await prompt.format({ description: "A man, living in Poland", }); const response = await model.call(input);
Đây là những gì sẽ được gửi đến mô hình AI. Điều này rất có thể sẽ thay đổi trong các phiên bản LangChain trong tương lai.
Generate details of a hypothetical person. You must format your output as a JSON value that adheres to a given "JSON Schema" instance. "JSON Schema" is a declarative language that allows you to annotate and validate JSON documents. For example, the example "JSON Schema" instance {{"properties": {{"foo": {{"description": "a list of test words", "type": "array", "items": {{"type": "string"}}}}}}, "required": ["foo"]}}}} would match an object with one required property, "foo". The "type" property specifies "foo" must be an "array", and the "description" property semantically describes it as "a list of test words". The items within "foo" must be strings. Thus, the object {{"foo": ["bar", "baz"]}} is a well-formatted instance of this example "JSON Schema". The object {{"properties": {{"foo": ["bar", "baz"]}}}} is not well-formatted. Your output will be parsed and type-checked according to the provided schema instance, so make sure all fields in your output match exactly! Here is the JSON Schema instance your output must adhere to: '''json {"type":"object","properties":{"name":{"type":"string","description":"Human name"},"surname":{"type":"string","description":"Human surname"},"age":{"type":"number","description":"Human age"},"appearance":{"type":"string","description":"Human appearance description"},"shortBio":{"type":"string","description":"Short bio secription"},"university":{"type":"string","description":"University name if attended"},"gender":{"type":"string","description":"Gender of the human"},"interests":{"type":"array","items":{"type":"string"},"description":"json array of strings human interests"}},"required":["name","surname","age","appearance","shortBio","gender","interests"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"} ''' Person description: A man, living in Poland.
Đầu ra từ mô hình sẽ trông như thế này:
{ "name": "Adam", "surname": "Kowalski", "age": 21, "appearance": "Adam is a tall and slim man with short dark hair and blue eyes.", "shortBio": "Adam is a 21 year old man from Poland. He is currently studying computer science at the University of Warsaw.", "university": "University of Warsaw", "gender": "Male", "interests": ["Computer Science", "Cooking", "Photography"] }
Như bạn có thể thấy, chúng tôi đã có đúng những gì chúng tôi cần. Chúng tôi có thể tạo toàn bộ danh tính với các mô tả phức tạp phù hợp với các phần khác của tính cách. Nếu chúng tôi cần làm phong phú tập dữ liệu giả của mình, thì chúng tôi có thể yêu cầu một mô hình AI khác tạo ảnh dựa trên ngoại hình.
Bạn có thể tự hỏi liệu sử dụng LLM trong ứng dụng sản xuất có an toàn theo bất kỳ cách nào không. May mắn thay, LangChain chỉ tập trung vào những vấn đề như thế này. Trong trường hợp đầu ra cần sửa, hãy sử dụng OutputFixingParser. Nó sẽ thử và sửa lỗi trong trường hợp LLM của bạn xuất ra thứ gì đó không phù hợp với yêu cầu của bạn.
try { console.log(await parser.parse(response)); } catch (e) { console.error("Failed to parse bad output: ", e); const fixParser = OutputFixingParser.fromLLM( new OpenAI({ temperature: 0, model: "gpt-3.5-turbo" }), parser ); const output = await fixParser.parse(response); console.log("Fixed output: ", output); }
Để tải và trích xuất dữ liệu từ các tệp bằng LangChain, bạn có thể làm theo các bước sau. Trong ví dụ này, chúng tôi sẽ tải tệp PDF. Thuận tiện, LangChain có các tiện ích chỉ dành cho mục đích này. Chúng tôi cần thêm một phụ thuộc.
npm install pdf-parse
Chúng tôi sẽ tải một đoạn tiểu sử ngắn về Elon Musk và trích xuất thông tin mà chúng tôi đã tạo trước đó. Tải file PDF tại đây: google drive .
Đầu tiên, hãy tạo một tệp mới, ví dụ, structured-pdf.js
. Hãy bắt đầu với việc tải PDF.
import { PDFLoader } from "langchain/document_loaders/fs/pdf"; const loader = new PDFLoader("./elon.pdf"); const docs = await loader.load(); console.log(docs);
Chúng tôi cần sửa đổi mẫu lời nhắc để biểu thị trích xuất chứ không phải tạo. Tôi cũng đã phải sửa đổi lời nhắc để khắc phục sự cố hiển thị JSON vì kết quả đôi khi không nhất quán.
const prompt = new PromptTemplate({ template: "Extract information from the person description.\n{format_instructions}\nThe response should be presented in a markdown JSON codeblock.\nPerson description: {inputText}", inputVariables: ["inputText"], partialVariables: { format_instructions: formatInstructions }, });
Cuối cùng, chúng tôi cần mở rộng độ dài đầu ra mà chúng tôi cho phép (dữ liệu nhiều hơn một chút so với trường hợp được tạo), vì mặc định là 256 mã thông báo. Chúng tôi cũng cần gọi mô hình bằng cách sử dụng tài liệu đã tải của mình, không phải mô tả người được xác định trước.
const model = new OpenAI({ temperature: 0.5, model: "gpt-3.5-turbo", maxTokens: 2000 }); const input = await prompt.format({ inputText: docs[0].pageContent, });
Nhờ những sửa đổi này, chúng tôi nhận được đầu ra sau:
{ name: 'Elon', surname: 'Musk', age: 51, appearance: 'normal build, short-cropped hair, and a trimmed beard', // truncated by me shortBio: "Elon Musk, a 51-year-old male entrepreneur, inventor, and CEO, is best known for his...', gender: 'male', interests: [ 'space exploration', 'electric vehicles', 'artificial intelligence', 'sustainable energy', 'tunnel construction', 'neural interfaces', 'Mars colonization', 'hyperloop transportation' ] }
Bằng cách làm theo các bước này, chúng tôi đã trích xuất dữ liệu JSON có cấu trúc từ tệp PDF! Cách tiếp cận này rất linh hoạt và có thể được điều chỉnh cho phù hợp với trường hợp sử dụng cụ thể của bạn.
Tóm lại, bằng cách tận dụng LangChain, GPT và Node.js, bạn có thể tạo các ứng dụng mạnh mẽ để trích xuất và tạo dữ liệu JSON có cấu trúc từ nhiều nguồn khác nhau.
Các ứng dụng tiềm năng là rất lớn và với một chút sáng tạo, bạn có thể sử dụng công nghệ này để xây dựng các ứng dụng và giải pháp sáng tạo.
Bạn có thể tìm mã cho hướng dẫn này tại đây: https://gist.github.com/horosin/5351ae4dc3eebbf181f9db212f5d3ebc
Theo dõi hồ sơ của tôi bằng cách điền vào địa chỉ email của bạn ở bên trái và cập nhật các bài viết của tôi!
Đừng quên theo dõi tôi trên Twitter @ horosin và đăng ký nhận bản tin trên blog của tôi để biết thêm mẹo và thông tin chi tiết!
Nếu bạn không có Twitter, bạn cũng có thể theo dõi tôi trên LinkedIn .