当前位置:   article > 正文

使用Angular、ASP.NET API和Azure构建OpenAI聊天应用程序_openai angular

openai angular

目录

Azure OpenAI设置

ASP.NET API设置

使用Angular构建前端聊天UI


该项目演示了如何使用AngularASP.NET APIAzure创建OpenAI聊天应用程序,强调Azure设置、OpenAI交互的API配置ASP.NET,以及为聊天界面构建响应式Angular前端,该界面具有消息顺序和区分用户和OpenAI响应等功能。

在这个项目中,我将向你展示如何使用AngularASP.NET APIAzure构建OpenAI聊天应用程序。

有关此项目的最新更新,请转到 DotNetLead的源文章

我们将介绍:

  • Azure上需要设置
  • ASP.NET API上所需的代码
  • Angular前端所需的代码

Azure OpenAI设置

第一件事是创建如下所示的Azure OpenAI资源。默认情况下,它是Azure中不可用的资源,必须申请访问权限。Microsoft审核你的请求(需要几天时间)后,你将能够创建Azure OpenAI资源。您可以申请访问这里

创建Azure OpenAI资源后,转到模型部署部分,选择要使用的OpenAI模型,如下所示,Azure将转到Azure AI Studio,还可以在其网站上测试聊天功能。

通过选择您喜欢的ChatGpt版本来创建部署,如下所示。在发布时,我选择了gpt-35-turbo

创建模型后,记下部署的名称,如下所示。您将需要用于构建API的部署名称。

返回到Azure OpenAI资源,记下生成API所需的EndPointKey,如下所示。在API中只需要1个密钥。

ASP.NET API设置

用于从Azure OpenAI获取聊天响应的代码如下所示。首先,创建OpenAIClient,然后创建ChatCompletionsOptions用于准备查询(即用户聊天输入),然后调用该GetChatCompletionsAsync方法以从Azure OpenAI获取响应。在控制器方法中,我们只返回来自OpenAI的响应内容。

  1. [HttpGet]
  2. public async Task<ChatMsg> GetResponse(string query)
  3. {
  4. OpenAIClient client = new OpenAIClient(
  5. new Uri(config["AzureEndPoint"]),
  6. new AzureKeyCredential(config["AzureKey"])
  7. );
  8. ChatCompletionsOptions option = new ChatCompletionsOptions { };
  9. option.Messages.Add(new ChatMessage(ChatRole.User, query));
  10. Response<ChatCompletions> response = await client.GetChatCompletionsAsync(
  11. config["DeploymentName"],
  12. option
  13. );
  14. return new ChatMsg { Message = response.Value.Choices[0].Message.Content };
  15. }

ReadMe.txt文件中所述,使用.NET机密管理器需要以下三个配置,以便配置不会存储在纯文本文件中。

  1. AzureEndPoint
  2. AzureKey
  3. DeploymentName

有关如何使用.NET Secret Manager的说明,请查看使用Secret Manager和Azure Key Vault保护ASP.NET Core配置

使用Angular构建前端聊天UI

构建聊天前端需要几个属性:

  1. 聊天窗口应保持静态。换句话说,它不应该因为聊天窗口内的内容而扩展或收缩,而应该停留在同一位置。当文本超过窗口空间时,它应该允许滚动。
  2. 聊天消息的显示顺序应从下到上,最新的用户输入或响应从最底部开始。

要使聊天窗口保持静态并允许在内容展开时滚动,请声明一个固定位置的flexbox容器(在下面的代码中显示为chat-container类),第一个flexbox项将只是另一个flexbox(在下面的代码中显示为messages类),它具有从下到上显示项的flex-direction作为column-reverseoverflow-y作为scroll用于垂直滚动,overflow-x作为hidden用于隐藏水平滚动。

用户输入和OpenAI响应需要以不同的方式显示,这可以通过声明两个不同的类来完成,即用于显示OpenAI响应的bot-message类和用于显示用户输入的user-message类。请注意,user-message类具有align-self作为flex-end,因此它与右侧对齐。

下面是HTML

  1. <div class="chat-container">
  2. <div class="messages">
  3. <div *ngFor="let msg of chatHistory"
  4. [ngClass]="{'user-message': msg.type == 1,
  5. 'bot-message': msg.type == 2}" >
  6. <p>{{msg.message}}</p>
  7. </div>
  8. </div>
  9. ...

