大模型联网Agent实现

环境:python3.9以上

# https://python.langchain.com/v0.2/docs/tutorials/agents/


# import getpass
import os
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
# from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import ModelScopeEmbeddings
# from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain.tools.retriever import create_retriever_tool
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import chat_agent_executor




""" 官网创建langsmith账号并创建 API key"""
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "qwertyuiop-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"
os.environ["TAVILY_API_KEY"] = "qwertyuiop-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"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
os.environ["TOGETHER_API_KEY"] = "qwertyuiop-34bfaf267dc3f1a3d5130f8949c14df7eb5770568739d05bfe398739ff83b783"
os.environ["TOKENIZERS_PARALLELISM"] = "False"



""" Define tools  two tools: Tavily (to search online) and then a retriever over a local index """


""" Tavily Tool """
# , verbose=True
search = TavilySearchResults(max_results=2, verbose=True)



# search.invoke("今天是2024年5月21日,中国哪个城市最国际化?")


"""Retriever Tool """
loader = WebBaseLoader("https://www.chinacdc.cn/jkzt/crb/jl/sy/zstd_10917/201911/t20191113_206794.html")
docs = loader.load()
documents = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20).split_documents(docs)
# vector = FAISS.from_documents(documents, OpenAIEmbeddings())  需要`OPENAI_API_KEY`
vector = FAISS.from_documents(documents, ModelScopeEmbeddings(model_id="damo/nlp_corom_sentence-embedding_english-base"))
retriever = vector.as_retriever()

print(retriever.invoke("鼠疫的传播途径?")[0])
# print(retriever.invoke("what is langsmith?")[0])

""" 转换为工具  create_retriever_tool """
retriever_tool = create_retriever_tool(
    retriever,
    "faiss_search",
    "search for information about langsmith, for any questions about langsmith, you must use this tool"
                                       )
# Now that we have created both, we can create a list of tools that we will use downstream.
tools = [search, retriever_tool]

""" Using Language Models """
model = ChatOpenAI(
    base_url="https://api.together.xyz/v1",
    api_key=os.environ["TOGETHER_API_KEY"],
    model="mistralai/Mixtral-8x7B-Instruct-v0.1",)

# You can call the language model by passing in a list of messages. By default, the response is a content string.
# response = model.invoke([HumanMessage(content="hi, who are you ?")])
# print(response.content)

# We can now see what it is like to enable this model to do tool calling. In order to enable that we use .bind_tools to give the language model knowledge of these tools
model_with_tools = model.bind_tools(tools)

# response2 = model_with_tools.invoke([HumanMessage(content="hi")])
# print(f"content: {response2.content}")
# print(f"tool calls: {response2.tool_calls}")

# Now, let's try calling it with some input that would expect a tool to be called.
# response = model_with_tools.invoke([HumanMessage(content="what is the weather in your shanghai?")])
# print(f"content: {response.content}")
# print(f"tool calls: {response.tool_calls}")


""" Create the agent """
agent_executor = chat_agent_executor.create_tool_calling_executor(model, tools)

""" Run the agent """
response = agent_executor.invoke({"messages": [HumanMessage(content="hi! 中国上海这个城市怎么样?")]})

print(response["messages"])



console

