LangChain框架本身没有专门针对国内环境"自带"或"预集成"的搜索工具。因此,你通常需要自己接入国内的搜索服务。下表汇总了几个可行的方案:
| 方案/工具 | 类型 | 说明与特点 |
|---|---|---|
| 百度AI搜索 | 国内搜索API | 通过千帆平台提供,有免费额度。需申请API Key,并在LangChain中封装成自定义工具使用。 |
| 自建 SearxNG | 元搜索引擎 | 开源、可自部署的隐私友好型搜索引擎。部署后,在LangChain中可通过 SearxNG Search 工具配置使用。 |
| 阿里达摩院模型 (如GTE) | 语义检索模型 | 非网络搜索,用于对本地文档进行语义检索 (例如构建知识库)。可通过 HuggingFaceEmbeddings 等接口集成。 |
🔧 如何接入百度AI搜索
如果你需要直接搜索国内的公开网络信息,百度AI搜索是一个可行的选择。具体接入步骤如下:
-
获取API密钥
- 访问百度智能云"千帆AppBuilder"平台,申请开通"百度AI搜索"服务并获取API Key。
-
在LangChain中封装成自定义工具
- LangChain没有内置此工具,需要你根据其接口自定义一个
Tool。核心是调用百度提供的接口,示例代码如下:
pythonimport requests from langchain_core.tools import tool @tool def baidu_search_tool(query: str) -> str: """使用百度AI搜索进行联网搜索。输入应为搜索关键词。""" url = 'https://qianfan.baidubce.com/v2/ai_search' headers = { 'Authorization': f'Bearer {你的API_KEY}', 'Content-Type': 'application/json' } data = { "messages": [{"content": query, "role": "user"}], "search_source": "baidu_search_v2", # 可自定义参数,如时效性过滤 "search_recency_filter": "month" } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: # 将API返回的JSON结果处理成字符串返回 return str(response.json()) else: raise Exception(f"搜索请求失败: {response.status_code}") - LangChain没有内置此工具,需要你根据其接口自定义一个
-
将工具赋予智能体 (Agent) 使用
- 将上述定义好的
baidu_search_tool加入工具列表,然后初始化你的智能体即可。
- 将上述定义好的
python
# 1. 安装必要库 (在终端中运行)
# pip install langchain langchain-openai langchain-community requests
# 1. 安装必要库 (在终端中运行)
# pip install langchain langchain-openai langchain-community requests
# 2. 导入库并设置API密钥
import os
from langchain_openai import ChatOpenAI # 注意:虽然导入名为ChatOpenAI,但可以兼容DeepSeek
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
import requests
import json
# === 配置你的API密钥 ===
# 注意:这里使用DeepSeek的API密钥,不是OpenAI的
# === 配置你的API密钥 ===
os.environ["BAIDU_API_KEY"] = "你的百度千帆API Key" # 从百度智能云控制台获取
os.environ["OPENAI_API_KEY"] = "你的DeepSeek API Key" # 或其他兼容API(如DeepSeek、Ollama本地模型)
# 3. 定义百度AI搜索工具(保持不变)
@tool
def baidu_ai_search(query: str, recency: str = "day") -> str:
"""
使用百度AI搜索API获取最新的网络信息。当你需要查询实时、准确的事实性信息时使用此工具。
Args:
query: 搜索查询关键词,应清晰具体。
recency: 时间过滤,可选:'day'(24小时内)、'week'、'month'、'year'。
Returns:
整理后的搜索结果字符串。
"""
try:
# 百度AI搜索API端点(千帆平台)
url = "https://qianfan.baidubce.com/v2/ai_search"
headers = {
"Authorization": f"Bearer {os.getenv('BAIDU_API_KEY')}",
"Content-Type": "application/json"
}
# 构建请求体,可根据需要调整参数
data = {
"messages": [{"role": "user", "content": query}],
"search_source": "baidu_search_v2",
"search_recency_filter": recency,
"search_domain_filter": "normal" # 可选:'normal'(通用)、'news'(新闻)、'academic'(学术)
}
response = requests.post(url, headers=headers, json=data, timeout=10)
if response.status_code == 200:
result = response.json()
# 解析百度API返回的JSON结构
if "answer" in result:
# 提取结构化答案
answer = result.get("answer", "")
# 提取搜索摘要和参考来源
references = []
if "search_results" in result:
for item in result["search_results"][:3]: # 取前3条结果
ref = {
"title": item.get("title", ""),
"url": item.get("url", ""),
"snippet": item.get("snippet", "")[:150] # 截取片段
}
references.append(ref)
# 格式化输出
formatted_result = f"【搜索结果】\n{answer}\n\n【参考来源】"
for i, ref in enumerate(references, 1):
formatted_result += f"\n{i}. {ref['title']}\n 摘要:{ref['snippet']}...\n 链接:{ref['url']}"
return formatted_result
else:
return f"搜索成功,但返回格式异常:{json.dumps(result, ensure_ascii=False)[:500]}"
else:
return f"搜索请求失败,状态码:{response.status_code},错误信息:{response.text}"
except Exception as e:
return f"搜索过程中发生异常:{str(e)}"
# 4. 创建LangChain智能体(修改LLM配置部分)
def create_search_agent():
# 初始化LLM - 使用DeepSeek V3模型
# DeepSeek V3模型名称:deepseek-chat (或 deepseek-reasoner 用于复杂推理)
# DeepSeek V3 API端点:https://api.deepseek.com/v1
llm = ChatOpenAI(
model="deepseek-chat", # 使用DeepSeek V3聊天模型
temperature=0.1, # 较低的温度使回答更确定
api_key=os.getenv("DEEPSEEK_API_KEY"), # DeepSeek API密钥
base_url="https://api.deepseek.com", # DeepSeek API端点
max_tokens=4096, # DeepSeek支持长上下文
)
# 工具列表(可扩展添加其他工具)
tools = [baidu_ai_search]
# 智能体提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的AI助手,可以访问百度搜索工具来获取最新信息。
如果用户的问题涉及实时信息、不确定的事实或需要最新数据,请使用搜索工具。
回答时应基于搜索到的信息,并注明来源。
注意:你使用的是DeepSeek模型,请充分发挥你的能力。"""),
MessagesPlaceholder(variable_name="chat_history"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
# 创建智能体
agent = create_tool_calling_agent(
llm=llm,
tools=tools,
prompt=prompt
)
# 创建执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 设置为True可查看详细思考过程
handle_parsing_errors=True, # 处理解析错误
max_iterations=3, # 限制最大迭代次数,防止无限循环
)
return agent_executor
# 5. 添加健康检查函数(可选但推荐)
def check_api_health():
"""检查API连接是否正常"""
print("正在检查API连接状态...")
# 检查DeepSeek API
try:
from langchain_openai import ChatOpenAI
test_llm = ChatOpenAI(
model="deepseek-chat",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1",
max_tokens=50
)
test_response = test_llm.invoke("简单回复'连接正常'即可")
print(f"✓ DeepSeek API连接正常: {test_response.content}")
except Exception as e:
print(f"✗ DeepSeek API连接失败: {str(e)}")
# 检查百度API
try:
test_search = baidu_ai_search.invoke("测试连接")
print(f"✓ 百度API连接正常")
except Exception as e:
print(f"✗ 百度API连接失败: {str(e)}")
print("-" * 50)
# 6. 主程序:使用智能体
def main():
print("=== LangChain + DeepSeek V3 + 百度AI搜索智能体 ===")
print("初始化智能体...")
# 先进行健康检查
check_api_health()
# 创建智能体
agent = create_search_agent()
# 示例查询(可替换为你的问题)
test_queries = [
"今天中国航天有什么最新发射消息?",
"2024年新能源汽车销量排名前五的品牌是哪些?",
"解释一下什么是Sora视频生成模型",
]
for query in test_queries:
print(f"\n{'='*50}")
print(f"用户提问: {query}")
print(f"{'='*50}")
try:
# 执行查询
response = agent.invoke({"input": query, "chat_history": []})
print(f"\n助手回答:\n{response['output']}")
except Exception as e:
print(f"执行出错: {str(e)}")
# 7. 交互式模式
def interactive_mode():
"""交互式对话模式"""
print("=== 交互模式 (DeepSeek V3) ===")
print("输入 '退出' 或 'quit' 结束对话")
# 先检查API
check_api_health()
agent = create_search_agent()
chat_history = []
while True:
user_input = input("\n你: ").strip()
if user_input.lower() in ["退出", "quit", "exit", "q"]:
print("再见!")
break
if not user_input:
continue
try:
result = agent.invoke({
"input": user_input,
"chat_history": chat_history
})
print(f"\n助手: {result['output']}")
chat_history.append(("human", user_input))
chat_history.append(("ai", result['output']))
except Exception as e:
print(f"出错: {str(e)}")
if __name__ == "__main__":
# 运行示例测试
# main()
# 或运行交互模式
interactive_mode()