下面是scss

  1. .chat-container {
  2. position: fixed;
  3. top: 4rem;
  4. bottom: 4rem;
  5. display: flex;
  6. flex-direction: column;
  7. width: 42rem;
  8. box-shadow: $shadow;
  9. .messages {
  10. flex: 1;
  11. display: flex;
  12. flex-direction: column-reverse; //default scroll to the bottom
  13. overflow-y: scroll;
  14. overflow-x: hidden; //hide bottom scroll bar
  15. padding: 1rem 1.5rem;
  16. .bot-message {
  17. display: flex;
  18. align-items: center;
  19. p {
  20. @include message-item($bot-color);
  21. }
  22. }
  23. .user-message {
  24. display: flex;
  25. align-items: center;
  26. align-self: flex-end; //move to the right
  27. p {
  28. @include message-item($user-color);
  29. }
  30. }
  31. }
  32. ...

每条消息的消息类型为1表示用户输入,2表示OpenAI响应,如上面的html所示。消息的定义如下所示:

  1. export enum MessageType {
  2. Send = 1,
  3. Receive = 2
  4. }
  5. export interface IChatMsg {
  6. type: MessageType,
  7. message: string
  8. }

以下是组件的代码:

  1. export class ChatComponent implements OnInit {
  2. frmQuery: FormGroup;
  3. chatHistory: IChatMsg[];
  4. constructor(private chatSvc: ChatService,
  5. private fb: FormBuilder) { }
  6. ngOnInit(): void {
  7. this.frmQuery = this.fb.group({
  8. txtQuery: [null]
  9. });
  10. this.chatSvc.chat(null)
  11. .subscribe(aa => this.chatHistory = aa);
  12. }
  13. submitQuery() {
  14. //ignore if no query given
  15. if (!this.frmQuery.get("txtQuery").value)
  16. return;
  17. let queryMessage: IChatMsg = {
  18. type: MessageType.Send,
  19. message: this.frmQuery.get("txtQuery").value
  20. };
  21. this.chatSvc.chat(queryMessage);
  22. //blank out textbox for next user input
  23. this.frmQuery.get("txtQuery").setValue(null);
  24. }
  25. }

接下来,我们需要在最底部显示最新消息,并将之前的消息向上推送。虽然CSS定义会从下到上显示消息,但消息的顺序是从上到下,需要颠倒过来。此外,对API的每次调用只是一个请求和一个响应,需要保留聊天的历史记录。这些问题可以通过声明一个数组来存储聊天历史记录来解决,并使用该reverse方法将聊天历史记录作为Observable。聊天服务的代码如下所示:

  1. export class ChatService {
  2. readonly url = this.appConfig.get('apiChat');
  3. private chatHistory = new BehaviorSubject<IChatMsg[] | null>(null);
  4. chatHistory$ = this.chatHistory.asObservable();
  5. //stores the chat history
  6. chatHistoryRecord : IChatMsg[] = [];
  7. constructor(private http:HttpClient,
  8. private appConfig:AppConfigService){}
  9. chat(queryMessage: IChatMsg): Observable<IChatMsg[]>{
  10. if (!queryMessage)
  11. return this.chatHistory$;
  12. this.chatHistoryRecord.push(queryMessage);
  13. this.chatHistory.next(this.chatHistoryRecord.slice().reverse());
  14. //get response
  15. let queryUrl = this.url + "?query=" + queryMessage.message;
  16. this.http.get<IChatMsg>(queryUrl).pipe()
  17. .subscribe(result=>{
  18. if (result){
  19. const receiveMsg : IChatMsg =
  20. { type: MessageType.Receive, message : result.message };
  21. this.chatHistoryRecord.push(receiveMsg);
  22. this.chatHistory.next(this.chatHistoryRecord.slice().reverse());
  23. }
  24. }
  25. )
  26. return this.chatHistory$;
  27. }
  28. }

仅此而已,希望您会发现这个项目有用。

本文最初发表于 Building OpenAI chat application with Angular, ASP .Net API, and Azure – .NET Lead

https://www.codeproject.com/Articles/5369946/Building-OpenAI-Chat-Application-with-Angular-ASP

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/738067
推荐阅读
相关标签
  

闽ICP备14008679号