sách gpt4 ai đã đi

C# sử dụng các vectơ nhúng từ và cơ sở dữ liệu vectơ để tăng cường bộ nhớ dài hạn cho các mô hình ngôn ngữ lớn (LLM) để triển khai các rô-bốt trả lời câu hỏi miền riêng tư và thay thế giao diện openai

In lại Tác giả: Tôi là một chú chim nhỏ Thời gian cập nhật: 2023-05-25 14:31:27 32 4
mua khóa gpt4 Nike

------------Quá trình khôi phục nội dung bắt đầu------------ .

Trong bài viết trước, chúng tôi đã mô tả ngắn gọn về cách thêm bộ nhớ dài hạn vào các mô hình ngôn ngữ lớn thông qua các vectơ nhúng từ, có thể được sử dụng trong các tình huống miền riêng tư. Điều này liên quan đến việc sử dụng giao diện OpenAI để tạo các vectơ nhúng từ và gọi mô hình trò chuyện.

Vì những lý do phổ biến, việc gọi giao diện openai ở Trung Quốc không được thân thiện, vì vậy hôm nay chúng tôi giới thiệu hai giải pháp thay thế nguồn mở để thay thế cho vector nhúng từ và tạo văn bản.

Như thường lệ, chúng ta hãy vẽ một sơ đồ cấu trúc đơn giản:

 Theo quan điểm về mặt tôpô, nó tương đối đơn giản. Có một dịch vụ phụ trợ cho xử lý kinh doanh, hai dịch vụ mô hình AI cho các vectơ nhúng từ và tạo văn bản, và một cơ sở dữ liệu vectơ (ES vẫn được sử dụng ở đây, giống như bên dưới). Chúng ta hãy xem sơ đồ luồng:

Theo quan điểm của sơ đồ, chúng ta vẫn cần có hai giai đoạn chuẩn bị. Ở giai đoạn đầu tiên, chúng ta cần xây dựng văn bản của các câu trả lời miền riêng. Các văn bản này thường được nhập vào giao diện nhúng dưới dạng chuỗi, sau đó thu được vectơ nhúng của giao diện nhúng. Sau đó nó được ghi vào thư viện vector dưới dạng es index. Ở giai đoạn thứ hai, là giai đoạn cung cấp dịch vụ bên ngoài, chúng ta sẽ gọi giao diện nhúng để tạo ra vectơ nhúng từ cho câu hỏi của người dùng, sau đó lấy được câu trả lời gần đúng thông qua việc so sánh độ tương đồng văn bản của cơ sở dữ liệu vectơ, chẳng hạn như câu hỏi "Khi xào thịt lợn với ớt xanh, nên cho bao nhiêu muối?" Nếu văn bản trong thư viện vector chứa văn bản liên quan đến nấu ăn, một hoặc nhiều câu trả lời sẽ được trả về. Tiếp theo, chúng ta xây dựng một dấu nhắc ở phần phụ trợ, tương tự như bài viết trước. Cuối cùng, chúng ta gọi mô hình tạo văn bản để trả lời câu hỏi. Toàn bộ quá trình đã hoàn tất.

Tiếp theo, chúng ta hãy xem cách sử dụng và triển khai các mô hình này và viết mã C# có liên quan.

Quan trọng: Trước khi bắt đầu, hãy đảm bảo môi trường triển khai của bạn có card đồ họa Nvidia với bộ nhớ video 16 GB hoặc bộ nhớ 48 GB trở lên được cài đặt. Phương pháp trước đây được sử dụng để suy luận mô hình dựa trên card đồ họa, với kết quả tốt hơn và tốc độ hợp lý. Phương pháp sau dựa trên suy luận của CPU, chậm hơn và chỉ có thể được sử dụng để thử nghiệm triển khai. Nếu bạn triển khai dựa trên card đồ họa, bạn cần cài đặt CUDA11.8 riêng biệt và cài đặt bộ nvidia-docker2 để hỗ trợ GPU trên docker. Quá trình cài đặt không được mô tả ở đây.

Đầu tiên, chúng ta cần tải xuống mô hình nhúng từ. Ở đây chúng tôi khuyên bạn nên sử dụng mô hình text2vec-large-chinese, mô hình này đã được tinh chỉnh cho văn bản tiếng Trung. Hiệu quả tốt hơn.

Địa chỉ tải xuống như sau: https://huggingface.co/GanymedeNil/text2vec-large-chinese/tree/main .

Chúng ta cần tải xuống ba tệp pytorch_model.bin, config.json và vocab.txt để xây dựng dịch vụ nhúng từ của mình.

