Skip to content

Add tongyi-langchain solution with PAI-EAS and Qwen model #331

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions solution/tech-solution/tongyi-langchain/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
## Introduction

<!-- DOCS_DESCRIPTION_CN -->
本示例用于实现解决方案[通义千问和 LangChain 搭建对话服务](https://www.aliyun.com/solution/tech-solution/tongyi-langchain), 涉及到PAI-EAS实例(PAI-EAS)、专有网络(VPC)、交换机(VSwitch)、文件存储(NAS)等资源的创建。
<!-- DOCS_DESCRIPTION_CN -->

<!-- DOCS_DESCRIPTION_EN -->
This example is used to implement solution [Building a conversation service with Qwen and LangChain](https://www.aliyun.com/solution/tech-solution/tongyi-langchain), which involves the creation and deployment of resources such as PAI-EAS,Virtual Private Cloud (VPC), VSwitch, File Storage NAS(NAS).
<!-- DOCS_DESCRIPTION_EN -->
## Providers

| Name | Version |
|------|---------|
| <a name="provider_alicloud"></a> [alicloud](#provider\_alicloud) | n/a |
| <a name="provider_random"></a> [random](#provider\_random) | n/a |

## Modules

No modules.

## Resources

| Name | Type |
|------|------|
| [alicloud_nas_access_group.nas_access_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_access_group) | resource |
| [alicloud_nas_access_rule.nas_access_rule](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_access_rule) | resource |
| [alicloud_nas_file_system.nas_file_system](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_file_system) | resource |
| [alicloud_nas_mount_target.nas_mount_target](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/nas_mount_target) | resource |
| [alicloud_pai_service.pai_eas](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/pai_service) | resource |
| [alicloud_security_group.security_group](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group) | resource |
| [alicloud_security_group_rule.allow_http](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_security_group_rule.allow_https](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_security_group_rule.allow_rdp](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/security_group_rule) | resource |
| [alicloud_vpc.vpc](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vpc) | resource |
| [alicloud_vswitch.vswitch](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/resources/vswitch) | resource |
| [random_string.random_string](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |
| [alicloud_regions.current](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs/data-sources/regions) | data source |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| <a name="input_instance_type"></a> [instance\_type](#input\_instance\_type) | PAI-EAS实例规格 | `string` | `"ml.gu7i.c8m30.1-gu30"` | no |
| <a name="input_region"></a> [region](#input\_region) | 地域,例如:cn-hangzhou。所有地域及可用区请参见文档:https://help.aliyun.com/document_detail/40654.html#09f1dc16b0uke | `string` | `"cn-hangzhou"` | no |
| <a name="input_zone_id"></a> [zone\_id](#input\_zone\_id) | 可用区ID | `string` | `"cn-hangzhou-f"` | no |
<!-- END_TF_DOCS -->
136 changes: 136 additions & 0 deletions solution/tech-solution/tongyi-langchain/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
provider "alicloud" {
region = var.region
}

# 生成随机字符串
resource "random_string" "random_string" {
length = 8
special = false
upper = false
numeric = true
lower = true
}

# VPC
resource "alicloud_vpc" "vpc" {
cidr_block = "192.168.0.0/16"
vpc_name = "vpc_qwen_demo"
}

# VSwitch
resource "alicloud_vswitch" "vswitch" {
zone_id = var.zone_id
vpc_id = alicloud_vpc.vpc.id
cidr_block = "192.168.0.0/24"
vswitch_name = "vswitch_qwen_demo"
}

# 安全组
resource "alicloud_security_group" "security_group" {
vpc_id = alicloud_vpc.vpc.id
security_group_name = "sg_qwen_demo"
security_group_type = "normal"
}

# 安全组入站规则 - 80端口
resource "alicloud_security_group_rule" "allow_http" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "80/80"
priority = 1
security_group_id = alicloud_security_group.security_group.id
cidr_ip = "0.0.0.0/0"
}

# 安全组入站规则 - 443端口
resource "alicloud_security_group_rule" "allow_https" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "443/443"
priority = 1
security_group_id = alicloud_security_group.security_group.id
cidr_ip = "0.0.0.0/0"
}

# 安全组入站规则 - 3389端口
resource "alicloud_security_group_rule" "allow_rdp" {
type = "ingress"
ip_protocol = "tcp"
nic_type = "intranet"
policy = "accept"
port_range = "3389/3389"
priority = 1
security_group_id = alicloud_security_group.security_group.id
cidr_ip = "0.0.0.0/0"
}

# NAS文件系统
resource "alicloud_nas_file_system" "nas_file_system" {
protocol_type = "NFS"
file_system_type = "standard"
storage_type = "Performance"
zone_id = var.zone_id
description = "NAS文件系统用于Qwen和LangChain对话模型"
}

# NAS访问组
resource "alicloud_nas_access_group" "nas_access_group" {
access_group_type = "Vpc"
access_group_name = "nas-access-group-qwen-demo"
}

# NAS挂载点
resource "alicloud_nas_mount_target" "nas_mount_target" {
vpc_id = alicloud_vpc.vpc.id
vswitch_id = alicloud_vswitch.vswitch.id
network_type = "Vpc"
access_group_name = alicloud_nas_access_group.nas_access_group.access_group_name
file_system_id = alicloud_nas_file_system.nas_file_system.id

depends_on = [alicloud_nas_access_rule.nas_access_rule]
}

# NAS访问规则
resource "alicloud_nas_access_rule" "nas_access_rule" {
source_cidr_ip = "0.0.0.0/0"
access_group_name = alicloud_nas_access_group.nas_access_group.access_group_name
}

# PAI-EAS服务
resource "alicloud_pai_service" "pai_eas" {
service_config = jsonencode({
metadata = {
name = "qwen_demo_${random_string.random_string.result}"
instance = 1
enable_webservice = "true"
cpu = 8
gpu = 1
memory = 30000
}
cloud = {
computing = {
instance_type = var.instance_type
}
}
containers = [
{
image = "eas-registry-vpc.${data.alicloud_regions.current.regions.0.id}.cr.aliyuncs.com/pai-eas/chat-llm-webui:2.1"
script = "python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat"
port = 8000
}
]
})

timeouts {
create = "20m"
}
}

# 获取当前区域信息
data "alicloud_regions" "current" {
current = true
}
49 changes: 49 additions & 0 deletions solution/tech-solution/tongyi-langchain/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
output "vpc_id" {
description = "VPC ID"
value = alicloud_vpc.vpc.id
}

output "vswitch_id" {
description = "VSwitch ID"
value = alicloud_vswitch.vswitch.id
}

output "security_group_id" {
description = "安全组ID"
value = alicloud_security_group.security_group.id
}

output "nas_file_system_id" {
description = "NAS文件系统ID"
value = alicloud_nas_file_system.nas_file_system.id
}

output "nas_mount_target_domain" {
description = "NAS挂载点域名"
value = alicloud_nas_mount_target.nas_mount_target.mount_target_domain
}

output "pai_service_id" {
description = "PAI-EAS服务ID"
value = alicloud_pai_service.pai_eas.id
}

output "service_name" {
description = "PAI-EAS服务名称"
value = "qwen_demo_${random_string.random_string.result}"
}

output "service_status" {
description = "PAI-EAS服务状态"
value = alicloud_pai_service.pai_eas.status
}

output "create_time" {
description = "PAI-EAS服务创建时间"
value = alicloud_pai_service.pai_eas.create_time
}

output "region_id" {
description = "部署区域ID"
value = data.alicloud_regions.current.regions.0.id
}
30 changes: 30 additions & 0 deletions solution/tech-solution/tongyi-langchain/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
variable "region" {
type = string
default = "cn-hangzhou"
description = "地域,例如:cn-hangzhou。所有地域及可用区请参见文档:https://help.aliyun.com/document_detail/40654.html#09f1dc16b0uke"
}

variable "zone_id" {
type = string
description = "可用区ID"
default = "cn-hangzhou-f"
}

variable "instance_type" {
type = string
description = "PAI-EAS实例规格"
default = "ml.gu7i.c8m30.1-gu30"

validation {
condition = contains([
"ml.gu7i.c8m30.1-gu30",
"ecs.gn6e-c12g1.3xlarge",
"ecs.gn7i-c8g1.2xlarge",
"ecs.gn6i-c16g1.4xlarge",
"ecs.gn7i-c16g1.4xlarge",
"ecs.gn6i-c8g1.2xlarge",
"ecs.gn6i-c4g1.xlarge"
], var.instance_type)
error_message = "实例类型必须是以下之一:ml.gu7i.c8m30.1-gu30, ecs.gn6e-c12g1.3xlarge, ecs.gn7i-c8g1.2xlarge, ecs.gn6i-c16g1.4xlarge, ecs.gn6i-c8g1.2xlarge, ecs.gn6i-c4g1.xlarge"
}
}
Loading