Реализация интеллектуального AI-ассистента с Jina Search, LangChain и Gemini для поиска информации в реальном времени

В этом руководстве мы покажем, как создать интеллектуального AI-ассистента, интегрировав инструменты LangChain, Gemini 2.0 Flash и Jina Search. Объединив возможности мощной большой языковой модели (LLM) с внешним поисковым API, мы создадим помощника, который сможет предоставлять актуальную информацию с указанием источников.

Установка необходимых пакетов

Мы устанавливаем необходимые пакеты Python для этого проекта. В их число входят:
* фреймворк LangChain для создания AI-приложений;
* инструменты LangChain Community (версия 0.2.16 или выше);
* интеграция LangChain с моделями Google Gemini.

Эти пакеты обеспечивают беспрепятственное использование моделей Gemini и внешних инструментов в конвейерах LangChain.

“`python
%pip install –quiet -U “langchain-community>=0.2.16” langchain langchain-google-genai
“`

Импортирование модулей

Мы включаем в проект основные модули. Getpass позволяет безопасно вводить ключи API, не отображая их на экране, а os помогает управлять переменными окружения и путями к файлам. JSON используется для работы со структурами данных JSON, а typing предоставляет подсказки типов для переменных, таких как словари и аргументы функций, обеспечивая лучшую читаемость и удобство сопровождения кода.

“`python
import getpass
import os
import json
from typing import Dict, Any
“`

Настройка ключей API

Мы убеждаемся, что необходимые ключи API для Jina и Google Gemini установлены как переменные окружения. Если ключи ещё не определены в окружении, скрипт предлагает пользователю ввести их, используя модуль getpass, для обеспечения безопасности.

“`python
if not os.environ.get(“JINAAPIKEY”):
os.environ[“JINAAPIKEY”] = getpass.getpass(“Enter your Jina API key: “)

if not os.environ.get(“GOOGLEAPIKEY”):
os.environ[“GOOGLEAPIKEY”] = getpass.getpass(“Enter your Google/Gemini API key: “)
“`

Настройка инструментов и модели

Мы импортируем ключевые модули и классы из экосистемы LangChain. В их число входят:
* инструмент JinaSearch для веб-поиска;
* модель ChatGoogleGenerativeAI для доступа к Google Gemini;
* классы ChatPromptTemplate, RunnableConfig и структуры сообщений (HumanMessage, AIMessage, ToolMessage).

Вместе эти компоненты обеспечивают интеграцию внешних инструментов с Gemini для динамического поиска информации с помощью ИИ.

“`python
from langchain_community.tools import JinaSearch
from langchaingooglegenai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig, chain
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
“`

Создание и инициализация инструментов

Мы инициализируем инструмент Jina Search, создав экземпляр JinaSearch(), и подтверждаем его готовность к использованию. Инструмент предназначен для обработки поисковых запросов в Интернете в рамках экосистемы LangChain.

“`python
search_tool = JinaSearch()
print(f” Jina Search tool initialized: {search_tool.name}”)

print(“\n Testing Jina Search directly:”)
directsearchresult = search_tool.invoke({“query”: “what is langgraph”})
print(f”Direct search result preview: {directsearchresult[:200]}…”)
“`

Инициализация модели Gemini

Мы инициализируем модель Gemini 2.0 Flash, используя класс ChatGoogleGenerativeAI из LangChain. Модель настроена с низкой температурой (0.1) для более детерминированных ответов, а параметр convertsystemmessagetohuman=True обеспечивает правильное преобразование системных сообщений в удобочитаемые для человека сообщения для API Gemini.

“`python
gemini_model = ChatGoogleGenerativeAI(
model=”gemini-2.0-flash”,
temperature=0.1,
convertsystemmessagetohuman=True
)
print(” Gemini model initialized”)
“`

Определение подробного запроса

Мы определяем шаблон запроса, используя ChatPromptTemplate.from_messages(), который определяет поведение ИИ. В него входят:
* системное сообщение, описывающее роль помощника;
* сообщение пользователя;
* заполнитель для сообщений инструментов.

Этот структурированный запрос обеспечивает предоставление ИИ полезных, информативных и хорошо обоснованных ответов при одновременном интегрировании результатов поиска в разговор.

“`python
detailedprompt = ChatPromptTemplate.frommessages([
(“system”, “””You are an intelligent assistant with access to web search capabilities.
When users ask questions, you can use the Jina search tool to find current information.

Instructions:
1. If the question requires recent or specific information, use the search tool
2. Provide comprehensive answers based on the search results
3. Always cite your sources when using search results
4. Be helpful and informative in your responses”””),
(“human”, “{user_input}”),
(“placeholder”, “{messages}”),
])
“`