Sau đó, chúng ta tạo một web.py mới trong thư mục đã tải xuống. Nhập thông tin sau:

                          từ fastapi nhập FastAPI từ pydantic nhập BaseModel từ typing nhập List từ transformers nhập AutoTokenizer, AutoModel nhập torch app = FastAPI() # Tải mô hình và tokenizer model = AutoModel.from_pretrained("/app").half().cuda() tokenizer = AutoTokenizer.from_pretrained("/app") # Yêu cầu lớp thân câu Sentence(BaseModel): câu: str @app.post("/embed") async def nhúng(câu: Câu): # Mã hóa câu và lấy tenxơ đầu vào inputs = tokenizer(câu.câu, return_tensors='pt', padding=True, truncation=True, max_length=512) # Di chuyển đầu vào tới GPU để lấy khóa trong inputs.keys(): inputs[key] = inputs[key].to('cuda') # Chạy mô hình với torch.no_grad(): outputs = model(**inputs) # Lấy các nhúng embeddings = outputs.last_hidden_state[0].cpu().numpy() # Trả về các nhúng dưới dạng phản hồi JSON return embeddings.tolist()

                        

    Nội dung trên dựa trên phiên bản GPU của API. Nếu bạn không có hỗ trợ GPU, bạn có thể sử dụng mã sau:

                          từ fastapi nhập FastAPI từ pydantic nhập BaseModel từ typing nhập List từ transformers nhập AutoTokenizer, AutoModel nhập torch app = FastAPI() # Tải mô hình và tokenizer model = AutoModel.from_pretrained("/app").half() tokenizer = AutoTokenizer.from_pretrained("/app") # Yêu cầu lớp thân câu Sentence(BaseModel): câu: str @app.post("/embed") async def nhúng(câu: Câu): # Mã hóa câu và lấy tenxơ đầu vào inputs = tokenizer(câu.câu, return_tensors='pt', padding=True, truncation=True, max_length=512) # Không cần di chuyển đầu vào sang GPU vì chúng ta đang sử dụng CPU # Chạy mô hình với torch.no_grad(): outputs = model(**inputs) # Lấy các nhúng embeddings = outputs.last_hidden_state[0].cpu().numpy() # Trả về các nhúng dưới dạng phản hồi JSON trả về embeddings.tolist()
                        

Ở đây chúng tôi sử dụng một khung web pyhont đơn giản là fastapi để cung cấp các dịch vụ bên ngoài. Tiếp theo, chúng tôi kết hợp mô hình đã tải xuống trước đó và mã py, và tạo tệp requirements.txt để tải xuống các phụ thuộc khi xây dựng hình ảnh. requirements.txt chứa

                          ngọn đuốc máy biến áp fastapi uvicorn

                        

Hai cái đầu tiên là các thư viện/khung yêu cầu của mô hình, và hai cái cuối cùng là các khung thư viện yêu cầu của dịch vụ web. Tiếp theo, chúng ta viết Dockerfile để xây dựng hình ảnh:

                          TỪ python:3.8-slim-buster # Đặt thư mục làm việc thành /app WORKDIR /app # Sao chép nội dung thư mục hiện tại vào vùng chứa tại /app ADD. /app # Cài đặt bất kỳ gói nào cần thiết được chỉ định trong requirements.txt CHẠY pip install --trusted-host pypi.python.org -r requirements.txt # Chạy app.py khi vùng chứa khởi chạy ENV MODULE_NAME=web 
                          
ENV VARIABLE_NAME=ứng dụng
Máy chủ ENV=0.0.0.0
CỔNG ENV=80

# Chạy ứng dụng:
CMD uvicorn ${MODULE_NAME}:${VARIABLE_NAME} --host ${HOST} --port ${PORT}

Sau đó chúng ta có thể xây dựng hình ảnh dựa trên nội dung trên. Chỉ cần thực hiện lệnh docker build . -t myembed:latest và đợi biên dịch.

Sau khi hình ảnh được biên dịch, chúng ta có thể chạy nó cục bộ: docker run -dit --gpus all -p 8080:80 myembed:latest. Lưu ý rằng nếu bạn đang ở trong môi trường CPU, bạn không cần phải thêm "--gpus all". Sau đó, chúng ta có thể mô phỏng giao diện truy cập thông qua Postman để xem liệu có thể tạo ra một vectơ hay không. Nếu mọi thứ diễn ra tốt đẹp, nó sẽ tạo ra một mảng đa chiều lồng nhau như được hiển thị bên dưới: .

 Tiếp theo, chúng ta cần sử dụng cùng một phương pháp để tạo giao diện của mô hình ngôn ngữ lớn. Ở đây chúng ta sử dụng mô hình ngôn ngữ lớn nguồn mở tương đối trưởng thành Chat-glm-6b ở Trung Quốc. Đầu tiên chúng ta tạo một thư mục mới và sau đó sử dụng git để kéo mã liên quan đến dịch vụ web của nó

                          git clone https://github.com/THUDM/ChatGLM-6B.git

                        

