連接語言大模型(LLM)服務進行對話
1. 引言
最近開始接觸AI大模型方向的工作,第一個實例就嘗試一下連接大模型進行對話的實現。
2. 實現
2.1 openai模塊
要實現這個功能很簡單,直接翻各大模型平臺的給的API案例一般都可以實現,例如筆者這里使用的阿里云的百煉平臺給出的API:
from openai import OpenAI
client = OpenAI(
# 使用大模型對應的Key
api_key = "sk-xxx",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
completion = client.chat.completions.create(
model="deepseek-r1", # 此處以 deepseek-r1 為例,可按需更換模型名稱。
messages=[
{'role': 'user', 'content': '想快速入門AI大模型,給我推薦一下具體的學習方案。'}
]
)
# 通過reasoning_content字段打印思考過程
print("思考過程:")
print(completion.choices[0].message.reasoning_content)
# 通過content字段打印最終答案
print("最終答案:")
print(completion.choices[0].message.content)
我這里使用的大模型是deepseek,但是使用的是openai模塊。這是因為現在的大模型服務基本都兼容OpenAI API標準的接口,因此可以通過設置不同的base_url和api_key來使用相同的openai Python客戶端庫進行訪問。這也是為啥現在大模型平臺都可以選擇接入不同的大模型來實現AI應用。
除了Python接口,阿里云百煉平臺還提供了Node.js和HTTP的接入方式,理論上可以前端、后端、移動端以及桌面端都可以連入大模型來實現自己的AI應用。messages=[{'role': 'user', 'content': '想快速入門AI大模型,給我推薦一下具體的學習方案。'}]就是大模型的提示詞,通過更改提示詞,可以與大模型對話來得到自己想要的結果。
2.2 LangChain
除了使用openai模塊,使用LangChain是個更好的選擇。LangChain是一個構建于大型語言模型(LLMs)之上的框架,提供了一系列的工具和接口來簡化與這些模型交互的過程。如下所示:
# 初始化模型
chat = ChatOpenAI(
model_name="deepseek-r1",
temperature=0,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", #服務地址
api_key="sk-xxx" #API密鑰
)
# 發送請求
response = chat.invoke([HumanMessage(content="請用中文介紹你自己。")])
# 輸出結果
print(response.content)
為什么說LangChain更好用一點呢,比如說你要執行批量任務,對一些文本進行多標簽分類,那么可能需要進行批量提問以提升效率。在這方面LangChain提供了batch接口:
from langchain_openai import ChatOpenAI
llm_client = ChatOpenAI(
temperature=0.0,
model_name="deepseek-r1",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-852da921b11545c99de697e584210fc7"
)
# 假設你的多標簽集合如下:
total_class = {"正面", "負面", "價格問題", "物流問題", "推薦", "外觀設計", "用戶體驗"}
# 系統提示詞
system_prompt = """你是一個多標簽分類助手,請從以下標簽中選出適用于文本的所有標簽(可以多選):
正面, 負面, 價格問題, 物流問題, 推薦, 外觀設計, 用戶體驗
只輸出標簽,多個標簽之間用英文逗號分隔。如果無法判斷,則返回空字符串。
"""
def llm_labeling(texts: list[str]) -> list[list[str]]:
"""
對輸入文本列表進行多標簽打標,返回每條文本對應的標簽列表。
"""
results = []
batch_inputs = [system_prompt + '\n' + t for t in texts]
res = llm_client.batch(batch_inputs)
for item in res:
content = item.content.strip()
if not content:
results.append([])
continue
# 解析逗號分隔標簽,清洗一下
tags = [t.strip() for t in content.split(',')]
# 只保留在 total_class 中的合法標簽
tags = [t for t in tags if t in total_class]
results.append(tags)
return results
texts = [
"這個產品非常好用,值得推薦",
"物流速度太慢了,體驗不好",
"外觀漂亮,使用方便,就是價格稍貴"
]
result = llm_labeling(texts)
for i, tags in enumerate(result):
print(f"第{i+1}條: 標簽 = {tags}")
運行結果如下:
第1條: 標簽 = ['正面', '推薦', '用戶體驗']
第2條: 標簽 = ['負面', '物流問題', '用戶體驗']
第3條: 標簽 = ['正面', '外觀設計', '用戶體驗', '價格問題']
其實deepseek不一定真的支持批量提問的接口,即使真的不支持,LangChain為我們提供了抽象層,在內部進行并發處理。當然,如果有的大模型提供batch接口,LangChain就會直接調用它。
2.3 其他
在阿里的百煉平臺上還提供了“多輪對話”和“流式輸出”的使用方式。這兩種方式是構建AI Chat應用必須的。“多輪對話”就是需要讓大模型記住之前的對話內容,也就是上下文,以便得到更好的輸出;“流式輸出”則是讓大模型的回答逐步漸進的輸出,一個字一個字的呈現,以便讓AI Chat應用的交互性更好。不過筆者暫時不關心這個,以后有機會再試用一下。

浙公網安備 33010602011771號