(py39) wangyp@ubuntu:~$ python /home/wangyp/Big_Model/big_AI/langchain_agent.py
2024-05-23 10:17:20,787 - modelscope - INFO - PyTorch version 2.3.0 Found.
2024-05-23 10:17:20,787 - modelscope - INFO - Loading ast index from /home/wangyp/.cache/modelscope/ast_indexer
2024-05-23 10:17:20,818 - modelscope - INFO - Loading done! Current index file version is 1.14.0, with md5 55d1161df5209b45fff81b0e52922dac and a total number of 976 components indexed
2024-05-23 10:17:22,431 - modelscope - WARNING - Model revision not specified, use revision: v1.0.0
2024-05-23 10:17:22,655 - modelscope - INFO - initiate model from /home/wangyp/.cache/modelscope/hub/damo/nlp_corom_sentence-embedding_english-base
2024-05-23 10:17:22,655 - modelscope - INFO - initiate model from location /home/wangyp/.cache/modelscope/hub/damo/nlp_corom_sentence-embedding_english-base.
2024-05-23 10:17:22,656 - modelscope - INFO - initialize model from /ho
<think>好的,我现在需要帮助用户实现一个Agent联网搜索工具的技术方案和架构设计。首先,我得理解用户的需求。用户希望Agent能够联网搜索,可能类似于RAG(检索增强生成)中的搜索功能,但具体是让Agent主动调用网络搜索工具来获取实时信息。根据用户提供的引用内容,特别是引用[1]中提到AI Agent调用rag_search工具,这可能涉及到RAG集成,但用户明确说“联网搜索”,所以可能需要直接访问互联网资源,而不仅仅是内部知识库。 接下来,我需要考虑技术方案的关键组成部分。通常,一个联网搜索的Agent需要几个模块:请求解析、网络搜索接口、结果处理、安全控制、数据缓存和响应生成。用户提到的引用[2]中提到了多Agent系统的连接方式,比如监督者架构,这可能影响整体设计,比如是否有一个监督者Agent来协调搜索请求。 请求解析模块需要将用户的自然语言查询转换为结构化的搜索参数,比如关键词、过滤条件等。可能需要用到NLP模型,如BERT或GPT,来提取关键信息。然后,网络搜索接口部分,这里可以使用现有的搜索引擎API,比如Google Custom Search API、Bing API,或者开源的解决方案如SerpApi。此外,考虑到引用[3]提到的工具和资源,可能需要集成这些API到Agent的工具集中。 结果处理模块需要处理返回的搜索结果,可能包括去重、排序、摘要生成等。这里可能需要用到文本处理技术,比如TF-IDF或Embedding模型来计算相似性,过滤掉重复内容。同时,摘要生成可以用像BART或T5这样的模型来提炼内容。 安全控制很重要,特别是联网搜索可能涉及敏感内容或防止恶意请求。需要实现权限验证、内容过滤(如使用敏感词库或机器学习模型检测不当内容),以及速率限制防止滥用。引用[2]中的监督者架构可能在这里发挥作用,监督者Agent可以管理权限和调用频率。 缓存和存储模块能提升效率,减少重复请求。可以使用Redis或Memcached做缓存,存储模块可能需要数据库来记录日志或用户历史,方便后续分析和优化。 响应生成模块需要将处理后的搜索结果整合成自然语言回复。可能需要模板填充或使用LLM(如GPT)生成连贯的回答,同时引用来源以增强可信度,如引用[1]中的格式。 架构设计方面,用户可能希望模块化设计,便于扩展和维护。引用[2]提到的多Agent连接方式,比如网络或监督者模式,这里可能采用监督者架构,让主Agent处理用户请求,调用搜索工具Agent,然后由结果处理Agent加工数据,最后生成响应。这样的分层结构有助于职责分离,提高系统的可维护性。 技术栈选择方面,Python适合快速开发,搭配FastAPI或Flask构建API。异步框架如aiohttp能提升并发性能。搜索引擎API的选择取决于预算和需求,开源方案可能需要自己维护爬虫,但更灵活。机器学习框架如HuggingFace Transformers可以处理NLP任务,向量数据库如Milvus或FAISS用于相似性去重。 在实现步骤上,首先需要明确需求,比如支持的搜索类型、结果数量限制等。然后设计数据流,从用户输入到最终输出的每个环节。开发核心模块时,先实现搜索接口,再逐步添加处理和安全功能。集成测试确保各模块协同工作,最后部署并监控性能,持续优化。 可能的问题包括如何处理实时搜索的延迟,确保API的稳定性,以及管理大量请求时的性能问题。此外,结果的质量和准确性也需要考虑,可能需要结合多个数据源或验证机制。引用[3]提到的学习资源可能提供更多工具和最佳实践,帮助优化这些方面。 最后,生成相关问题时要覆盖技术选型、架构优化、安全措施、性能提升和应用场景,帮助用户进一步深入探讨。</think>### 如何实现Agent联网搜索工具的技术方案与架构设计 #### 一、核心架构设计 Agent联网搜索工具的核心是通过**工具调用机制**与外部搜索引擎或API交互,实现动态信息检索。以下是基于多Agent系统的典型架构设计(参考[^2]): 1. **模块化分层架构** ```mermaid graph TD 用户请求 --> 主Agent(主Agent) 主Agent -->|工具调用| 搜索工具Agent(搜索工具Agent) 搜索工具Agent -->|API请求| 搜索引擎(Google/Bing/SerpAPI) 搜索引擎 -->|JSON数据| 结果处理Agent(结果处理Agent) 结果处理Agent --> 主AgentAgent --> 用户响应 ``` 2. **关键组件** - **请求解析器**:将自然语言查询转换为结构化搜索参数(如`query="AI Agent技术趋势", lang="zh-CN", num=5`) - **网络接口层**:封装主流搜索引擎API(如Google Custom Search、Bing API) - **结果处理器**:实现去重、排序、摘要生成(例如使用`BERT`模型提取关键句) - **安全控制模块**:包含权限验证、敏感词过滤、速率限制(如`10次/分钟`) #### 二、技术实现方案 1. **搜索工具封装(Python示例)** ```python from serpapi import GoogleSearch class WebSearchTool: def __init__(self, api_key): self.api_key = api_key # 通过环境变量注入密钥 def search(self, query: str, num=3) -> list: params = { "q": query, "api_key": self.api_key, "num": num } result = GoogleSearch(params).get_dict() return self._clean_results(result["organic_results"]) def _clean_results(self, raw_data): # 实现结果清洗逻辑(示例) return [{ "title": item.get("title"), "url": item.get("link"), "snippet": item.get("snippet")[:200] + "..." } for item in raw_data] ``` 2. **Agent集成流程** - **步骤1**:主Agent接收用户查询`"2024年AI Agent最新技术"` - **步骤2**:通过工具调用接口触发`WebSearchTool.search(query="AI Agent技术趋势 2024", num=5)` - **步骤3**:使用混合排序算法(结合关键词匹配度$score=0.7*TF-IDF + 0.3*PageRank$)筛选结果 - **步骤4**:生成自然语言响应,包含来源标注(例:"根据Google搜索结果[1][2]显示,2024年...") #### 三、关键优化技术 1. **缓存机制** - 使用`Redis`缓存高频查询结果(TTL=1小时) - 布隆过滤器防止重复请求(误判率<0.1%) 2. **异步处理** ```python import aiohttp async def async_search(query): async with aiohttp.ClientSession() as session: async with session.get(f"https://api.serpapi.com/search?q={query}") as resp: return await resp.json() ``` 3. **安全防护** - 输入验证:正则过滤`^[a-zA-Z0-9\u4e00-\u9fa5\s\-]{5,50}$` - 敏感词检测:AC自动机算法匹配敏感词库 - 流量控制:令牌桶算法限制请求频率 #### 四、部署架构建议 ``` +-----------------+ | Load Balancer | +-------+---------+ | +---------------+---------------+ | | +-------v-------+ +---------v-------+ | API Gateway | | API Gateway | +-------+-------+ +--------+--------+ | | +-------v-------+ +---------v-------+ | Search Agent | | Processing Agent| +-------+-------+ +--------+--------+ | | +-------v-------+ +---------v-------+ | Cache Layer | | ML Model | | (Redis) | | (HuggingFace) | +---------------+ +-----------------+ ``` #### 五、实现步骤 1. 需求分析:明确搜索范围(全网/限定站点)、结果格式(文本/结构化数据) 2. 技术选型:选择搜索引擎API(成本对比:Google Custom Search $5/1000次 vs SerpAPI $50/5000次) 3. 开发验证:实现最小原型(如仅处理10种查询类型) 4. 压力测试:模拟1000并发请求,优化响应时间(目标<800ms) 5. 部署上线:使用Docker容器化部署,Kubernetes自动扩缩容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值