Tiếp theo chúng ta cần tải xuống tệp trọng số mô hình của nó, địa chỉ: https://huggingface.co/THUDM/chatglm-6b/tree/main. Tải xuống 8 tệp trọng số từ pytorch_model-00001-of-00008.bin vào pytorch_model-00008-of-00008.bin và đặt chúng vào thư mục gốc git.

Sau đó chúng ta sửa đổi mã của api.py:

                          từ fastapi nhập FastAPI, Yêu cầu từ fastapi.responses nhập StreamingResponse từ transformers nhập AutoTokenizer, AutoModel nhập uvicorn, json, datetime nhập torch nhập asyncio THIẾT BỊ = "cuda" DEVICE_ID = "0" CUDA_DEVICE = f"{THIẾT BỊ}:{THIẾT BỊ_ID}" nếu THIẾT BỊ_ID thì THIẾT BỊ def torch_gc(): nếu torch.cuda.is_available(): với torch.cuda.device(CUDA_DEVICE): torch.cuda.empty_cache() torch.cuda.ipc_collect() ứng dụng = FastAPI() @app.post("/chat", response_class=StreamingResponse) async def create_item(request: Request): mô hình toàn cục, tokenizer json_post_raw = await request.json() json_post = json.dumps(json_post_raw) json_post_list = json.loads(json_post) lời nhắc = _part = response[len(last_response):] last_response = response yield json.dumps(new_part,ensure_ascii=False) return StreamingResponse(stream_chat(), media_type="text/plain") if len(last_response): return '' async def stream_chat(): last_response không cục bộ, lịch sử cho phản hồi, lịch sử trong mô hình.stream_chat(tokenizer, prompt, history=history, max_length=max_length if max_length else 2048, top_p=top_p if top_p else 0.7, temperature=temperature if temperature else 0.95): new_part = response[len(last_response):] last_response = response yield json.dumps(new_part,ensure_ascii=False) return StreamingResponse(stream_chat(), media_type="text/plain") if __name__ == '__main__': tokenizer = AutoTokenizer.from_pretrained("/ứng dụng", trust_remote_code=True) model = AutoModel.from_pretrained("/ứng dụng", trust_remote_code=True).half().cuda() model.eval() uvicorn.run(ứng dụng, máy chủ='0.0.0.0', cổng=80, công nhân=1)
                        