Связывание инструментов с моделью Gemini

Мы связываем инструмент Jina Search с моделью Gemini, используя bind_tools(), что позволяет модели вызывать инструмент поиска при необходимости.

“`python
geminiwithtools = geminimodel.bindtools([search_tool])
print(” Tools bound to Gemini model”)
“`

Создание основной цепочки

Мы создаём основную цепочку, объединяя структурированный шаблон запроса и модель Gemini с инструментами, создавая непрерывный рабочий процесс для обработки пользовательских запросов и динамических вызовов инструментов.

“`python
mainchain = detailedprompt | geminiwithtools
“`

Определение функции для форматирования результатов работы инструмента

Мы определяем функцию formattoolresult(), которая форматирует результаты работы инструментов для лучшей читаемости.

“`python
def formattoolresult(toolcall: Dict[str, Any], toolresult: str) -> str:
“””Format tool results for better readability”””
return f”Search Results for ‘{toolcall[‘args’][‘query’]}’:\n{toolresult[:800]}…”
“`

Определение расширенной поисковой цепочки

Мы определяем расширенную поисковую цепочку, используя декоратор @chain из LangChain, что позволяет обрабатывать пользовательские запросы с динамическим использованием инструментов.

“`python
@chain
def enhancedsearchchain(user_input: str, config: RunnableConfig):
“””
Enhanced chain that handles tool calls and provides detailed responses
“””
print(f”\n Processing query: ‘{user_input}'”)

inputdata = {“userinput”: user_input}

print(” Sending to Gemini…”)
airesponse = mainchain.invoke(input_data, config=config)

if airesponse.toolcalls:
print(f” AI requested {len(airesponse.toolcalls)} tool call(s)”)

tool_messages = []
for i, toolcall in enumerate(airesponse.tool_calls):
print(f” Executing search {i+1}: {tool_call[‘args’][‘query’]}”)

toolresult = searchtool.invoke(tool_call)

tool_msg = ToolMessage(
content=tool_result,
toolcallid=tool_call[‘id’]
)
toolmessages.append(toolmsg)

print(” Getting final response with search results…”)
final_input = {
input_data,
“messages”: [airesponse] + toolmessages
}
finalresponse = mainchain.invoke(final_input, config=config)

return final_response
else:
print(” No tool calls needed”)
return ai_response
“`

Тестирование поисковой цепочки

Мы тестируем поисковую цепочку с различными запросами.

“`python
def testsearchchain():
“””Test the search chain with various queries”””

test_queries = [
“what is langgraph”,
“latest developments in AI for 2024”,
“how does langchain work with different LLMs”
]

print(“\n” + “=”*60)
print(” TESTING ENHANCED SEARCH CHAIN”)
print(“=”*60)

for i, query in enumerate(test_queries, 1):
print(f”\n Test {i}: {query}”)
print(“-” * 50)

try:
response = enhancedsearchchain.invoke(query)
print(f” Response: {response.content[:300]}…”)

if hasattr(response, ‘toolcalls’) and response.toolcalls:
print(f” Used {len(response.tool_calls)} tool call(s)”)

except Exception as e:
print(f” Error: {str(e)}”)

print(“-” * 50)
“`

Запуск демонстрационного режима

Наконец, мы запускаем демонстрационный режим, который сначала вызывает функцию testsearchchain() для проверки системы с помощью предопределённых запросов, а затем запускает интерактивный режим, позволяя пользователям задавать вопросы и получать ответы от ИИ, обогащённые динамическими результатами поиска.

“`python
if name == “main“:
print(“\n Starting enhanced LangChain + Gemini + Jina Search demo…”)
testsearchchain()

print(“\n” + “=”*60)
print(” INTERACTIVE MODE – Ask me anything! (type ‘quit’ to exit)”)
print(“=”*60)

while True:
user_query = input(“\n Your question: “).strip()
if user_query.lower() in [‘quit’, ‘exit’, ‘bye’]:
print(” Goodbye!”)
break

if user_query:
try:
response = enhancedsearchchain.invoke(user_query)
print(f”\n Response:\n{response.content}”)
except Exception as e:
print(f” Error: {str(e)}”)
“`

В заключение мы успешно создали усовершенствованного ИИ-ассистента, который использует модульную структуру LangChain, генеративные возможности Gemini 2.0 Flash и функцию реального времени Jina Search для поиска в Интернете. Этот гибридный подход демонстрирует, как ИИ-модели могут расширять свои знания за пределы статических данных, предоставляя пользователям своевременную и релевантную информацию из надёжных источников.

Источник

Оставьте комментарий