首页 > 教程攻略 > ai资讯 >千问怎么结合LangChain搭建AI应用?LangChain集成开发实战指南

千问怎么结合LangChain搭建AI应用?LangChain集成开发实战指南

来源:互联网 时间:2026-06-05 12:51:03

要把通义千问这样的大模型接入业务系统,光有API权限还不够,关键还在于如何把它“装进”一个可维护、可扩展的应用框架里。LangChain就是干这个的——它提供了一套标准化的封装和编排工具,让开发者能像搭积木一样,把模型能力、记忆机制、知识检索和工具调用组合起来。下面直接拆解五个核心步骤,从环境搭建到流式响应,一步步讲清楚。

一、动工前的准备工作:API密钥和运行环境

LangChain本身不提供模型服务,它只是一个调度层。所以第一步,得先把通义千问的访问凭证配置好,同时安装对应的社区集成模块。这两件事缺一不可,否则不是初始化报错就是401认证失败。

核心依赖安装命令:

pip install langchain langchain-community dashscope

接着去阿里云百炼控制台的「API密钥管理」里创建新密钥,把那个字符串复制下来。生产环境推荐用环境变量配置:

export DASHSCOPE_API_KEY="sk-xxx"

配置完可以用一段简单的Python脚本验证:llm.invoke("测试"),能返回非空字符串就算搞定。

二、选对模型接口:Tongyi vs ChatTongyi

LangChain把通义千问封装成了两类接口。一个是面向单轮文本生成的

Tongyi

类,输入输出都是纯字符串;另一个是支持多轮消息交互的

ChatTongyi

类,得传HumanMessage、SystemMessage这些消息对象。虽然底层调的是同一个API,但输入格式、历史管理和流式响应的处理方式差异很大。

文本生成模型初始化:

from langchain_community.llms import Tongyi
llm = Tongyi(dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"), model="qwen-max")

聊天模型初始化:

from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.messages import HumanMessage, SystemMessage
chat_model = ChatTongyi(model="qwen3-turbo", temperature=0.5)

这里有个容易踩的坑:

Tongyi只接收字符串,ChatTongyi必须传消息对象列表

,混用会导致参数解析错误。

三、让对话记住上下文:Memory模块

默认情况下,每次调用模型都是独立的,模型没有“记忆”。要实现“用户先问旗舰产品是什么,接着问它有什么优势时能自动理解指代”,就必须引入Memory模块来持久化对话上下文。在多种内存策略里,

ConversationBufferMemory

在中文语境下表现最稳。

初始化内存组件:

from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

然后构造带记忆的链:

from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一家科技公司的AI助手,请用中文专业回答。"),
    ("human", "{input}")
])
chain = LLMChain(llm=chat_model, prompt=prompt, memory=memory)

执行连续问答时,模型就能准确衔接前后文了:

chain.invoke({"input": "我们的旗舰产品是什么?"})
chain.invoke({"input": "它有什么优势?"})

必须记住的一点:

memory.return_messages必须设为True

,否则ChatTongyi解析历史消息时会报错。

四、知识增强:把企业文档接入模型

当用户提问超出预设提示词范围时,需要从企业文档库中检索相关片段作为上下文。LangChain通过Embeddings + VectorStore双模块实现,而通义千问的text-embedding-v3向量模型可以直接替代OpenAIEmbeddings。

初始化向量模型:

from langchain_community.embeddings import DashScopeEmbeddings
embeddings = DashScopeEmbeddings(model="text-embedding-v3")

加载本地PDF并切分文本:

from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("product_manual.pdf")
docs = loader.load_and_split()

构建向量索引:

from langchain_community.vectorstores import FAISS
vectorstore = FAISS.from_documents(docs, embeddings)

绑定检索器后形成问答链:

retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=retriever)

这里有个中文分词的兼容问题:

DashScopeEmbeddings初始化时需添加参数chunk_size=500

,否则长文本可能被截断导致检索不完整。

五、流式响应与链路追踪

面向终端用户的AI应用,流式输出几乎是标配——打字机效果能大幅提升交互体验。同时,完整记录调用链对问题回溯也很关键。LangChain原生支持stream方法,并通过LangSmith自动捕获所有中间步骤。

流式输出(仅限ChatTongyi):

messages = [HumanMessage(content="请解释Transformer架构")]
for chunk in chat_model.stream(messages):
    print(chunk.content, end="", flush=True)

开启LangSmith追踪:

import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGCHAIN_API_KEY"] = "lsk-xxx"
os.environ["LANGCHAIN_PROJECT"] = "qwen-production"

最后再提醒一下:

流式调用只对ChatTongyi有效

,如果用Tongyi类调用.stream(),会直接抛出AttributeError。