Tương tự, nếu bạn đang sử dụng môi trường phiên bản CPU, bạn cần (lưu ý ở đây, nếu bạn có card đồ họa, nhưng bộ nhớ video nhỏ hơn 16G. Khi đó, bạn có thể cân nhắc lượng tử hóa 8 bit hoặc 4 bit, tham khảo https://github.com/THUDM/ChatGLM-6B's readme.md để biết chi tiết).

                          mô hình = AutoModel.from_pretrained("/ứng dụng", trust_remote_code=True).half().cuda()

                        

 Đã sửa đổi thành.

                          mô hình = AutoModel.from_pretrained("/ứng dụng", trust_remote_code=True)
                        

Phần còn lại của quy trình tương tự như triển khai mô hình vector trước đó. Vì dự án đã bao gồm nó, hãy tạo requirements.txt tương ứng. Chúng ta chỉ cần tạo Dockerfile tương tự như vector nhúng word để biên dịch.

                          TỪ python:3.8-slim-buster WORKDIR /app THÊM ./app CHẠY pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple CMD ["python", "api.py"]

                        

Sau khi hoàn tất, bạn có thể sử dụng docker run -dit --gpus all -p 8081:80 myllm:latest để bắt đầu kiểm tra. Tương tự, sử dụng postman để mô phỏng giao diện truy cập. Nếu mọi thứ diễn ra tốt đẹp, chúng ta sẽ có thể thấy nội dung sau. Đừng lo lắng về phần bị bóp méo vì đây là vấn đề mà biểu tượng cảm xúc không được phân tích cú pháp chính xác:

  .

Tiếp theo, chúng ta cần xây dựng mã C# backend để kết nối các dịch vụ cơ bản này. Ở đây tôi sử dụng một từ điển tĩnh cục bộ để mô phỏng việc lưu trữ các vectơ nhúng từ và độ tương tự cosin để truy vấn các văn bản tương tự. Tôi sẽ không đi sâu vào chi tiết về việc sử dụng es làm thư viện vectơ, vì hiệu ứng của cả hai về cơ bản là giống nhau. Sinh viên quan tâm có thể tìm kiếm thư viện NEST và es dựa trên độ tương đồng cosin để tìm kiếm nội dung liên quan.

Mã cốt lõi như sau. Ở đây tôi cung cấp hai giao diện. Giao diện đầu tiên được sử dụng để lấy văn bản đầu vào của front-end để nhúng và lưu trữ từ, và giao diện thứ hai được sử dụng để trả lời các câu hỏi.

                          ///Được sử dụng để mô phỏng thư viện vector private Dictionary> MemoryList = new Dictionary>(); ///Được sử dụng để tính độ tương tự double Compute(List vector1, List vector2) => vector1.Zip(vector2, (a, b) => a * b).Sum() / (Math.Sqrt(vector1.Sum(a => a * a)) * Math.Sqrt(vector2.Sum(b => b * b))); ... [HttpPost("/api/save")] public async Task SaveMemory(string str) { if (!string.IsNullOrEmpty(str)) { foreach (var x in memory.Split("\n").ToList()) { if (!MemoryList.ContainsKey(x)) { MemoryList.Add(x, await GetEmbeding(x)); StateHasChanged(); } } } return MemoryList.Count; } ... [HttpPost("/api/chat")] public async IAsyncEnumerable SendData(string content) { if (!string.IsNullOrEmpty(content)) { var userquestionEmbeding = await GetEmbeding(content); var prompt = ""; if (MemoryList.Any()) { //Ở đây chúng ta lấy phần tử đầu tiên từ thư viện vector. Bạn có thể thiết lập phần tử này theo tình huống thực tế, chẳng hạn như ngưỡng tương đồng hoặc trả về nhiều mục, v.v. prompt = MemoryList.OrderByDescending(x => Compute(userquestionEmbeding, x.Value)).FirstOrDefault().Key; prompt = $"Bạn là trợ lý hỏi đáp. Bạn cần trả lời các câu hỏi dựa trên các sự kiện sau. Các sự kiện như sau: {prompt}. Câu hỏi của người dùng như sau: {Nội dung}. Đừng bịa ra sự thật, hãy trả lời: "; } else prompt = Content; await foreach (var item in ChatStream(prompt)) { yield return item; } } }

                        

Đồng thời, chúng ta cần cung cấp 2 hàm để sử dụng httpclient truy cập API của mô hình AI:

                          async IAsyncEnumerable ChatStream(string x) { HttpClient hc = new HttpClient(); var reqcontent = new StringContent(System.Text.Json.JsonSerializer.Serialize(new { prompt = x })); reqcontent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); var response = await hc.PostAsync("http://192.168.1.100:8081/chat", reqcontent); if (response.IsSuccessStatusCode) { var responseStream = await response.Content.ReadAsStreamAsync(); using (var reader = new StreamReader(responseStream, Encoding.UTF8)) { string line; while ((line = await reader.ReadLineAsync()) != null) { yield return line; } } } } async Task<>> GetEmbeding(string x) { HttpClient hc = new HttpClient(); var reqcontent = new StringContent(System.Text.Json.JsonSerializer.Serialize(new { câu = x })); reqcontent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); var result = await hc.PostAsync("http://192.168.1.100:8080/embed", reqcontent); var content = await result.Content.ReadAsStringAsync(); var embed = System.Text.Json.JsonSerializer.Deserialize<><>>>(content); var embedresult = new List(); for (var i = 0; i < 1024; i++) { double sum = 0; foreach (Danh sách con trong nhúng) { tổng += (danh sách con[i]); } nhúng kết quả.Thêm(tổng / 1024); } trả về kết quả nhúng; }

                        

  Tiếp theo chúng ta có thể kiểm tra hiệu ứng. Khi mô hình được hỏi một câu hỏi mà không đưa vào bộ nhớ, nó sẽ tự đưa ra câu trả lời:

 Sau đó, chúng tôi thêm nhiều ký ức vào thư viện vector và sau đó đặt câu hỏi. Về cơ bản, mô hình có thể trả lời nội dung một cách chính xác.

  .

Trên đây là toàn bộ nội dung của blog này. So với chương trước, chúng tôi đã sử dụng giao diện dựa trên openai. Triển khai cục bộ sẽ phù hợp hơn với hầu hết mọi người. Trên đây.

Cuối cùng, bài viết này về C# sử dụng các vector nhúng từ và cơ sở dữ liệu vector để kích hoạt bộ nhớ dài hạn cho các mô hình ngôn ngữ lớn (LLM) nhằm triển khai các robot trả lời câu hỏi miền riêng và các thay thế giao diện openai đã kết thúc. Nếu bạn muốn biết thêm về C# sử dụng các vector nhúng từ và cơ sở dữ liệu vector để kích hoạt bộ nhớ dài hạn cho các mô hình ngôn ngữ lớn (LLM) nhằm triển khai các robot trả lời câu hỏi miền riêng và các thay thế giao diện openai, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

32 4 0
Tôi là một chú chim nhỏ
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com